Beautiful Soup库的基本使用
Beautiful Soup概述
使用lxml库时需要编写和测试XPath语句,显然降低了开发效率。除了lxml库之外,Python还提供了Beautiful Soup库来提取HTML/XML数据,使用起来更加方便简洁。
bs4是一个HTML/XML的解释器,其主要功能是解析和提取HTML/XML数据,不仅支持CSS选择器,而且支持Python标准库中的HTML解析器,以及lxml的XML解析器。通过使用这些转换器,实现了惯用的文档导航的查找方式,节省了大量的工作时间,提高了开发项目的效率。
bs4会将复杂的HTML库文档换成树形结构,这个结构中的每个节点都是一个Python对象。这些对象可以归纳为以下四种:
⭐️bs4.element.Tag类:表示HTML中的标签,是最基本的信息组织单元,他有两个重要的属性,分别是表示标签名字的name属性和attrs属性。
⭐️bs4.BeautifulSoup类:表示HTML DOM中的全部内容,支持遍历文档树和搜索文档树的大部分方法。
⭐️bs4.element.NavigableSrting类:表示HTML中标签的文本(非属性字符串)
⭐️bs4.element.Comment类:表示标签内字符串的注释部分,是一种特殊的NavigableString对象。
构建Beautiful Soup对象
通过一个字符串或者类文件对象(储存在本地的文件句柄或Web网页句柄)可以创建BeautifulSoup类的对象。
BeautifulSoup类中构造方法的语句如下:
def __init__ (self,markup="",features=None,builder=None,parse_only=None,from_encoding=None,exclude_encodings=None,**kwargs)
上述方法的一些参数含义如下:
⭐️markup:表示要解析的文档字符串或文件对象
⭐️features:表示解析器的名称
⭐️builder:表示指定的解析器
⭐️from_enconding:表示指定的编码格式
⭐️exclude_encondings:表示排除的编码格式
通过操作方法进行解读搜索
实际上,网页中有用的信息都存在于网页中的文本或者各种不同标签的属性值,为了能够获得这些有用的网页信息,可以通过一些查找方法或者标签属性。因此,bs4库内置了一些查找方法,其中常用的两个方法功能如下:
⭐️find()方法:用于查找符合查询条件的第一个标签节点
⭐️find_all()方法:查找所有符合查询条件的标签节点,并返回一个列表。
这两个方法用到的参数都是一样的,这里以find_all()方法为例,介绍在这个方法中的这些参数的应用。
find_all() 的方法定义如下:
find_all(self,name=None,attrs={},recursive=True,text=None,limit=None,**kwargs)
上述方法中的参数表示的含义如下:
⭐️name参数
查找所有的名字为name的标签,但字符串会被自动忽略。下面是name参数几种情况:
1.传入字符串:在搜索的方法中传入一个字符串,BeautifulSoup对象会查找与字符串完全匹配的内容。
2.传入正则表达式:如果传入的是正则表达式,那么BeautifulSoup对象会通过re模块的match()函数进行匹配。
3.传入列表:如果传入的是一个列表,那么BeautifulSoup对象会将与列表中任一元素匹配的内容返回。
⭐️arrts参数
用于查找具有特定属性值的标签。该参数可以传递一个字典,其中包含要匹配的属性名和对应的属性值。
⭐️text参数
传入text参数可以搜索文档中的字符串内容,与name参数是一样的,text参数也可以接受字符串、正则表达式和列表
⭐️limit参数
如果不需要获得全部的结果,传入limit参数可以限制返回结果的数量
⭐️recursive参数
在调用find_all()方法时,BeautifulSoup对象会检索当前的节点的所有子节点,这时,如果指向搜索当前节点的直接子节点,就可以使用recursive=Flase
通过CSS选择器进行搜索
除了bs4库提供的操作方法以外,还可以使用CSS选择器进行查找。CSS是一种来表现HTML和XML等文件样式的计算机语言,他不仅可以静态的修饰网页,而且可以配合各种脚本语言动态的对网页个元素进行格式化。
每一条CSS样式定义均由两部分组成:[code]选择器{样式}[/code] ,选择器指明了{}中的样式作用对象,也就是“样式”作用于网页中的哪些元素
在BeautifulSoup类中提供了一个select()方法,该方法会将搜索到的结果放到列表中,CSS选择器的查找方式可分为如下几种:
⭐️通过标签查找:标签的名称不用加任何修饰,在调用select()方法时,可以传入包含某个标签的字符串,如soup.select(“title”)
⭐️通过类名查找:需要在类名的前面加上“.",如soup.select(“.sister”)
⭐️通过id名查找:需要在id名称前面加上“#”,如soup.select(“#link”)
⭐️通过组合的形式查找:在标签p中查找id值等于link1的内容,如soup.select(“p #link1”),可以使用“>"将标签与子标签分隔,从而找到某个标签下的直接子标签,如soup.select(“head > title”)
⭐️通过属性查找:可以通过属性元素进行查找,属性需要用中括号括起来,属性合标签属于同一个节点,他们中不能加空格,否则将匹配不到,如soup.select(“a[href = “http//www.baidu.com”]”),返回是一个列表,可以通过get_text()获取内容