Python网络爬虫技术与实战
上QQ阅读APP看书,第一时间看更新

3.6 实战案例

3.6.1 使用Beautiful Soup解析网页

如下示例使用Beautiful Soup来对http://www.cntour.cn的网页内容进行解析,实战体会Beautiful Soup的综合用法。

【例3-41】使用Beautiful Soup解析网页


1  import requests
2  from bs4 import BeautifulSoup
3  import re
4  url = 'http://www.cntour.cn/'
5  strhtml = requests.get(url)
6  soup = BeautifulSoup(strhtml.text,'lxml')
7  data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > u
8  l.newsList > li > a')
9  for item in data:
10     result={
11         'title' : item.get_text(),
12         'link' : item.get('href'),
13         'ID' : re.findall('\d+',item.get('href'))
14     }
15     print(result)

运行结果如下:


{'title': '数字文旅时代来了', 'link': 'http://www.cntour.cn/news/6530/', 'ID': ['6530']}
{'title': '文旅品质提升助力美好生活', 'link': 'http://www.cntour.cn/news/6528/', 'ID': ['6528']}
{'ti tle': '一带一路沿线中国游客增长迅速', 'link': 'http://www.cntour.cn/news/6525/', 'ID': ['6525']}
{'ti tle': '中国人旅游需求越来越强', 'link': 'http://www.cntour.cn/news/6514/', 'ID': ['6514']}
{'ti tle': '[游遍世园会:一条龙服务]', 'link': 'http://www.cntour.cn/news/6522/', 'ID': ['6522']}
{'ti tle': '[高端旅游如何发力?]', 'link': 'http://www.cntour.cn/news/6512/', 'ID': ['6512']}
{'ti tle': '[新文创赋能老字号]', 'link': 'http://www.cntour.cn/news/6508/', 'ID': ['6508']}
{'ti tle': '[旅游演艺该多些新口味了]', 'link': 'http://www.cntour.cn/news/6498/', 'ID': ['6498']}
{'ti tle': '[中国冰雪运动全面升级]', 'link': 'http://www.cntour.cn/news/6491/', 'ID': ['6491']}
{'ti tle': '[全球美食受欢迎度排名]', 'link': 'http://www.cntour.cn/news/6490/', 'ID': ['6490']}
{'ti tle': '[旅游景区拥抱5G新时代]', 'link': 'http://www.cntour.cn/news/6473/', 'ID': ['6473']}
{'ti tle': '[服务消费 转型发展新动能]', 'link': 'http://www.cntour.cn/news/6468/', 'ID': ['6468']}

图3-5 获取元素路径

首先,HTML文档将被转换成Unicode编码格式,然后Beautiful Soup选择最合适的解析器来解析这段文档,此处指定lxml解析器进行解析。解析后便将复杂的HTML文档转换成树形结构,并且每个节点都是Python对象。这里将解析后的文档存储到新建的变量soup中。接下来用select(选择器)定位数据,定位数据时需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令,如图3-5所示。随后在浏览器右侧会弹出开发者界面,右侧高亮的代码对应着左侧高亮的数据文本。右击右侧高亮数据,在弹出的快捷菜单中选择"Copy-"CopySelector命令,便可以自动复制路径。


# mai n > div > div.mtop.firstMod.clearfix > div.centerBox > div:nth-child(2) > ul > li:nth-child(2)

由于这条路径是选中的第一条路径,而我们需要获取所有的头条新闻,因此可将li:nth-child(2)中冒号(包含冒号)后面的部分删掉,再使用soup.select引用这条路径,代码如下:


Data =soup.select('[#main > div > div.mtop.
firstMod.clearfix > div.centerBox > ul.ne
wsList > li > a')

然后再对数据进行提取:


result={
    'title' : item.get_text(),
    'link' : item.get('href'),
    'ID' : re.findall('\d+',item.get('href'))
}