pyquery允许您在xml文档上进行jquery查询。 API尽可能与jquery类似。 pyquery使用lxml快速操作xml和html。直接使用pip3 install pyquery
安装即可。
我们可以使用PyQuery类从字符串,lxml文档,文件或URL中加载html文档。
from pyquery import PyQuery as pq
text = '''
This is a test
- baidu
- myblog
- csdn
- hao123
'''
html = pq(text)
print(html('title'))#获取title节点
从lxml文档中加载
from pyquery import PyQuery as pq
from lxml import etree
html = pq(etree.HTML('This is a test '))
print(html('title'))
从文件中加载
from pyquery import PyQuery as pq
html = pq(filename='test.html')
print(html('li'))
从URL中加载
from pyquery import PyQuery as pq
html = pq(url='https://blog.csdn.net/qq_25343557/article/details/82017125')
print(html('title'))
查找节点##
获取子节点
查找当前节点下的子节点(包括子孙节点)时我们可以使用`find(selector)`方法。
from pyquery import PyQuery as pq
text='''
'''
html = pq(text)
ul = html('.myul')#根据class选择ul节点
result = ul.find('a')#返回所有a标签
print(result)
result = ul.find('a[class="sp"]')#返回所有class属性为sp的a标签
print(result)

find(selector)
方法返回所有的子节点,包括子孙节点,如果我们只想返回直接子节点可以使用children(selector)
方法。
获取父节点
我们可以使用`parent()` 方法查找当前节点的父节点。
html = pq(text)
ul = html('.myul')#根据class选择ul节点
result = ul.parent()
print(result)

parent()
方法只能获取当前节点的直接父节点,无法获取祖先节点,如果需要获取祖先节点使用parents(selector)
方法。
html = pq(text)
ul = html('.myul')#根据class选择ul节点
result = ul.parents('body')#获取名为body的祖先节点
print(result)
获取兄弟节点
我们可以使用`sibllings()` 获取兄弟节点。
html = pq(text)
li = html('.item-1')#根据class选择第二个li节点
result = li.siblings()#获取兄弟节点
print(result)
遍历节点##
通过查找所有li标签我们会发现无论是获取一个节点还是多个节点都是返回一个PyQuery对象,而不像前面bs4一样获取一个列表。现在我们多获取到的多个li节点进行遍历。
html = pq(text)
lis = html('li')
for li in lis.items():#调用items()方法得到一个生成器,遍历得到的每一个节点同样是PyQuery对象
print(li)
获取信息
获取属性
我们可通过调用`attr(name)`方法来获取属性.
html = pq(text)
result = html('a')
for a in result.items():
print(a.attr('href'))
#也可以调用attr属性来获取属性值
for a in result.items():
print(a.attr.href)

我们想获取所有a节点的href属性必须遍历每个节点,依次获取。如果直接使用result.attr('href')
只能获取到第一个节点的值。
获取文本
我们可以使用`text()` 方法获取节点内的文本内容。
html = pq('This is a test ')
result = html('title')
print(result.text())

如果我们查找的节点有多个,当我们调用text()
方法获取文本内容时也会将所有节点的文本提取出来,中间用空格分隔开。
html = pq('python
java
c++
ruby
')
result = html('p')
print(result.text())

使用html()
方法可以查看节点内的html内容。如果是多个节点,在不逐一遍历节点的情况下直接调用html()
方法只返回第一个节点的html内容。
from pyquery import PyQuery as pq
html = pq('python
java
c++
ruby
')
result = html('p')
print(result.html())
节点操作
addClass()和removeClass()
addClass():为节点添加class属性; removeClass:为节点删除class属性。
from pyquery import PyQuery as pq
html = pq('- 1
- 2
- 3
- 4
')
result = html('.sp')#寻找class属性包含sp的节点
print(result)
html('.item-0').addClass('sp')#添加class属性为sp
result = html('.sp')#寻找class属性包含sp的节点
print(result)
html('.item-0').removeClass('sp')#删除class属性为sp
result = html('.item-0')
print(result)
print('=============')
attr、text和html
from pyquery import PyQuery as pq
html = pq('- 1
- 2
- 3
- 4
')
result = html('.item-0')
print('原始节点:',result)
result.attr('name','firstLi')#使用attr添加属性
print('添加name属性:',result)
result.text('人生苦短,我学Python.')
print('添加文本:',result)
result.html('baidu')
print('添加html内容:',result)
print('=============')
remove()
通过`remove()` 删除某一节点。
from pyquery import PyQuery as pq
html = pq('人生苦短,我学Python.hello
')
result = html('p')
print(result.text())

实际上我想提取的仅仅是“人生苦短,我学Python.”这些内容,可是text()方法会将节点内的所有文本都提取到,这时候我们就需要将p节点内从i节点先删除,再提取文本内容。
from pyquery import PyQuery as pq
html = pq('人生苦短,我学Python.hello
')
result = html('p')
result.find('i').remove()#找到i节点并删除
print(result.text())
更多节点操作方法详见:https://pythonhosted.org/pyquery/api.html
伪类选择器
我们可以通过伪类选择器选择任意第N个符合条件的节点,包含某一文本的节点。
from pyquery import PyQuery as pq
text='''
'''
html = pq(text)
result = html('li:first-child')
print('第一个li节点:',result)
result = html('li:last-child')
print('最后一个li节点:',result)
result = html('li:nth-child(2)')
print('第二个li节点:',result)
result = html('li:nth-child(2n)')
print('偶数li节点:',result)
result = html('li:gt(2)')
print('位置大于2的li节点:',result)
result = html('li:contains("csdn")')
print('文本内容包含2的li节点:',result)#文本内容包括子节点中的
更多css伪类选择器查看:http://www.w3school.com.cn/css/css_pseudo_classes.asp