Python 爬虫之Beautiful Soup模块使用指南
爬取网页的流程一般如下:
- 选着要爬的网址(url)
- 使用python登录上这个网址(urlopen、requests等)
- 读取网页信息(read()出来)
- 将读取的信息放入BeautifulSoup
- 使用BeautifulSoup选取tag信息等
可以看到,页面的获取其实不难,难的是数据的筛选,即如何获取到自己想要的数据。本文就带大家学习下BeautifulSoup的使用。
BeautifulSoup官网介绍如下:
BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式,能够帮你节省数小时甚至数天的工作时间。
1安装
可以利用pip直接安装:
$pipinstallbeautifulsoup4
BeautifulSoup不仅支持HTML解析器,还支持一些第三方的解析器,如lxml,XML,html5lib但是需要安装相应的库。如果我们不安装,则Python会使用Python默认的解析器,其中lxml解析器更加强大,速度更快,推荐安装。
$pipinstallhtml5lib $pipinstalllxml
2BeautifulSoup的简单使用
首先我们先新建一个字符串,后面就以它来演示BeautifulSoup的使用。
html_doc="""TheDormouse'sstory TheDormouse'sstory Onceuponatimetherewerethreelittlesisters;andtheirnameswere Elsie, Lacieand Tillie; andtheylivedatthebottomofawell. ... """
使用BeautifulSoup解析这段代码,能够得到一个BeautifulSoup的对象,并能按照标准的缩进格式的结构输出:
>>>frombs4importBeautifulSoup >>>soup=BeautifulSoup(html_doc,"lxml") >>>print(soup.prettify())
篇幅有限,输出结果这里不再展示。
另外,这里展示下几个简单的浏览结构化数据的方法:
>>>soup.titleTheDormouse'sstory >>>soup.title.name 'title' >>>soup.title.string "TheDormouse'sstory" >>>soup.p['class'] ['title'] >>>soup.aElsie >>>soup.find_all('a') [ Elsie, Lacie, Tillie] >>>soup.find(id='link1') Elsie
3对象的种类
BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment。
3.1Tag
Tag通俗点讲就是HTML中的一个个标签,像上面的div,p,例如:
TheDormouse'sstory Elsie
可以利用soup加标签名轻松地获取这些标签的内容。
>>>print(soup.p)TheDormouse'sstory >>>print(soup.title) TheDormouse'sstory
不过有一点是,它查找的是在所有内容中的第一个符合要求的标签,如果要查询所有的标签,我们在后面进行介绍。
每个Tag有两个重要的属性name和attrs,name指标签的名字或者tag本身的name,attrs通常指一个标签的class。
>>>print(soup.p.name) p >>>print(soup.p.attrs) {'class':['title']}
3.2NavigableString
NavigableString:获取标签内部的文字,如,soup.p.string。
>>>print(soup.p.string) TheDormouse'sstory
3.3BeautifulSoup
BeautifulSoup:表示一个文档的全部内容。大部分时候,可以把它当作Tag对象,是一个特殊的Tag。
3.4Comment
Comment:Comment对象是一个特殊类型的NavigableString对象,其输出的内容不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
>>>markup="" >>>soup=BeautifulSoup(markup) >>>comment=soup.b.string >>>print(comment) Hey,buddy.Wanttobuyausedparser? >>>type(comment)
b标签里的内容实际上是注释,但是如果我们利用.string来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。
这时候我们可以先判断了它的类型,是否为bs4.element.Comment类型,然后再进行其他操作,如打印输出等。
4搜索文档树
BeautifulSoup主要用来遍历子节点及子节点的属性,并提供了很多方法,比如获取子节点、父节点、兄弟节点等,但通过实践来看,这些方法用到的并不多。我们主要用到的是从文档树中搜索出我们的目标。
通过点取属性的方式只能获得当前文档中的第一个tag,例如,soup.li。如果想要得到所有的
find_all(name,attrs,recursive,text,**kwargs)
4.1按name搜索
可以查找所有名字为name的tag,字符串对象会被自动忽略掉。
>>>soup.find_all('b') [TheDormouse'sstory] >>>soup.find_all('a') [Elsie, Lacie, Tillie]
4.2按id搜索
如果文档树中包含一个名字为id的参数,其实在搜索时会把该参数当作指定名字tag的属性来搜索:
>>>soup.find_all(id='link1') [Elsie]
4.3按attr搜索
有些tag属性在搜索不能使用,比如HTML5中的data-*属性,但是可以通过find_all()方法的attrs参数定义一个字典参数来搜索包含特殊属性的tag。
其实id也是一个attr:
>>>soup.find_all(attrs={'id':'link1'}) [Elsie]
4.4按CSS搜索
按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字class在Python中是保留字,使用class做参数会导致语法错误。因此从BeautifulSoup的4.1.1版本开始,可以通过class_参数搜索有指定CSS类名的tag:
>>>soup.find_all(class_='sister') [Elsie, Lacie, Tillie]
4.5string参数
通过string参数可以搜搜文档中的字符串内容。与name参数的可选值一样,string参数接受字符串、正则表达式、列表、True。
>>>soup.find_all('a',string='Elsie') [Elsie]
4.6recursive参数
调用tag的find_all()方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False。
4.6find()方法
它与find_all()方法唯一的区别是find_all()方法的返回结果是值包含一个元素的列表,而find()方法只返回第一个匹配的结果。
4.7get_text()方法
如果只想得到tag中包含的文本内容,那么可以用get_text()方法,这个方法获取到tag中包含的所有文本内容。
>>>soup.find_all('a',string='Elsie')[0].get_text() 'Elsie' >>>soup.find_all('a',string='Elsie')[0].string 'Elsie'
至此,BeautifulSoup的常用使用方法已讲完,若果想了解更多内容,建议看下官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/。
总结
本篇主要带大家了解了BeautifulSoup,结合一些小例子,相信大家对BeautifulSoup已不再陌生,下回会带大家结合BeautifulSoup进行爬虫的实战,欢迎继续关注!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。