PyQuery学习笔记

500 阅读4分钟

PyQuery能干什么

PyQuery是一个强大的网页解析库,如果还想体验jquery写前端交互的那种快感,这款解析库不容错过。可以使用CSS选择器来提取网页中你想要的数据。

官网地址

初始化

有三种初始化的方法:

  1. 读取一个HTML字符串
  2. 从文件中读取
  3. 从url中读取

字符串初始化

传入一个HTML的字符串,生成一个PyQuery对象。

from pyquery import PyQuery as pq

html = """
<ul>
<li id="first"><a href="1.html">first</a></li>
<li><a href="2.html">second</a></li>
<li class="three"><a href="3.html">three</a></li>
<li><a href="4.html">four</a></li>
</ul>
"""
d = pq(html)
print(d("li"))

#运行结果
<li id="first"><a href="1.html">first</a></li>
<li><a href="2.html">second</a></li>
<li><a href="3.html">three</a></li>
<li><a href="4.html">four</a></li>

初始化PyQuery对象后,选择获取所有li标签。

文件初始化

from pyquery import PyQuery as pq

d = pq(filename="example.html")
print(d("li"))

传入一个filename参数,表示读取的文件的位置。

URL初始化


from pyquery import PyQuery as pq

d = pq(url="http://httpbin.org")
print(d("title"))

传入一个url参数,会自动读取网页的内容初始化一个PyQuery对象。

URL抓取一般都是需要设置HTTP的头,防止被拦截,传入的参数和requests一样,详细可以参考requests。


from pyquery import PyQuery as pq

headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"}
d = pq(url="http://httpbin.org", headers=headers)

设置一个User-Agent头信息

选择器

css选择器

可以通过id、class、标签名。使用方法和jquer的$("")意思是一样的。


d = pq(html)

#id选择器
d("#first")
#class选择器
d(".three")
#标签名选择器
d("li")

获取属性值

通过attr()方法来提取标签中的属性值。也可以通过attr['id']这种方式来获取属性值。


d = pq(html)

d("#first > a").attr('href')
d("#first > a").attr['href']

attr()方法可以传入第二个参数,表示设置的属性值。不过我们一般都是用来抓取数据的,这种用法应该是用不到的。

查找节点

一般获取数据都需要查找多个节点才能定位到具体的位置,这时候就需要find()方法来查找子节点


d = pq(html)
a=d("#first")
print(a.find("a"))

父节点

使用parent()方法来获取某个节点的直接父节点,如果想要获取所有的父节点使用parents()方法多了一个s。可以传入一个参数(符合css选择器),指定要查找那个父节点

d = pq(html)

a=d("#first>a")
print(a.parent()) #返回一个li节点
print(a.parents()) #返回2个节点,li和ul
print(a.parents('li')) #返回一个li的节点

兄弟节点

使用siblings()方法。

d = pq(html)

li=d("#first")
print(li.siblings()) # 返回id为first下面的3个li兄弟节点

遍历

查找的数据肯定是多个,上面的查找方法都是返回的pyquery对象,接下来就是遍历找到的每个节点取出想要的数据了。

如果直接使用for来循环查找的结果,会返回一个<class 'lxml.etree._Element'>的对象,没有办法在使用PyQuery提供的方法了,当然可以在使用pq()方法初始化一个对象,但是很麻烦。

items()方法

返回的是一个PyQuery对象

d = pq(html)
lis = d("li")

for li in lis.items():
    print(type(li))
    print(li.find("a"))

循环每个li节点,在进行查找a节点的操作

伪类选择器

最强大的一个功能,可以选择第一个、最后、奇偶节点等等,具体可以参考CSS的[手册](www.runoob.com/css/css-pse…

介绍一些我觉得常用的伪类:

d = pq(html)

d("li:first-child") #选择第一个li的节点
d("li:last-child") #选择最后一个li节点
d("li:gt(1)") #选择大于二个li节点的所有li,从0开始
d("li:lt(2)") #选择小于第三个li节点的所有li,从0开始
d("li:nth-child(2)") #选择正数第二个li节点
d("li:nth-last-child(1)") #选择li节点倒数第二个节点
d("a:contains(th)") #选择包含th文本的a节点
d("li:even") #选择li的奇数行节点
d("li:odd") #选择li的偶数行节点

其他方法

还有很多其他方法,比如判断是否含有class,判断是否为空。具体参考官方的手册吧:[手册地址](pythonhosted.org/pyquery/api…