码迷,mamicode.com
首页 > 编程语言 > 详细

python爬虫学习——解析库pyquery的使用

时间:2020-04-24 01:01:23      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:分割   实现   test   爬虫学习   爬虫   from   源代码   rap   增加   

这个解析库对于学过前端的人非常友好,因为其有强大的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的使用

标签:分割   实现   test   爬虫学习   爬虫   from   源代码   rap   增加   

原文地址:https://www.cnblogs.com/lonely-ok/p/12764820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!