XPath 的使用

XPath 的使用

?  XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,最初用于搜尋XML文檔,但是也同樣適用于HTML文檔的搜索。前面我們在解析或抽取網頁信息時,使用的是正則表達式,雖然這是一個萬能的方法,但是編寫太麻煩了,一旦表達式寫錯就得不到正確的結果,還有就是可讀性不強,寫完后估計自己也不知道這是啥回事了,所以在爬蟲時可以使用XPath來做相應數據的抽取。

  先列舉XPath的常用規則:

舉例:

//title[@lang='eng']? ?代表選擇所有名稱為 title,同時屬性lang的值為eng的節點。

?

1. 實例

from lxml import etree
text = '''
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html">third item</a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''
# 實例化一個XPath對象  etree.HTML(html文檔)
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))

首先導入lxml庫的etree模塊,然后聲明了一段HTML文本,調用etree.HTML()初始化,這樣就構造了一個XPath解析對象了。

?

2. 所有節點

使用//開頭的XPath規則來選擇所有符合的幾點,以上面的HTML文本為例,如果要選取所有節點,可以這樣實現:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)

這里使用*代表所有節點,也就是整個HTML文本中的所有節點都會被獲取。返回的是一個列表,每個元素都是一個Element類型。

當然,此處匹配也可以指定節點:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li')
print(result)

這里選取的是所有li節點,使用//然后直接加上節點名稱即可,調用時直接使用xpath()方法即可。

?

3. 子節點

可以使用//或/來獲取子節點,前者包括子孫節點,而后者僅僅是直接子節點:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

上面得到的是一個包含所有li元素里面的直接子節點a的一個列表。

?

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//ul//a')

上面獲取到的是所有ul節點中的所有a節點。

注意/和//的區別,/用于獲取直接子節點,//用于獲取子孫節點

?

4. 父節點

使用..可以查找父節點:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

上面獲取到的就是href屬性為link4.html的所有a節點的父節點的class屬性

除此以外,還可以使用parent::來獲取父節點:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')

?

5. 屬性匹配

使用@符號進行屬性過濾,比如要選取class為item-1的li節點,可以這樣實現:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//li[@class="item-1"]')

?

6. 文本獲取

使用text()方法既可獲取節點中的文本(標簽體):

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)

轉載于:https://www.cnblogs.com/jonas-von/p/9178313.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node --- EventProxy的原理

EventProxy來自于Backbone的事件模塊,Backbone的事件模塊是Model、View模塊的基礎功能&#xff0c;在前端有廣泛的使用。它在每個非all事件觸發時都會觸發一次all事件&#xff0c;相關代碼如下: // Trigger an event, firing all bound callbacks. Callbacks are passed the /…

spring項目啟動執行特定方法

1. 方法上加注解PostConstructCompantpublic class InitDemo{ PostConstruct public void init(){ //項目啟動就會執行這個方法 doSomething(); }}2.xml配置init-method<bean id"InitDemo" class"com.xxx.InitDemo" scope"singleton" init-me…

WinCC歸檔數據報表控件

1、背景 WinCC實現報表歷來是老大難&#xff0c;自帶的報表功能不好使&#xff0c;又沒有好用的第三方控件。雖然網上也有很多實現報表的方法&#xff0c;但是毫無例外的要求使用者具有腳本編程功底&#xff0c;HwDataReport的出現將終結這一現象。您無需一行腳本即可完成…

vue數組操作不更新視圖問題

vue 觀察數組的變異方法 更新視圖 push&#xff08;&#xff09; pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.push({ name:css, author:lee }) 有些方法不會改變數組 filter() concat() slice() 返回新數組 需要用 新返回的數組 更新原數組 ap…

java中如何計算兩個時間段的月份差

直接計算&#xff0c;先取得兩個日期的年份和月份&#xff0c;月份差&#xff08;第二年份-第一年份&#xff09;*12 第二月份-第一月份轉載于:https://www.cnblogs.com/pretty-guy/p/3284593.html

Node --- Promise中的多異步協作

當我們需要處理多個異步調用時,應該如何處理呢? //首先假設有2個讀取文件的異步調用,promise1和promise2 var promise1 readFile ("foo.txt", "utf-8"); var promise2 readFile ("bar.txt", "uft-8");//然后,我們可以使用all()方法…

Software-OO 面向對象思維

2017-11-06 11:02:50 所有編程語言的最終目的都是提供一種“抽象”方法。 解決問題的復雜程度直接取決于抽象的種類及質量。這兒的“種類”是指準備對什么進行“抽象”&#xff1f; 匯編是對基礎機器的少量抽象。“命令式”語言是對匯編語言的一種抽象。 &#xff08;Alan Kay …

Go Python 7: 2-Layer Neural Network

轉載于:https://www.cnblogs.com/wordchao/p/9182511.html

LiveWriter測試

test livewriter 轉載于:https://www.cnblogs.com/wujun/archive/2006/11/21/567052.html

第三次實驗報告

項目一 項目分析 本項目目的就是考察我們調用searching類和sorting類中的方法&#xff0c;通過提交測試用例設計情況&#xff08;正常&#xff0c;異常&#xff0c;邊界&#xff0c;正序&#xff0c;逆序&#xff09;確保類的可行性 代碼截圖 排序截圖 運行截圖 項目二 代碼截…

Node --- 構建一個HTTP服務

代碼如下: var http require(http); http.createServer(function (req, res){res.writeHead(200,{Content-Type: text/plain});res.end(Hello World\n); }).listen(1337, 127.0.0.1); console.log(Server running at http://127.0.0.1:1337);運行如下&#xff1a; 詳情見《深…

python中#!/usr/bin/python與#!/usr/bin/env python的區別

目的是在運行python腳本的時候告訴操作系統我們要用python解釋器去運行py腳本 所以我們在第一句往往會寫如下兩句中的其中一句&#xff1a; #!/usr/bin/python或 >#!/usr/bin/env python 就是說在沒有在執行程序時指出用什么程序運行py腳本時,系統會去調用python程序來執行。…

頁面級緩存@ OutputCache

最近要用到緩存&#xff0c;所以才去找了相關資料&#xff0c;開始在一個用戶控件頭加入 OutputCache指令&#xff0c;發現第一次進入頁面是對了&#xff0c;第二次再進入時就出錯了。郁悶……這里 OutputCache的一些參數說明: 以聲明的方式控制 ASP.NET 頁或頁中包含的用戶控件…

$.ajax的一些坑啊

1.如果發送ajax返回的數據為json務必設置其 Content-Type:application/json;charsetUTF-8不然會導致其success:function(data)中的data返回的為字符串&#xff0c;導致后面的文本解析失敗 轉載于:https://www.cnblogs.com/lonecloud/p/7794670.html

JavaScript --- 解析Cookie

var parseCookie function(cookie){var cookies {};if(!cookie){return cookies;}var list cookie.split(;);for (var i0;i<list.length;i){var pair list[i].split();cookies[pair[0].trim()] pair[1];}return cookies; };

DDR3和eMMC區別

DDR3內存條和eMMC存儲器區別&#xff1a; 1. 存儲性質不同&#xff1b;2. 存儲容量不同&#xff1b;3. 運行速度不同&#xff1b;4. 用途不同。 具體區別如下&#xff1a; 1、存儲性質不同&#xff1a;eMMC是非易失性存儲器&#xff0c;不論在通電或斷電狀態下&#xff0c;數據…

Sql Server臨時表中插入標示列

select ROW_NUMBER() over( order by sort_id asc) as rows,* into #tmp_tb from tb_district 其中sort_id為您原表的排序列。 tb_district為要操作的表。 轉載于:https://www.cnblogs.com/daretodream/archive/2013/04/03/2997800.html

17秋 軟件工程 團隊第五次作業 Alpha Scrum3

17秋 軟件工程 團隊第五次作業 Alpha Scrum3 今日完成的任務 杰麟&#xff1a;java后端學習&#xff1b;世強&#xff1a;Android的部門基礎信息模塊的信息顯示和對接后臺&#xff1b;港晨&#xff1a;后臺管理登陸界面ui設計&#xff1b;樹民&#xff1a;超級管理員Web后端數據…

Node --- Basic認證

Basic認證: 當客戶端與服務器端進行請求時,允許通過用戶名和密碼實現的一種身份認證方式. // 如果一個頁面需要Basic認證,它會檢查請求報文頭中的Authorization字段的內容,該字段的值由認證方式和加密值構成: $ curl -v "http://user:passwww.baidu.com/" > GET …

用列表+for循環生成乘法口訣表

1 # 結合一下列表生成&#xff0c; 準備設計乘法表2 # numlist [1,2,3,4,5]3 # [pow(i,3) for i in numlist]4 # ## [1, 8, 27, 64, 125]5 # [[pow(i,2), pow(i,3), pow(i,4) ] for i in numlist]6 # ## [[1, 1, 1], [4, 8, 16], [9, 27, 81], [16, 64, 256], [25, 125, 625]]…