1. 安装bs4,lxml,html5lib
- easy_install beautifulsoup4
pip install beautiful4
-linux:sudo python setup.py install如果代码抛出了 ImportError 的异常: “No module named HTMLParser”, 这是因为你在Python3版本中执行Python2版本的代码.
如果代码抛出了 ImportError 的异常: “No module named html.parser”, 这是因为你在Python2版本中执行Python3版本的代码.
或在bs4的目录中执行Python代码版本转换脚本 $ 2to3-3.2 -w bs4
2.常用解析方式
-python标准库:BeautifulSoup(markup, “html.parser”)
- lxml HTML 解析器:BeautifulSoup(markup, “lxml”)
- lxml XML 解析器:BeautifulSoup(markup, [“lxml”, “xml”])|BeautifulSoup(markup, “xml”)
- 唯一支持xml的解析器html5lib:BeautifulSoup(markup, “html5lib”),最好的容错性,以浏览器方式解析文档,生成html5文档,但是速度慢
3.创建Beautifusoup对象
可以手动指定解析器
soup = BeautifulSoup(html_doc, ‘html.parser’)
打开本地文件
soup = BeautifulSoup(open(‘index.html’))
所有文档都会默认转换成Unicode编码 UTF-8格式
4.格式化输出
soup.title
The Dormouse’s story
soup.title.name
u’title’
soup.title.string
u’The Dormouse’s story’
soup.title.parent.name
u’head’
soup.p
The Dormouse’s story
soup.p[‘class’]
u’title’
soup.a
soup.find_all(‘a’)
soup.find(id=”link3”)
5、Beautiful对象种类
首先 Beautiful Soup将所有的HTML文档转换成一种复杂的树形结构,每个节点都是Python对象。总共划分为4种Tag, NavigableString, BeautifuLSoup, Comment
6.Tag对象(标签,与HTML中的标签相同)
通过soup.b获得,最重要的属性:
- name:标签名字,改变标签名字就会影响所有通过当前BeautifulSoup对象生成的HTML文档
attributes:一个tag可能有多个属性,如tag
tag的属性的操作方法与字典相同。tag[‘class’] # u’boldest’
也可以通过直接“点”取属性,比如.attrs, tag.attrs {u’class’: u’boldest’}
tag的属性可以被添加,删除和修改: tag.get(“class”)
- 多值属性,最常见的为class,还有一些属性rel , rev , accept-charset , headers , accesskey。在BeautifulSoup中多值属性返回列表list类型。
css_soup = BeautifulSoup(‘‘)
css_soup.p[‘class’] –> [“body”, “strikeout”]
-如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回,如id.
‘)
id_soup = BeautifulSoup(‘
id_soup.p[‘id’]
‘my id’
将tag转换成字符串时,多值属性会合并为一个值
rel_soup = BeautifulSoup(‘
Back to the homepage
‘)rel_soup.a[‘rel’]
# [‘index’]
rel_soup.a[‘rel’] = [‘index’, ‘contents’]
print(rel_soup.p)
#
Back to the homepage
如果转换的文档是XML格式,那么tag中不包含多值属性
xml_soup = BeautifulSoup(‘
xml_soup.p[‘class’]
# u’body strikeout’
标签内部的字符串:
字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串
tag.string
# u’Extremely bold’
type(tag.string)
#