曲径通幽论坛

标题: 如何提取一段HTML源码中的所有网址 [打印本页]

作者: beyes    时间: 2012-1-5 13:12
标题: 如何提取一段HTML源码中的所有网址
有时你可能想获取整个页面中所有的文章网址,但这些网址写在整的一段中,这会给提取带来些许的难度。此时过滤掉相应的 HTML 符号就显得比较重要。比如下面这段源码(保存在名为 urllist.txt 的一个文件中):
<a href="http://food.groad.net/a/201212/1873068.html">糯米红枣薏米粥可治神经衰弱</a></li><li class="date">2012-1-2</li><li><a href="http://food.goad.net/a/201211/1872179.html">常吃深绿叶菜延缓大脑衰老</a></li><li class="date">2012-1-1</li><li><a href="http://food.39.net/a/20111228/1871404.html">冬季养生:常吃6类“抗感菜”提高免疫力</a></li><li class="date">2011-12-28</li><li>
上面只列出了前面的一部分,后面略去了类似的构成内容。

可以先观察这些内容的构成,规律是每个标题对应着一个网址,中间还夹杂着一些 html 标签,而这些标签往往阻碍了我们的视线并影响提取,所以第一步可以先考虑去掉一些标签,当视野变得清晰时再考虑下一步的过滤,比如:
cat urlist.txt |sed 's/<a href="//g'
这么做之后,上面的内容就会剩下:
http://food.groad.net/a/201212/1873068.html">糯米红枣薏米粥可治神经衰弱</a></li><li class="date">2012-1-2</li><li><a href="http://food.goad.net/a/201211/1872179.html">常吃深绿叶菜延缓大脑衰老</a></li><li class="date">2012-1-1</li><li>http://food.39.net/a/20111228/1871404.html">冬季养生:常吃6类“抗感菜”提高免疫力</a></li><li class="date">2011-12-28</li><li>
这时我们看到网址部分已经开始显露出来了,还注意到它后面有一个 "> ,这部分也应被过滤,最好是将其替换为一个空格,这么做是考虑到后面可能要用 awk 的缘故,如:
cat urlist.txt |sed 's/<a href="//g' | sed 's/\">/ /g'
这样,网址部分已经完全显露出来了,而且每个网址都是用空格隔开的:
http://food.39.net/a/201212/1873068.html 糯米红枣薏米粥可治神经衰弱</a></li><li class="date 2012-1-2</li><li>http://food.39.net/a/201211/1872179.html 常吃深叶菜延缓大脑衰老</a></li><li class="date 2012-1-1</li><li>
接着使用 awk 进行分段过滤,如:
cat urlist.txt |sed 's/<a href="//g' | sed 's/\">/ /g' | sed 's/<li>/ /g' |awk -F " " '{i=1; while(i < NF){ print $i; i++}}'
在 awk 里也可以不指定 -F 后面的分隔符,因为默认就是空格来间隔的。这样变得到:
http://food.39.net/a/201212/1873068.html
糯米红枣薏米粥可治神经衰弱</a></li><li
class="date
2012-1-2</li>
http://food.39.net/a/201211/1872179.html
常吃深绿叶菜延缓大脑衰老</a></li><li
class="date
2012-1-1</li>
在这个输出中,网址已经被完全的独立到一行中来,这样想再提取网址就好办多了,那么接着用一个 grep 来过滤:
cat urlist.txt |sed 's/<a href="//g' | sed 's/\">/ /g' | sed 's/<li>/ /g' |awk '{i=1; while(i < 100){ print $i; i++}}' |grep -E 'http:.*'
在 grep 中使用了一个比价常用的正则匹配 .* 来匹配了整条网址,到此所有的网址已经完全过滤出来了,便于以后的利用,我们可以将它们导出保存到一个文件中。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2