利用python爬虫(part10)--Xpath节点集与函数
學習筆記
編輯器:Sublime
注意:這里的理論部分是關于XML文檔的,但是介于HTML和XML的相似性,大家可以自行做類比,有的地方我也會用HTML和XML做類比。
上一篇:Xpath與謂詞的愛
文章目錄
- 節點集上使用謂詞
- 節點集上的并運算
- 節點集與函數
節點集上使用謂詞
Xpath允許在Xpath絕對路徑最后尋找出的節點集上使用謂詞,作用是從當前節點集中篩選、過濾出所需要的節點,使用格式為:
(絕對路徑)[謂詞]針對下面的HTML文檔(將這個文檔命名為test12.html),我們來寫一段代碼,直觀感受一下這個知識點(也可能啥也感受不到??):
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Xpath</title> </head> <body><ol><li class="Ra01"><name class = 'Bunny01'>Huang</name><age>8</age><food>carrot</food></li><li class="Ra01"><name class = 'Bunny02'>Bai</name><age>10</age><food>celery</food></li><li class="Ra02"><name class = 'Bunny03'>Jack</name><age>20</age><food>cucumber</food></li><li class="Ra03"><name class = 'Bunny03'>Tim</name><age>30</age><food>straw</food></li></ol> </body> </html>python代碼:
from lxml import etreewith open('test12.html', 'rb') as f:html = f.read().decode('utf-8')#print(html) parse_html = etree.HTML(html)my_xpath = '(/html//li)[1]' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)my_xpath = '/html//li[1]' data_list = parse_html.xpath(my_xpath) print(data_list)Sublime輸出:
[<Element li at 0xe2588b4ec8>] --------------- [<Element li at 0xe2588b4ec8>] [Finished in 0.5s]需要注意的是,python代碼中兩種Xpath表達式得到的結果雖然相同,但是尋找節點的過程是不同的。
節點集上的并運算
Xpath允許將多個Xpath表達式尋找出的節點集用|進行集合的并運算,所得到的的節點集中的節點按照節點在XML中的對應的標記或文本出現的先后順序排列。
來個例子吧,用上面的test12.html為例:
from lxml import etreewith open('test12.html', 'rb') as f:html = f.read().decode('utf-8')#print(html) parse_html = etree.HTML(html)my_xpath = '/html//li[@class="Ra01"]/name/text() | /html//li[@class="Ra01"]/age/text()' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)Sublime輸出:
['Huang', '8', 'Bai', '10'] --------------- [Finished in 0.4s]節點集與函數
為例計算和節點集有關的數據,Xpath語言給出了幾個作用于節點集上的函數。
- count(節點集)
count()函數將返回參數指定的節點集中的節點的個數。
舉個例子,還是用上面的test12.html文件舉例:
from lxml import etreewith open('test12.html', 'rb') as f:html = f.read().decode('utf-8')#print(html) parse_html = etree.HTML(html)my_xpath = 'count(/html//li[@class="Ra01"]/name)' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)my_xpath = 'count(/html//li[contains(food, "c")])' data_list = parse_html.xpath(my_xpath) print(data_list)Sublime輸出:
2.0 --------------- 3.0 [Finished in 0.5s]- sun(節點集)
sum()函數將節點集中的節點所包含的文本轉換為數字,并返回它們的和,如果節點集中的某個節點所包含的文本不能轉換為數字,則sum()會返回NaN
這里為了舉例,我們新構建一個HTML文檔,如下:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Xpath</title> </head> <body>5<p>3<ol><li>1</li><li>2</li></ol></p><p>4</p> </body> </html>python代碼:
from lxml import etreewith open('test13.html', 'rb') as f:html = f.read().decode('utf-8')#print(html) parse_html = etree.HTML(html)my_xpath = 'sum(/html//li/text())' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)my_xpath = 'sum(/html//li)' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)my_xpath = 'sum(/html/body/p)' data_list = parse_html.xpath(my_xpath) print(data_list) print('-'*15)my_xpath = 'sum(/html/body)' data_list = parse_html.xpath(my_xpath) print(data_list)Sublime輸出:
3.0 --------------- 3.0 --------------- 7.0 --------------- nan [Finished in 0.4s]由結果,我們可以得出很多結論,請自行領會(因為博主不知道自己總結的對不對,哈哈哈)。
如有錯誤,請求指出。
Xpath系列暫時更完。
總結
以上是生活随笔為你收集整理的利用python爬虫(part10)--Xpath节点集与函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用python爬虫(part9)--X
- 下一篇: 26款 流媒体服务器开源软件「建议收藏」