Web渗透

[Python] pyquery使用

2020-04-23  本文已影响0人  半为花间酒

内容参考:4.3-使用pyquery(崔庆才)
官方文档:http://pyquery.readthedocs.io

内容是以前的学习笔记,内容不全,主观性较大,欢迎参考

1. 初始化对象

from pyquery import PyQuery as pq

doc = pq(html)  # 源代码字符串初始化,最常用
doc = pq(url='http://cuiqingcai.com')  # url初始化
doc = pq(filename='demo.html')  # 文件初始化

2. 基本CSS选择器

初始化后以及每次查找后类型为<class 'pyquery.pyquery.PyQuery'>

doc = pq(html)

items = doc('.list #style p')
lis = items.find('li')  # find() 全部子孙节点
lis = items.children('.active')  # children() 直接子节点
parents = items.parents()  # parents() 全部祖先节点
container = items.parent()  # parent() 直接父节点
li = doc('.list .item-0.active').siblings()  # siblings() 全部兄弟节点 

pyquery的选择结果无论单个还是多个均为PyQuery类型,需要遍历需要用items()

doc = pq(html)
lis = doc('li').items()  # <class 'generator'>
for li in lis:
    print(li)  # <class 'pyquery.pyquery.PyQuery'>

遍历后即可提取信息:

# 获取节点属性
li.attr('href')
li.attr.href
# 以上方法如果有多个则只返回第一个,故需要调用items()

# 也可以调用html()返回html文本,同要需要items()

text()比较特殊,无需遍历就可以获取文本,所有节点取文本之后合并成一个字符串,中间用一个空格分割开。

3. 节点操作

pyquery提供了一系列方法来对节点进行动态修改

<li class="item-0 active"><span class="bold">third item</span></li>
  1. addClass()removeClass()

    可以动态改变节点的class属性

li = pq(html)
li.removeClass('active')
print(li)

li.addClass('active')
print(li)
<li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  1. attr()text()html()

    传入额外参数即为修改。传入一个参数则是获取数值

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 item</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>
  1. remove()

    可以与text()配合使用

li = find('p').remove()

节点操作详细文档:http://pyquery.readthedocs.io/en/latest/api.html

  1. 伪类选择器
    http://www.w3school.com.cn/css/index.asp
li = doc('li:first-child')  # 第一个直接子节点li
li = doc('li:last-child')  # 最后一个直接子节点li
li = doc('li:nth-child(2)') # 第二个直接子节点li
li = doc('li:gt(2)') # 第三个li之后的li节点
li = doc('li:contains(second)') # 包含second文本的li节点
上一篇 下一篇

猜你喜欢

热点阅读