如何仅从文件中的URL中去除&符号?
我有一个文件,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安装上完成此操作?只要它有效,使用什么特定的工具/语言来实现结果并不重要。
如果你感到幸福安装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。就你而言,这可能是事实,但我还没有被说服。
一种途径是使用具有XML包的工具/语言。该程序包将支持以编程方式轻松访问锚点元素的href属性。所以,你可能有这样的:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane (url)
}
我敢肯定,几乎所有的语言级别的工具都有这方面的软件包。如果你愿意接受像语言这样的沉重工具,这对你来说很容易。如果你只是想要更低级别的Linux工具,这超出了我的专业知识。
你可以很容易地使用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>
如果你有决心使用一个简单的命令行正则表达式的工具,你知道你的网址是好的,那&符号在文中一贯使用,你可以尝试这样的:
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
这假设该URL没有与&符号相邻的空格,并且URL中的&符号总是被空格包围。所以这绝不是健壮的,但它可能比安装美味汤更简单,如果你只需要一次,并且你的html是可预测的。
只是为了完整起见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克里斯