我有一个文件index.html
,其中包含以下数据:
<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>
我需要去除&amp;来自网址的符号,以使"/bbq-spareribs-&-sauce-eat-lean-&-fat.html"
变为"/bbq-spareribs--sauce-eat-lean--fat.html"
。但是,我不想删除&amp;来自文件中非URL的部分的符号,例如链接的文本bbq spareribs & sauce (eat lean & fat)
。
如何在标准Linux安装上完成此操作?对我来说无关紧要的是使用什么特定的工具/语言来实现结果。
答案 0 :(得分: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
使用示例:
[me@home]$ 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>
警告:由于我们根据解析后的表示重新生成输出HTML,因此格式可能会发生变化。其他可能的更改包括如果标记格式不正确,则显式关闭标记。
我可能错了,但我怀疑大多数使用正确的XML / HTML解析器的解决方案都会导致类似的问题。要完全保持文件的原样,只删除有问题的字符,您必须最终使用基于正则表达式的搜索并删除/替换。除了非常琐碎的模式之外,许多人都会advice against parsing XML/HTML with regex。在你的情况下,这可能是真的,但我还没有被说服。
答案 1 :(得分:2)
如果你决定使用一个简单的命令行正则表达式工具,并且你知道你的网址很好,并且在文本中一直使用&符号,你可以尝试类似:
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
这假设URL没有与&符号相邻的空格,并且不在URL中的&符号总是被空格包围。所以这绝不是强大的,但是如果你只需要一次就可以比安装Beautiful Soup更简单,并且你的html是可预测的。
答案 2 :(得分: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 Chris
答案 3 :(得分:0)
一种方法是使用具有XML包的工具/语言。该包将支持以编程方式轻松访问anchor元素的href属性。所以,你可能有类似的东西:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane ( url )
}
我确信几乎所有语言级工具都有此包。如果您对语言这样繁重的工具持开放态度,这对您来说很容易。如果你只是想要低级别的linux工具,这超出了我的专业知识。
答案 4 :(得分: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>