0
点赞
收藏
分享

微信扫一扫

pyquery解析库

_LEON_ 2022-09-13 阅读 72


初始化

pyquery也需要传入HTML文本来初始化一个PyQuery对象。可以直接传入字符串、URL、文件名。
传入URL

from pyquery import PyQuery as pq
doc=pq(url="https://blog.net/qq_39905917/article/category/8719278")
print(doc("title"))

传入文件

from pyquery import PyQuery as pq
doc=pq(filename="demo.html")
print(doc("title"))

基本CSS选择器

from pyquery import PyQuery as pq
doc=pq(html)
print(doc("#container .list li"))
print(type(doc("#container .list li")))

查找节点

子节点
需要用到find()方法,此时传入的参数是CSS选择器。

html="""
<div class="container">
<ul class="list">
<li class="item-0">first time</li>
<li class="item-1"><a href="link2.html">second time</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third time</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth time</a></li>
<li class="item-0"><a href="link5.html">fifth time</a></li>
</ul>
</div>
"""
from pyquery import PyQuery as pq
doc=pq(html)
items=doc(".list") #查找列表
print(items)
print(type(items))
lis=items.find("li")
print(type(lis))
print(lis)

find()的查找范围是节点的所有子孙节点,如果只想查找子节点,可以用children()方法。
父节点
用parent()方法来获取某个父节点。

from pyquery import PyQuery as pq
doc=pq(html)
items=doc(".list") #查找列表
container=items.parent()
print(type(container))
print(container)

如果想获取某个祖先节点,用parents()方法,parents()方法会返回所有的祖先节点。
兄弟节点
获取兄弟节点用siblings()方法。
遍历
puquery的选择结果可能是多个节点,也可能是单个节点,类型都是PyQuery类型。
对每一个节点进行遍历,需要调用item()方法

from pyquery import PyQuery as pq
doc=pq(html)
lis=doc('li').items()
print(lis)
for li in lis:
print(li,type(li))

获取信息

获取属性
可以调用attr()方法来获取属性,也可以调用attr属性来获取属性。当返回的结果包含多个节点时,调用attr()方法只会得到第一个节点的属性。

from pyquery import PyQuery as pq
doc=pq(html)
a=doc('.item-0.active a')
print(a.attr('href'))
print(a.attr.href)

获取信息
调用text()方法

a=doc('.item-0.active a')
print(a.text())

输出:third time

如果想要获取这个节点内部的HTML文本,调用html()方法。

a=doc('.item-0.active')
print(a.html())

输出:

<a href="link3.html"><span class="bold">third time</span></a>

假如有多个结果时,html()方法返回的是第一个li节点的内部HTML文本,而text()则返回了所有结果,中间用一个空格隔开,即返回结果是一个字符串。

节点操作

add_class()和remove_class()方法可以动态改变节点的class属性。

from pyquery import PyQuery as pq
doc=pq(html)
li=doc('.item-0.active')
print(li)
li.remove_class("active")
print(li)
li.add_class("active")
print(li)

输出:

<li class="item-0 active"><a href="link3.html"><span class="bold">third time</span></a></li>

<li class="item-0"><a href="link3.html"><span class="bold">third time</span></a></li>

<li class="item-0 active"><a href="link3.html"><span class="bold">third time</span></a></li>

attr、text、html修改信息
attr()的第一个参数为属性,第二个参数为属性值。text()和html()用来改变节点内部的内容

from pyquery import PyQuery as pq
doc=pq(html)
li=doc('.item-0.active')
li.attr('name','link')
print(li)
li.text('changed item')
print(li)
li.html('<span>changed item</span>')
print(li)

输出:

<li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third time</span></a></li>

<li class="item-0 active" name="link">changed item</li>

<li class="item-0 active" name="link"><span>changed item</span></li>

remove()
就是移除。加入不想要p标签里的内容,可以使用remove去除。

html="""
<div class="wrap">
Hello,World<p>This is a paragraph</p>
</div>
"""
from pyquery import PyQuery as pq
doc=pq(html)
wrap=doc('.wrap')
print(wrap.text())
wrap.find('p').remove()
print(wrap.text())

还有很多节点操作方法,如append()、empty()、prepend()等。


举报

相关推荐

0 条评论