曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4245|回复: 0
打印 上一主题 下一主题

如何提取一段HTML源码中的所有网址

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-1-5 13:12:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有时你可能想获取整个页面中所有的文章网址,但这些网址写在整的一段中,这会给提取带来些许的难度。此时过滤掉相应的 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 中使用了一个比价常用的正则匹配 .* 来匹配了整条网址,到此所有的网址已经完全过滤出来了,便于以后的利用,我们可以将它们导出保存到一个文件中。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-14 23:20 , Processed in 0.061647 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表