前言

以下关于pyquery 的学习,主要记录常用的知识点,深入了解的查看官方文档。


pyquery

pyquery允许您对xml文档进行jquery查询。API尽可能与jquery类似。pyquery使用lxml进行快速xml和html操作。


<class ‘pyquery.pyquery.PyQuery’>对象

  • 字符串初始化
    print(doc(‘li’))
    doc其实就是一个pyquery对象,我们可以通过doc可以进行元素的选择,其实这里就是一个css选择器,所以CSS选择器的规则都可以用,直接doc(标签名)就可以获取所有的该标签的内容,如果想要获取class 则doc(’.class_name’),如果是id则doc(’#id_name’)
  • URL初始化
    在pq()这里可以传入url参数也可以传入文件参数,当然这里的文件通常是一个html文件,例如:pq(filename=‘index.html’)
from pyquery import PyQuery as pq

# 字符串初始化
html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
doc = pq(html)
print(doc)
print(type(doc))
print(doc('li'))

# URL初始化
doc = pq(url="http://www.baidu.com",encoding='utf-8')
print(doc('head'))

CSS选择器

  • 样例
    需要注意的是:
  • 第二第三个li会保留前面的空格。
  • doc(’#container .list li’),这里的三者之间的并不是必须要挨着,只要是层级关系就可以
html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
doc = pq(html)
print(doc('#container .list li'))
"""
<li class="item-1">one item</li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
"""

下面是常用的CSS选择器方法:

写法

样例

含义

*

*

选择所有元素

.class

.color

class="color"的所有元素

#id

#info

id="info"的所有元素

element

p

选择所有p标签元素

element,element

div,p

选择所有div标签和所有p标签元素

element element

div p

选择所有div标签下的所有p标签元素

[attribute]

[class] [style]

选择含有class属性下带有style属性的元素

[attribute=value]

[class=“test”] [style]

选择含有class属性为test下带有style属性的元素

  • 子元素
    children,find
    如下代码:
doc = pq(html)
items = doc('.list')
print(items)

lis = items.find('li')
print(lis)

li = items.children()
# 在children里也可以用CSS选择器
li2 = items.children('.active') print(li2)

可以看出通过pyquery找到结果其实还是一个pyquery对象,可以继续查找,上述中的代码中的items.find(‘li’) 则表示查找ul里的所有的li标签。
通过children可以实现同样的效果,并且通过.children方法得到的结果也是一个pyquery对象。

  • 父元素
    parent: 父元素的内容
    parents: 最上层父节点信息即祖先节点的信息
    items = doc(’.list’)
    container = items.parent()
    parents = items.parents()
    .parents查找的时候也可以添加css选择器来进行内容的筛选
  • 兄弟元素
    siblings
    li = doc(’.list .item-0.active’)
    print(li.siblings())
    doc(’.list .item-0.active’) 中的.tem-0和.active是紧挨着的,所以表示是并的关系,这样满足条件的就剩下一个了:thired item的那个标签了
    通过.siblings就可以获取所有的兄弟标签,当然这里是不包括自己的
    在.siblings()里也是可以通过CSS选择器进行筛选

遍历

doc = pq(html)

lis = doc('li').items()
print(type(lis))
for li in lis:
    print(li)
"""
<class 'generator'>
<li class="item-1">one item</li>
         
<li class="item-0 active"><a href="link3.html"><span class="bold">two item</span></a></li>
         
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
"""

通过items()可以得到一个生成器,并且我们通过for循环得到的每个元素依然是一个pyquery对象。
需要注意的是,每个li都隔着一个空行,这是由于html每个li单独一行的原因。但是lis还是只有三个而并非六个

获取信息

  • 获取属性
    pyquery对象.attr(属性名)
    pyquery对象.attr.属性名
from pyquery import PyQuery as pq

html = '''
<div id="container">
    <ul class="list">
         <li class="item-1">one item</li>
         <li class="item-0 active" ><a href="link3.html"><span class="bold">two item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
     </ul>
</div>
'''
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.attr('href'))
print(a.attr.href)
"""
<a href="link3.html"><span class="bold">two item</span></a>
link3.html
link3.html
"""
  • 获取文本
    .text()
  • 获取html
    .html()的方式可以获取当前标签所包含的html信息
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())
print(a.html())
"""
<a href="link3.html"><span class="bold">two item</span></a>
two item
<span class="bold">two item</span>
"""

DOM操作