(廿)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 = '''
<title>This is a test</title>
<div>
    <ul>
        <li class="sp item-0" name="one"><a href="www.baidu.com">baidu</a>
        <li class="sp item-1" name="two"><a href="https://blog.csdn.net/qq_25343557">myblog</a>
        <li class="sp item-2" name="two"><a href="https://www.csdn.net/">csdn</a>
        <li class="sp item-3" name="four"><a href="https://hao.360.cn/?a1004">hao123</a>
'''
html = pq(text)
print(html('title'))#获取title节点

这里写图片描述

从lxml文档中加载

from pyquery import PyQuery as pq
from lxml import etree

html = pq(etree.HTML('<title>This is a test</title>'))
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='''
		<div>
			<ul class='myul'>
				<li class="item-0"><a href="www.baidu.com" class='sp'>baidu</a></li>
				<li class="item-1"><a href="https://blog.csdn.net/qq_25343557">myblog</a></li>
				<li class="item-2"><a href="https://www.csdn.net/">csdn</a></li>
				<li class="item-3"><a href="https://hao.360.cn/?a1004" class='sp'>hao123</a></li>
			</ul>
		</div>
'''
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)

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

遍历节点##

通过查找所有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('<title>This is a test</title>')
result = html('title')
print(result.text())

这里写图片描述
如果我们查找的节点有多个,当我们调用text() 方法获取文本内容时也会将所有节点的文本提取出来,中间用空格分隔开。

html = pq('<p><span>python</span></p><p><span>java</span></p><p><span>c++</span></p><p><span>ruby</span></p>')
result = html('p')
print(result.text())

这里写图片描述
使用html() 方法可以查看节点内的html内容。如果是多个节点,在不逐一遍历节点的情况下直接调用html() 方法只返回第一个节点的html内容。

from pyquery import PyQuery as pq

html = pq('<p><span>python</span></p><p><span>java</span></p><p><span>c++</span></p><p><span>ruby</span></p>')
result = html('p')
print(result.html())

这里写图片描述

节点操作

addClass()和removeClass()

addClass():为节点添加class属性; removeClass:为节点删除class属性。
from pyquery import PyQuery as pq

html = pq('<ul><li class="item-0">1</li><li class="item-1">2</li><li class="item-2">3</li><li class="item-3">4</li></ul>')
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('<ul><li class="item-0">1</li><li class="item-1">2</li><li class="item-2">3</li><li class="item-3">4</li></ul>')
result = html('.item-0')
print('原始节点:',result)
result.attr('name','firstLi')#使用attr添加属性
print('添加name属性:',result)
result.text('人生苦短,我学Python.')
print('添加文本:',result)
result.html('<a href="http://www.baidu.com">baidu</a>')
print('添加html内容:',result)
print('=============')

这里写图片描述

remove()

通过`remove()` 删除某一节点。
from pyquery import PyQuery as pq

html = pq('<p>人生苦短,我学Python.<i>hello</i></p>')
result = html('p')
print(result.text())

这里写图片描述
实际上我想提取的仅仅是“人生苦短,我学Python.”这些内容,可是text()方法会将节点内的所有文本都提取到,这时候我们就需要将p节点内从i节点先删除,再提取文本内容。

from pyquery import PyQuery as pq

html = pq('<p>人生苦短,我学Python.<i>hello</i></p>')
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='''
<ul>
<li class="item-0">111111<a href="www.baidu.com">baidu</a></li>
<li class="item-1">222222<a href="https://blog.csdn.net/qq_25343557">myblog</a></li>
<li class="item-2">333333<a href="https://www.csdn.net/">csdn</a></li>
<li class="item-3">444444<a href="https://hao.360.cn/?a1004">hao123</a></li>
</ul>
'''
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值