python爬虫学习——解析库pyquery的使用
Posted lonely-ok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫学习——解析库pyquery的使用相关的知识,希望对你有一定的参考价值。
这个解析库对于学过前端的人非常友好,因为其有强大的CSS选择器,也可以增加或删除class,方便的提取数据或者属性。
初始化
- 字符串初始化
这个就是传入html代码的字符串格式,简单的requests库可以获得该参数。
以知乎-新闻页为例
import requests
headers={
‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0‘
}
r = requests.get("https://daily.zhihu.com/",headers=headers)
print(r.text)
r.text返回的是一个经过解码后的字符串,是unicode类型,而r.content返回的是一个原生字符串,是bytes类型
- URL初始化
此时只需要指定参数为 url 即可 :
from pyquery import PyQuery
doc=PyQuery(url="https://www.baidu.com/")
这样的话, PyQuery 对象会首先请求这个 URL, 然后用得到的 HTML 内容完成初始化,这其实就相当于用网页的源代码以字符串的形式传递给 PyQuery 类来初始化。
- 文件初始化
from pyquery import PyQuery
doc=PyQuery(filename="test.html")
此时将参数指定为 filename 即可 。当然,这里需要有一个本地 HTML 文件 test.html,其内容是待解析的 HTML 字符串。 这样它会 首先读取本地的文件内容,然后用文件内容以字符串的形式传递给 PyQuery 类来初始化。
基本CSS选择器
这就是我认为这个解析库比较好用的地方,可以配合CSS选择器来使用。直接看下例:
from pyquery import PyQuery
html="待解析的html"
doc=PyQuery(html)
print(doc(‘#content .list li‘))
这里我们初始化 PyQuery 对象之后,传入了一个 CSS 选择器#container .list li,选择后它的类型依然是 PyQuery 类型。配合CSS选择器,事半功倍。
查找结点
- 子节点
查找子节点时, 需要用到find()方法,此时传人的参数是 css 选择器。
from pyquery import PyQuery
html="解析对象"
doc=PyQuery(html)
items=(doc(‘.list‘))
lis=items.find(‘li‘)
find()方法会将符合条件的所有节点选择出来,结果的类型是 PyQuery 类型。其实find()的查找范围是节点的所有子孙节点(该节点下的所有结点)
而如果我们只想查找子节点,那么可以用 children()方法:
lis=items.children(‘li‘)
#剩下的一致
- 父节点
我们可以用 parent()方法来获取某个节点的父节点,示例如下:
from pyquery import PyQuery
html=""
doc=PyQuery(html)
items=(doc(‘.list‘))
parents=items.parent()
这里我们首先用 .list 选取 class 为 list 的节点,然后调用 parent()方法得到其父节点,其类型依然是 PyQuery 类型。
这里的父节点是该节点的直接父节点,也就是说,它不会再去查找父节点的父节点, 即祖先节点。
但是如果想获取某个祖先节点,该怎么办呢?这时可以用 parents()方法:
parents=items.parents()
同样的,如果想要筛选某个祖先节点的话,可以向 parents()方法传入CSS选择器。
- 兄弟结点
如果要获取兄弟节点, 可以使用 siblings()方法
from pyquery import PyQuery
html=""
doc=PyQuery(html)
items=(doc(‘.list‘))
lis=items.siblings()
将筛选后的结点的兄弟节点返回。
遍历
pyquery 的选择结果可能是多个节点,也可能是单个节点 , 类型都是 PyQuery 类型。
对于单个节点来说,可以直接打印输出,也可以直接转成字符串 。
对于多个节点的结果,我们就需要遍历来获取了。例如,这里把每一个 li 节点进行遍历,需要调用 items()方法:
doc=PyQuery(html)
a=doc(‘.li‘).items()
for i in a:
print(i,type(i))
调用 items()方法后,会得到一个生成器,遍历一下,就可以逐个得到 li 节点对象了 , 它的类型也是 PyQuery 类型。每个 li 节点还可以调用前面所说的方法进行选择,比如继续查询子节点, 寻找某个祖先节点等,非常灵活。也可以用下文的属性提取,十分灵活。
获取信息
- 获取属性
提取到某个 PyQuery 类型的节点后,就可以调用 attr()方法来获取属性:
from pyquery import PyQuery
html=""
doc=PyQuery(html)
a=(doc(‘.list‘))
print(a.attr(‘href‘))
在这个方法中传入属性的名称,就可以得到这个属性值了。
此外,也可以通过调用 attr 属性来获取属性,用法如下 :
print(a.attr.href)
注意:
当返回结果包含多个节点时,调用 attr()方法,只会得 到第一个节点的属性。那么,遇到这种情况时,如果想获取所有的 a 节点的属性,就要用到前面所说的遍历了 。
- 获取文本
可以调用 text()方法来实现:
from pyquery import PyQuery
html=""
doc=PyQuery(html)
a=(doc(‘.list‘))
print(a.text())
这里首先选中class=list的节点,然后调用 text()方法,就可以获取其内部的文本信息。 此时它会忽略 掉节点内部包含的所有 HTML,只返回纯文字内容。
但如果想要获取这个节点内部的 HTML 文本,就要用 html()方法了:
a=(doc(‘.list‘))
print(a.html())
html()方法返回的是第一个 li 节点的内部 HTML 文本,而 text()则返 回了所有的 li 节点内部的纯文本,中间用一个空格分割开,即返回结果是一个字符串。
若要输出处理,应该遍历依次输出内容
节点操作
pyquery 提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个 class ,移除某个节点等,这些操作有时候会为提取信息带来极大的便利。
- 移除添加class
doc=PyQuery(html)
a=(doc(‘.list‘))
a.removeClass(‘active‘)
a.addClass(‘active‘)
首先选中了class为list,然后调用 removeClass ()方法,将节点的 active 这个 class 移除, 后来又调用 addClass()方法,将 class 添加回来。
- 改变属性
当然,除了操作 class 这个属性外,也可以用 attr()方法对属性进行操作。 此外,还可以用 text() 和 html()方法来改变节点内部的内容。 示例如下:
a=(doc(‘.list‘))
a.attr(‘name‘,‘link‘)
a.text(‘change‘)
a.html(‘<span>changed item</span>‘)
所以说,如果 attr()方法只传入第一个参数的属性名,则是获取这个属性值。如果传入第二个参数,可以用来修改属性值。 text()和 html()方法如果不传参数,则是获取节点内纯文本和 HTML 文本。如果传人参数,则进行赋值。
- 移除节点
wrap.find (‘p‘).remove()
首先选中 p 节点,然后调用了 remove()方法将其移除,可以方便进一步提取节点内容。
另外,其实还有很多节点操作的方法,比如 append()、 empty()和 prepend()等方法,它们和 jQuery 的用法完全一致,详细的用法可以参考官方文档:。
以上是关于python爬虫学习——解析库pyquery的使用的主要内容,如果未能解决你的问题,请参考以下文章