2011-09-30 26 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克里斯

相关问题