提取到某个PyQuery类型的节点后,可以调用attr()方法来获取属性。
from pyquery import PyQuery
html = '''
- first item
- second item
- three item
- fourth item
- fifth item
'''
pq = PyQuery(html)
a = pq('.item-0.active a')
sx = a.attr('href')
print(sx)
首先选取class为item-0和active的节点,再选择其中的a节点。然后调用attr()方法,在方法中传入属性的名称。
如想要获取多个元素就得使用遍历,比如要获取所有li节点的属性:
pq = PyQuery(html)
cla = pq('li')
sx = cla.attr('class')
print(sx)
如果只是这样,那么返回的仅仅只是第一个li节点的属性。
pq = PyQuery(html)
cla = pq('li')
for li in cla.items():
print(li.attr('class'))
在获取某个节点后,可以调用text()方法来获取文本。
from pyquery import PyQuery
html = '''
- first item
- second item
- three item
- fourth item
- fifth item
'''
pq = PyQuery(html)
cla = pq('li')
print(cla.text())
若是想获取HTML文本,那么调用html()方法即可。html()方法返回的是第一个节点内部的HTML文本,而text()方法返回的是所有节点的文本,中间使用空格间隔,是一个字符串。
如果得到的结果是多个节点,又想要获取每个节点的HTML文本,那么可以使用items()进行遍历。
pyquery提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个class,移除某个节点等。
from pyquery import PyQuery
html = '''
- first item
- second item
- three item
- fourth item
- fifth item
'''
pq = PyQuery(html)
li = pq('.item-0.active')
print(li)
# 删除li节点中的active这个class
li.removeClass('active')
print(li)
# 添加li节点中的active这个class
li.addClass('active')
print(li)
from pyquery import PyQuery
html = '''
- first item
- second item
- three item
- fourth item
- fifth item
'''
pq = PyQuery(html)
li = pq('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('changed text')
print(li)
li.html('changed text')
print(li)
由上可知,attr()方法只传入第一个参数的属性名,则是获取这个属性值,如果传入第二个参数可以修改属性值。text()和html()如果不传参数,就是获取文本和HTML文本,如果传入参数,则是进行修改。
html1 = '''
Hello, World
This is a paragraph.
'''
from pyquery import PyQuery
doc = PyQuery(html1)
wrap = doc('.wrap')
wrap.find('p').remove()
print(wrap.text())
在只想提取Hello,World这个字符串时,可先选择p节点,然后使用remove()去掉p节点,然后再调用text()就可以提取出想要的内容。
CSS选择器支持多种多样的伪类选择器,例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等。
html = '''
- first item
- second item
- three item
- fourth item
- fifth item
'''
from pyquery import PyQuery
doc = PyQuery(html)
# 选择第一个li节点
li = doc('li:first-child')
# 选择最后一个li节点
li = doc('li:last-child')
# 选择第二个li节点
li = doc('li:nth-child(2)')
# 选择第三个li之后的li节点
li = doc('li:gt(2)')
# 选择偶数位置的li节点
li = doc('li:nth-child(2n)')
# 选择包含second文本的li节点
li = doc('li:contains(second)')