近期在研究py的网络编程,编写爬虫也是顺利成章的,开始在纠结与用正则表达式来匹配,到后来发现了Beautifulsoup,用他可以非常完美的帮我完成了这些任务:
Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。它可以大大节省你的编程时间。
简单使用说明:
代码语言:javascript复制>>> from bs4 import BeautifulSoup
>>> html_doc = """
... <html><head><title>The Dormouse's story</title></head>
...
... <p class="title"><b>The Dormouse's story</b></p>
...
... <p class="story">Once upon a time there were three little sisters; and their names were
... <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
... <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
... <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
... and they lived at the bottom of a well.</p>
...
... <p class="story">...</p>
... """
>>> soup = BeautifulSoup(html_doc)
>>> soup.head()
[<title>The Dormouse's story</title>]
>>> soup.title
<title>The Dormouse's story</title>
>>> soup.title.string
u"The Dormouse's story"
>>> soup.body.b
<b>The Dormouse's story</b>
>>> soup.body.a
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
>>> soup.get_text()
u"... The Dormouse's storyn... n... The Dormouse's storyn... n... Once upon a time there were three little sisters; and their names weren... Elsie,n... Lacie andn... Tillie;n... and they lived at the bottom of a well.n... n... ...n... "
>>> soup.find_all('a')
[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
>>> for key in soup.find_all('a'):
... print key.get('class'),key.get('href')
...
['sister'] http://example.com/elsie
['sister'] http://example.com/lacie
['sister'] http://example.com/tillie
###通过里面的方法,可以很快调出里面的元素和结果:
简单说明:
soup.body:表示显示body标签下面的内容,也可以用.来叠加标签:
soup.title.string:表示现在titile的文本内容
soup.get_text():表示显示所有文本内容:
soup.find_all():方式可以随意组合,也可以通过任意标签,包括class,id 等方式:
举例说明:以我常常看的直播表新闻为例;
1、首先看看我们要获得的内容:
我要获取的是上面那一栏热点新闻:如世预赛国足不敌卡塔而
2、源代码查看:
代码语言:javascript复制<div class="fb_bbs"><a href="http://news.zhibo8.cc/zuqiu/" style="padding: 0 5px 0 0;" target="_blank" title="足球新闻"><img src="/css/p_w_picpaths/football.png"/></a><span><a href="http://news.zhibo8.cc/zuqiu/" target="_blank"><font color="red"> 世预赛:国足0-1不敌卡塔
尔</font></a>|<a href="http://news.zhibo8.cc/zuqiu/2015-10-09/5616a910d74ac.htm" target="_blank">国足“刷卡”耻辱:11年不胜</a>|<a hf="http://news.zhibo8.cc/zuqiu/2015-10-09/5616b22cbd134.htm" target="_blank">切尔西签下阿梅利亚</a>|<a href="http://news.zhibo8.cc/zuqiu/2015-10-09/5616daa45ee48.htm" target="_blank">惊人!莱万5场14球</a>|<a href="http://tu.zhibo8.cc/zuqiu/" target="_blank">图-FIFA16中国球员</a></span></div>
###从源码看到,这个是一个div 标签包裹的一个class=“fb_bbs”的版块,当然我们要确保这个是唯一的。
3、用BeautifulSoup来分析出结果代码如下:
代码语言:javascript复制#coding=utf-8
import urllib,urllib2
from bs4 import BeautifulSoup
try:
html = urllib2.urlopen("http://www.zhibo8.cc")
except urllib2.HTTPError as err:
print str(err)
soup = BeautifulSoup(html)
for i in soup.find_all("div",attrs={"class":"fb_bbs"}):
result = i.get_text().split("|")
for term in result:
print term
4、执行效果:
[root@master network]# python url.py
世预赛:国足0-1不敌卡塔尔
国足“刷卡”耻辱:11年不胜
切尔西签下阿梅利亚
惊人!莱万5场14球
图-FIFA16中国球员
利物浦官方宣布克洛普上任
档案:克洛普的安菲尔德之旅
欧预赛-德国爆冷0-1爱尔兰
葡萄牙1-0胜丹麦
图-穆帅难罢手
到此任务差不多完成,代码量比re模块少了很多,而且简洁唯美,用py做爬虫确实是个利器;