
上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')) }