初始化
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()等。