python parser,python-PyQuery詳解

 2023-10-25 阅读 31 评论 0

摘要:python parser。 ? lambda python、? ? PyQuery庫也是一個非常強大又靈活的網頁解析庫,如果你有前端開發經驗的,都應該接觸過jQuery,那么PyQuery就是你非常絕佳的選擇,PyQuery 是 Python 仿照 jQuery 的嚴格實現。語法與 jQuery 幾乎完全相同,所

python parser。

?

lambda python、?

?

PyQuery庫也是一個非常強大又靈活的網頁解析庫,如果你有前端開發經驗的,都應該接觸過jQuery,那么PyQuery就是你非常絕佳的選擇,PyQuery 是 Python 仿照 jQuery 的嚴格實現。語法與 jQuery 幾乎完全相同,所以不用再去費心去記一些奇怪的方法了。

官網地址:http://pyquery.readthedocs.io/en/latest/
jQuery參考文檔:?http://jquery.cuishifeng.cn/

初始化

初始化的時候一般有三種傳入方式:傳入字符串,傳入url,傳入文件

字符串初始化

html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''from pyquery import PyQuery as pq
doc = pq(html)
print(doc)
print('--------------------')
print(type(doc))
print('--------------------')
print(doc('li'))

?

結果如下:

<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
--------------------
<class 'pyquery.pyquery.PyQuery'>
--------------------
<li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>

由于PyQuery寫起來比較麻煩,所以我們導入的時候都會添加別名:

from pyquery import PyQuery as pq

這里我們可以知道上述代碼中的doc其實就是一個pyquery對象,我們可以通過doc可以進行元素的選擇,其實這里就是一個css選擇器,所以CSS選擇器的規則都可以用,直接doc(標簽名)就可以獲取所有的該標簽的內容,如果想要獲取class 則doc('.class_name'),如果是id則doc('#id_name')....

URL初始化

from pyquery import PyQuery as pqdoc = pq(url="http://www.baidu.com",encoding='utf-8')
print(doc('head'))

?

?

文件初始化

from pyquery import PyQuery as pqdoc = pq(filename='demo.html')
print(doc('li'))

?

我們在pq()這里可以傳入url參數也可以傳入文件參數,當然這里的文件通常是一個html文件,例如:pq(filename='index.html')

?

基本的CSS選擇器

html = '''
<div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))

?結果:

<li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>

?li 不一定是 .list 的子節點,但一定是子孫節點

這里我們需要注意的一個地方是doc('#container .list li'),這里的三者之間的并不是必須要挨著,只要是層級關系就可以,下面是常用的CSS選擇器方法:

?

?

查找元素

子元素
children,find
代碼例子:

?

html = '''
<div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print('------------------------')
print(items)
print('------------------------')
lis = items.find('li')
print(type(lis))
print('------------------------')
print(lis)
print('------------------------')?

?運行結果如下:

<class 'pyquery.pyquery.PyQuery'>
------------------------
<ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>------------------------
<class 'pyquery.pyquery.PyQuery'>
------------------------
<li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>------------------------

從結果里我們也可以看出通過pyquery找到結果其實還是一個pyquery對象,可以繼續查找,上述中的代碼中的items.find('li') 則表示查找ul里的所有的li標簽

當然這里通過children可以實現同樣的效果,并且通過.children方法得到的結果也是一個pyquery對象

li = items.children()
print(type(li))
print(li)

?

?

同時在children里也可以用CSS選擇器

li2 = items.children('.active') 
print(li2)

?

父元素
parent,parents方法

通過.parent就可以找到父元素的內容,例子如下:

