(廿)Python爬虫:pyquery的使用

      pyquery允许您在xml文档上进行jquery查询。 API尽可能与jquery类似。 pyquery使用lxml快速操作xml和html。直接使用pip3 install pyquery安装即可。


加载HTML

      我们可以使用PyQuery类从字符串,lxml文档,文件或URL中加载html文档。

从字符串中加载

from pyquery import PyQuery as pq

text = '''
This is a test

这里写图片描述

从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'))

(廿)Python爬虫:pyquery的使用_第1张图片

从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)

(廿)Python爬虫:pyquery的使用_第2张图片
parent()方法只能获取当前节点的直接父节点,无法获取祖先节点,如果需要获取祖先节点使用parents(selector)方法。

html = pq(text)
ul = html('.myul')#根据class选择ul节点
result = ul.parents('body')#获取名为body的祖先节点
print(result)

(廿)Python爬虫:pyquery的使用_第3张图片

获取兄弟节点

我们可以使用`sibllings()` 获取兄弟节点。
html = pq(text)
li = html('.item-1')#根据class选择第二个li节点
result = li.siblings()#获取兄弟节点
print(result)

这里写图片描述
可以传入css选择器选取符合条件的兄弟节点。

遍历节点##

通过查找所有li标签我们会发现无论是获取一个节点还是多个节点都是返回一个PyQuery对象,而不像前面bs4一样获取一个列表。现在我们多获取到的多个li节点进行遍历。

html = pq(text)
lis = html('li')
for li in lis.items():#调用items()方法得到一个生成器,遍历得到的每一个节点同样是PyQuery对象
    print(li)

(廿)Python爬虫:pyquery的使用_第4张图片

获取信息

获取属性

我们可通过调用`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)

(廿)Python爬虫:pyquery的使用_第5张图片
我们想获取所有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('=============')

(廿)Python爬虫:pyquery的使用_第6张图片

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('=============')

(廿)Python爬虫:pyquery的使用_第7张图片

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)#文本内容包括子节点中的

(廿)Python爬虫:pyquery的使用_第8张图片

更多css伪类选择器查看:http://www.w3school.com.cn/css/css_pseudo_classes.asp

你可能感兴趣的:(Python网络爬虫,Python等等)