前言
以下关于pyquery 的学习,主要记录常用的知识点,深入了解的查看官方文档。
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 | .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操作
内容略,需要可直接查看官方文档:https://pyquery.readthedocs.io/en/latest/manipulating.html
个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python爬虫(七)—类似jquery的 解析库 pyquery