发布时间:2018-06-22 17:41:55编辑:Run阅读(4848)
Beautiful Soup的安装,简称bs4
pip3 install bs4
bs4解析器选择
解析器 | 使用方法 | 优势 | 劣势 |
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库 执行速度适中 文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | 速度快 文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml") | 速度快 唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档 | 速度慢 不依赖外部扩展 |
官方推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定
lxml解析器安装
pip3 install lxml
使用bs4过滤器
自建示例文件scenery.html文件的内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>武汉旅游景点</title> <meta name="description" content="武汉旅游景点 精简版" /> <meta name="author" content="hstking"> </head> <body> <div id="content"> <div class="title"> <h3>武汉景点</h3> </div> <ul class="table"> <li>景点<a>门票价格</a></li> </ul> <ul class="content"> <li nu="1">东湖 <a class="price">60</a></li> <li nu="2">磨山 <a class="price">60</a></li> <li nu="3">欢乐谷 <a class="price">108</a></li> <li nu="4">武昌极地海洋世界 <a class="price">150</a></li> <li nu="5">玛雅水上乐园 <a class="price">150</a></li> </ul> </div> </body> </html>
使用lxml解析器,打印scenery.html内容
from bs4 import BeautifulSoup # 使用lxml解析器 soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml') # prettify按标准的缩进格式的结构输出 print(soup.prettify())
执行结果: 按照标准的缩进格式的结构输出
bs4解析器lxml练习:
#!/usr/bin/env python # coding: utf-8 from bs4 import BeautifulSoup # 使用lxml解析器 soup = BeautifulSoup(open('scenery.html', encoding='utf8'), 'lxml') # prettify按标准的缩进格式的结构输出 print(soup.prettify()) # 获取第一次出现的标签名为ul的标签内容 print(soup.ul) print('\n') # 使用bs4过滤器soup.find()的方法获取第一次出现的标签内容 print(soup.find('ul')) print('\n') # 使用soup.find_all方法获取所有符合条件的标签列表,然后从列表中读取就行了 print(soup.find_all('ul')) # 获取所有ul中所有内容 print('\n') print(soup.find_all('ul')[0]) # 获取第一个ul中的所有内容 print('\n') print(soup.find_all('ul')[1]) # 获取第二个ul中的所有内容 print('\n') # 可以用soup.find(TagName, attrs={attrName:attrValue})的方法获取Tag的位置 # 获取li标签nu='3'的内容,适用标签名相同,属性不同的标签 print(soup.find('li', attrs={'nu': '3'})) print('\n') # 标签名相同,属性相同,连属性值都相同的标签 # 可以用soup.find_all(TagName,attr={'attName':'attValue'})将符合条件的内容全部放到列表里面 # 找a标签,class='price'的第一个内容 print(soup.find_all('a', attrs={'class': 'price'})[0]) print('\n') # 获取li标签,nu='2'的内容 Tags = soup.find('li', attrs={'nu': '2'}) print(Tags) print(Tags.a) # 获取nu='2'里面的a标签内容 print(Tags.find('a')) # 获取nu='2'里面的a标签内容 print('\n') # 获取li标签,nu='4'的内容 Tag = soup.find('li', attrs={'nu': '4'}) print(Tag) # 获取li标签,nu='4'中nu的值 print(Tag.get('nu')) # 获取li标签,nu='4'中的文本内容 ss = Tag.get_text() print(ss) # 以空格切割上面文本内容拿到第一个值 print(Tag.get_text().split(' ')[0]) # 获取li标签下a标签的文本内容 print(Tag.a.get_text())
上一篇: 没有了
下一篇: bs4爬虫实战一:获取百度贴吧内容
47604
45983
36909
34467
29079
25713
24565
19714
19245
17756
5564°
6155°
5690°
5737°
6703°
5482°
5484°
5988°
5965°
7295°