Python爬虫(七)—类似jquery的 解析库 pyquery

in python爬虫 with 0 comment

前言

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

pyquery : https://pyquery.readthedocs.io/en/latest/

JQuery : http://jquery.cuishifeng.cn/

本文参照博客:https://www.cnblogs.com/zhaof/p/6935473.html

pyquery

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

pip install pyquery -i https://pypi.tuna.tsinghua.edu.cn/simple/

from pyquery import PyQuery as pq

<class 'pyquery.pyquery.PyQuery'>对象

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选择器

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.colorclass="color"的所有元素
#id#infoid="info"的所有元素
elementp选择所有p标签元素
element,elementdiv,p选择所有div标签和所有p标签元素
element elementdiv p选择所有div标签下的所有p标签元素
[attribute][class] [style]选择含有class属性下带有style属性的元素
[attribute=value][class="test"] [style]选择含有class属性为test下带有style属性的元素

遍历

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还是只有三个而并非六个

获取信息

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
"""
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操作

内容略,需要可直接查看官方文档:https://pyquery.readthedocs.io/en/latest/manipulating.html

Responses