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

Posted on 2019-06-02 22:59  走过萧萧路  阅读(148)  评论(0编辑  收藏  举报

前言

以下关于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’>对象

  • 字符串初始化
    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.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属性的元素
  • 子元素
    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操作

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

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python爬虫(七)—类似jquery的 解析库 pyquery