2011-09-30 45 views
1

我有一個文件,index.html,包含數據是這樣的:如何僅從文件中的URL中去除&符號?

<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

我需要從網址剝離&符號,使得"/bbq-spareribs-&-sauce-eat-lean-&-fat.html"變得"/bbq-spareribs--sauce-eat-lean--fat.html"。但是,我不希望從文件的非URL部分(如鏈接文本bbq spareribs & sauce (eat lean & fat))中刪除&符號。

我該如何在標準的Linux安裝上完成此操作?只要它有效,使用什麼特定的工具/語言來實現結果並不重要。

回答

2

如果你感到幸福安裝BeautifulSoup,這個簡單的Python腳本可以做你想做的:

#!/usr/bin/evn python 
import sys 
from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(sys.stdin.read()) 
for a in soup.findAll("a"): 
    a["href"] = a["href"].replace("&", "") 

print soup 

用法示例:

[[email protected]]$ cat your.html | python amp_remover.py 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

注意: S因爲我們正在基於它的解析表示重新生成輸出HTML,所以格式可能會改變。其他可能的更改包括如果標記格式不正確,則顯式關閉標記。

我可能是錯的,但我懷疑大多數使用正確的XML/HTML解析器的解決方案都會導致類似的問題。要保持文件完全一樣,只刪除違規字符,您將不得不使用基於正則表達式的搜索和刪除/替換。除了真正微不足道的模式外,很多人都會使用advice against parsing XML/HTML with regex。就你而言,這可能是事實,但我還沒有被說服。

0

一種途徑是使用具有XML包的工具/語言。該程序包將支持以編程方式輕鬆訪問錨點元素的href屬性。所以,你可能有這樣的:

aElements = doc.getElement('a') 

foreach aElement in aElements { 
string url = a.getHref() 
removeAmpersane (url) 
} 

我敢肯定,幾乎所有的語言級別的工具都有這方面的軟件包。如果你願意接受像語言這樣的沉重工具,這對你來說很容易。如果你只是想要更低級別的Linux工具,這超出了我的專業知識。

0

你可以很容易地使用JavaScript這樣的:

<head> 

<script type="text/javascript"> 
    document.onload = (function (ev) { 
    var links = document.getElementsByTagName('a'); 
    for (var i = 0; i < links.length; i++) { 
     var href = links[i].href.replace(/(&)/, ''); 
     console.log(links[i]); 
    } 
    }); 
</script> 

</head> 
2

如果你有決心使用一個簡單的命令行正則表達式的工具,你知道你的網址是好的,那&符號在文中一貫使用,你可以嘗試這樣的:

$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html 

這假設該URL沒有與&符號相鄰的空格,並且URL中的&符號總是被空格包圍。所以這絕不是健壯的,但它可能比安裝美味湯更簡單,如果你只需要一次,並且你的html是可預測的。

1

只是爲了完整起見awk解決方案。它應該足夠穩定,可以用於簡單的任務 。

文件:

$ cat file 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

輸出:

$ awk 'BEGIN{FS=OFS=">"}{for (i=1;i<=NF;i++){if ($i ~ "a href")gsub(/\&/,"",$i)}}1' file 
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li> 
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li> 
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li> 

HTH克里斯

相關問題