前言
以下關于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 | .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