html = '''
<div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)

?

?通過.parents就可以找到祖先節點的內容,例子如下:

?

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)

?

?結果如下:從結果我們可以看出返回了兩部分內容,一個是的父節點的信息,一個是父節點的父節點的信息即祖先節點的信息

<class 'pyquery.pyquery.PyQuery'>
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>

同樣我們通過.parents查找的時候也可以添加css選擇器來進行內容的篩選

parent = items.parents('.wrap')
print(parent)

?

結果:
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>

?

兄弟元素
siblings

?

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())

?結果:

<li class="item-1"><a href="link2.html">second item</a></li><li class="item-0">first item</li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>

代碼中doc('.list .item-0.active') 中的.tem-0和.active是緊挨著的,所以表示是并列的關系,這樣滿足條件的就剩下一個了:thired item的那個標簽了

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings('.active'))

?

結果:

<li class="item-1 active"><a href="link4.html">fourth item</a></li>


這樣在通過.siblings就可以獲取所有的兄弟標簽,當然這里是不包括自己的
同樣的在.siblings()里也是可以通過CSS選擇器進行篩選

?

遍歷

單個元素

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)lis = doc('li').items()
print(type(lis))
for li in lis:print(type(li))print(li)

?

?運行結果如下:從結果中我們可以看出通過items()可以得到一個生成器,并且我們通過for循環得到的每個元素依然是一個pyquery對象。

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>--------------------------
<class 'generator'>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0">first item</li><class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li><class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a></li>

?

獲取信息

獲取屬性
pyquery對象.attr(屬性名)
pyquery對象.attr.屬性名

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
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">third item</span></a>
link3.html
link3.html

所以這里我們也可以知道獲得屬性值的時候可以直接a.attr(屬性名)或者a.attr.屬性名

?

?

獲取文本
在很多時候我們是需要獲取被html標簽包含的文本信息,通過.text()就可以獲取文本信息

?

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())

?結果:

<a href="link3.html"><span class="bold">third item</span></a>
third item

?

?

獲取html
我們通過.html()的方式可以獲取當前標簽所包含的html信息,例子如下:

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(‘------------------’)
print(li.html())

?

?結果如下:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>-------------------
<a href="link3.html"><span class="bold">third item</span></a>

?

?

DOM操作

addClass、removeClass
熟悉前端操作的話,通過這兩個操作可以添加和刪除屬性

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print('---------------')
li.removeClass('active')
print(li)
print('---------------')
li.addClass('active')
print(li)

?

結果:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>---------------
<li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>---------------
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

?

?

attr,css
同樣的我們可以通過attr給標簽添加和修改屬性,
如果之前沒有該屬性則是添加,如果有則是修改
我們也可以通過css添加一些css屬性,這個時候,標簽的屬性里會多一個style屬性

?

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print('---------------')
li.attr('name', 'link')
print(li)
print('---------------')
li.css('font-size', '14px')
print(li)

?

?

?結果如下:

?

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>---------------
<li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third item</span></a></li>---------------
<li class="item-0 active" name="link" style="font-size: 14px"><a href="link3.html"><span class="bold">third item</span></a></li>

?

remove
有時候我們獲取文本信息的時候可能并列的會有一些其他標簽干擾,這個時候通過remove就可以將無用的或者干擾的標簽直接刪除,從而方便操作

html = '''
<div class="wrap">Hello, World<p>This is a paragraph.</p></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())
print('----------------') wrap.find(
'p').remove() print(wrap.text())

??結果如下:

Hello, World
This is a paragraph.
-----------------
Hello, World

?

pyquery中DOM的其他api操作參考:
http://pyquery.readthedocs.io/en/latest/api.html

?

偽類選擇器

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
</div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child') #獲取第一個li標簽
print(li)
print('-----------------------')
li = doc('li:last-child') #獲取最后一個li標簽
print(li)
print('-----------------------')
li = doc('li:nth-child(2)') #獲取第二個li標簽 計數從0開始
print(li)
print('-----------------------')
li = doc('li:gt(2)') #獲取比二大的li標簽
print(li)
print('-----------------------')
li = doc('li:nth-child(2n)') #獲取偶數的li標簽
print(li)
print('-----------------------')
li = doc('li:contains(second)') #獲取包含second文本的li標簽
print(li)

?

結果:

<li class="item-0">first item</li>-----------------------
<li class="item-0"><a href="link5.html">fifth item</a></li>-----------------------
<li class="item-1"><a href="link2.html">second item</a></li>-----------------------
<li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li>-----------------------
<li class="item-1"><a href="link2.html">second item</a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li>-----------------------
<li class="item-1"><a href="link2.html">second item</a></li>

?更多CSS選擇器可以查看??http://www.w3school.com.cn/css/index.asp

http://www.w3school.com.cn/

?

原文:https://www.cnblogs.com/zhaof/p/6935473.html

?

轉載于:https://www.cnblogs.com/LXL616/p/10745884.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/164066.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息