《PYTHON3网络爬虫开发实践》——第四章 解析库的使用
第四章 解析库的使用
4.1 XPath
-
对于网页的节点来说,它可以定义id、 class或其他属性。而且节点之间还有层次关系,在网页中可以通过XPath或CSS选择器来定位一一个或多个节点。那么,在页面解析时,利用XPath或CSS选择器来提取某个节点,然后再调用相应方法获取它的正文内容或者属性,就可以提取我们想要的任意信息了。
-
XPath提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等。
-
XPath常用规则
eg: //title[@lang=‘eng’]
它代表选择所有名称为title,同时属性lang的值为eng的节点。
eg:
这里首先导人lxml库的etree模块,然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。这里需要注意的是,HTML文本中的最后一个li节点是没有闭合的,但是etree模块可以自动修正HTML文本。
这里我们调用tostring()方法即可输出修正后的HTML代码,但是结果是bytes类型。这里利用decode()方法将其转成str类型,可以看到,经过处理之后,li节点标签被补全,并且还自动添加了body、html节点。 -
XPath选取所有节点。
使用//开头。
*代表匹配所有节点。返回形式是一个列表,每个元素是Element类型。
也可以指定节点名称,比如获取所有li节点。要取出其中的一个对象,可以直接用中括号加索引,如[0]
-
XPath选取所有子节点
/或//查找元素的子节点或子孙节点。
/用于获取直接子节点。//用于获取子孙节点。
比如想选择li节点的所有直接a子节点。
-
XPath选取父节点
可以用…来实现,或者parent::来实现。
比如,现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性
-
XPath属性匹配
可以用@符号进行属性过滤。
-
XPath文本获取
两种方式:一是先选取a节点再获取文本,二是使用//
-
XPath属性获取
用@符号就可以。比如获取所有li节点下所有a节点的href属性。
注意和属性匹配的区别。属性匹配有[],比如[@href=“link1.html”],而属性获取没有[]
-
XPath属性多值匹配
有些class属性里有多个值,如果还用之前的属性匹配就无法获取了,这时就用到contain()函数了。第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了。
-
XPath多属性匹配
使用and、or、mod等运算法。
-
XPath按序选择
可以利用中括号传入索引的方法获取特定次序的节点。
XPath中提供了100多个函数,包括存取、数值、字符串、逻辑、节点、序列等,比如last()、position()等。P179
-
XPath节点轴选择
包括获取子元素、兄弟元素、父元素、祖先元素等。
4.2 Beautiful Soup
-
Beautiful Soup解析器
-
Beautiful Soup基本用法
首先声明的变量html,它是一个HTML字符串,并没有闭合。接着,我们将它当作第一个参数传给BeautifulSoup对象,使用lxml解析,此时就完成了BeaufulSoup对象的初始化。然后,将这个对象赋值给soup变量。
首先,调用prettify()方法。把要解析的字符串以标准的缩进格式输出。
然后调用soup. title.string,soup. title可以选出HTML中的title节点,再调用string属性就可以得到里面的文本了。 -
Beautiful Soup节点选择器
直接调用节点的名称就可以选择节点元素。
-
获取名称
-
获取属性
-
获取内容
-
-
关联选择
子节点、父节点、兄弟节点等。P186-P191
-
方法选择器
-
find_all()
-
可以根据节点名来查询元素
-
除了根据节点名查询,我们也可以传入一些属性来查询
-
text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。
-
-
find()
find()方法返回的是单个元素,也就是第一个匹配的元素。find_all()返回的是所有匹配的元素组成的列表。
-
还有一些其他的方法
-
-
Beautiful Soup——CSS选择器
使用CSS选择器时,只需要调用select()方法,传入相应的CSS选择器即可。
-
select()方法同样支持嵌套选择。
-
获取属性
-
获取文本
-
4.3 pyquery
-
pyquery的初始化
-
pyquery的初始化方法有多种,比如直接传入字符串、传入URL、传入文件名等。
-
字符串初始化
-
URL初始化
这样的话,PyQuery 对象会首先请求这个URL,然后用得到的HTML内容完成初始化,这其实就相当于用网页的源代码以字符串的形式传递给PyQuery类来初始化。
-
文件初始化
传递本地的文件名,其内容是待解析的HTML字符串。
以上3种初始化方式均可,当然最常用的初始化方式还是以字符串形式传递。
-
-
PyQuery基本CSS选择器
这里我们初始化PyQuery对象之后,传入了一个CSS选择器#container .list li,它的意思是先选取id为container的节点,然后再选取其内部的class为list的节点内部的所有li节点。然后,打印输出。可以看到,我们成功获取到了符合条件的节点。
最后,将它的类型打印输出。可以看到,它的类型依然是PyQuery类型。 -
PyQuery查找节点
-
子节点(find())
-
父节点(parent())
-
兄弟节点(siblings())
-
遍历
-
-
pyquery获取信息
-
获取属性attr()
-
获取文本text()
-
-
pyquery节点操作
pyquery提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个class,移除某个节点等,这些操作有时候会为提取信息带来极大的便利。
-
addClass和removeClass
-
attr、text和html
当然,除了操作class这个属性外,也可以用attr()方法对属性进行操作。此外,还可以用text()和html()方法来改变节点内部的内容。
-
remove()
-
-
pyquery伪类选择器
CSS选择器之所以强大,还有一个很重要的原因,那就是它支持多种多样的伪类选择器,例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等。