Python解析庫lxml與xpath用法總結

2021-02-19 Python愛好者社區

轉自:IT共享之家

本文主要圍繞以xpath和lxml庫進行展開:

一、xpath 概念、xpath節點、xpath語法、xpath軸、xpath運算符

二、lxml的安裝、lxml的使用、lxml案例


一、xpath

1.xpath概念

XPath 是一門在 XML 文檔中查找信息的語言。XPath 使用路徑表達式在 XML 文檔中進行導航 。XPath 包含一個標準函數庫 。XPath 是 XSLT 中的主要元素 。XPath 是一個 W3C 標準 。


2.xpath節點

xpath有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。

節點關係:父、子、兄弟、先輩、後輩。


3.xpath語法

xpath語法在W3c網站上有詳細的介紹,這裡截取部分知識,供大家學習。

XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。下面列出了最有用的路徑表達式:

表達式描述nodename選取此節點的所有子節點。/從根節點選取。//從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。.選取當前節點。..選取當前節點的父節點。@選取屬性。

在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:

路徑表達式結果bookstore選取 bookstore 元素的所有子節點。/bookstore選取根元素 bookstore。注釋:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑!bookstore/book選取屬於 bookstore 的子元素的所有 book 元素。//book選取所有 book 子元素,而不管它們在文檔中的位置。bookstore//book選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麼位置。//@lang選取名為 lang 的所有屬性。


謂語(Predicates)

謂語用來查找某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括號中。

在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

路徑表達式結果/bookstore/book[1]選取屬於 bookstore 子元素的第一個 book 元素。/bookstore/book[last()]選取屬於 bookstore 子元素的最後一個 book 元素。/bookstore/book[last()-1]選取屬於 bookstore 子元素的倒數第二個 book 元素。/bookstore/book[position()<3]選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素。//title[@lang]選取所有擁有名為 lang 的屬性的 title 元素。//title[@lang='eng']選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。/bookstore/book[price>35.00]選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。/bookstore/book[price>35.00]/title選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於  35.00。


選取未知節點

XPath 通配符可用來選取未知的 XML 元素。

通配符描述*匹配任何元素節點。@*匹配任何屬性節點。node()匹配任何類型的節點。

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式結果/bookstore/*選取 bookstore 元素的所有子元素。//*選取文檔中的所有元素。//title[@*]選取所有帶有屬性的 title 元素。


選取若干路徑

通過在路徑表達式中使用"|"運算符,您可以選取若干個路徑。

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式結果//book/title | //book/price選取 book 元素的所有 title 和 price 元素。//title | //price選取文檔中的所有 title 和 price 元素。/bookstore/book/title | //price選取屬於 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price  元素。


4.xpath 軸

軸可定義相對於當前節點的節點集。

軸名稱結果ancestor選取當前節點的所有先輩(父、祖父等)。ancestor-or-self選取當前節點的所有先輩(父、祖父等)以及當前節點本身。attribute選取當前節點的所有屬性。child選取當前節點的所有子元素。descendant選取當前節點的所有後代元素(子、孫等)。descendant-or-self選取當前節點的所有後代元素(子、孫等)以及當前節點本身。following選取文檔中當前節點的結束標籤之後的所有節點。namespace選取當前節點的所有命名空間節點。parent選取當前節點的父節點。preceding選取文檔中當前節點的開始標籤之前的所有節點。preceding-sibling選取當前節點之前的所有同級節點。self選取當前節點。


5.xpath運算符

下面列出了可用在 XPath 表達式中的運算符:

運算符描述實例返回值|計算兩個節點集//book | //cd返回所有擁有 book 和 cd 元素的節點集+加法6 + 410-減法6 - 42*乘法6 * 424div除法8 div 42=等於price=9.80如果 price 是 9.80,則返回 true。如果 price 是 9.90,則返回 false。!=不等於price!=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。<小於price<9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。<=小於或等於price<=9.80如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。>大於price>9.80如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。>=大於或等於price>=9.80如果 price 是 9.90,則返回 true。如果 price 是 9.70,則返回 false。or或price=9.80 or price=9.70如果 price 是 9.80,則返回 true。如果 price 是 9.50,則返回 false。and與price>9.00 and price<9.90如果 price 是 9.80,則返回 true。如果 price 是 8.50,則返回 false。mod計算除法的餘數5 mod 21

好了,xpath的內容就這麼多了。接下來我們要介紹一個神器lxml,他的速度很快,曾經一直是我使用beautifulsoup時最鍾愛的解析器,沒有之一,因為他的速度的確比其他的html.parser 和html5lib快了許多。


二、lxml

1.lxml安裝

lxml 是一個xpath格式解析模塊,安裝很方便,直接pip install lxml 或者easy_install lxml即可。


2.lxml 使用

lxml提供了兩種解析網頁的方式,一種是你解析自己寫的離線網頁時,另一種 則是解析線上網頁。

導入包:


1.解析離線網頁:

html=etree.parse('xx.html',etree.HTMLParser())aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')print(aa)

2.解析在線網頁:

from lxml import etreeimport requestsrep=requests.get('https:html=etree.HTML(rep.text)aa=html.xpath('print(aa)

那麼我們怎麼獲取這些標籤和標籤對應的屬性值了,很簡單,首先獲取標籤只需你這樣做:

然後我們可以,比方說,你要獲取a標籤內的文本和它的屬性href所對應的值,有兩種方法,

1.表達式內獲取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/text()')
ab=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')

2.表達式外獲取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]')
aa.text
aa.attrib.get('href')

這樣就完成了獲取,怎麼樣,是不是很簡單了,哈哈哈。


下面再來lxml的解析規則:

表達式描述nodename選取此節點的所有子節點/從當前節點選取直接子節點//從當前節點選取子孫節點.選取當前節點..選取當前節點的父節點@選取屬性


html = lxml.etree.HTML(text)html = lxml.etree.parse('./ex.html',etree.HTMLParser())from lxml import etreeresult = html.xpath('//*')result = html.xpath('//li')result = html.xpath('//li/a')result = html.xpath('//li//a')result = html.xpath('//a[@href="link.html"]/../@class')result = html.xpath('//li[@class="ni"]')result = html.xpath('//li/text()')result = html.xpath('//li/a/@href')result = html.xpath('//li[contains(@class,"li")]/a/text())result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')result = html.xpath('//li[1]/a/text()')result = html.xpath('//li[last()]/a/text()')result = html.xpath('//li[position()<3]/a/text()')result = html.xpath('//li[last()-2]/a/text()')result = html.xpath('//li[1]/ancestor::*')result = html.xpath('//li[1]/ancestor::div')result = html.xpath('//li[1]/attribute::*')result = html.xpath('//li[1]/child::a[@href="link1.html"]')result = html.xpath('//li[1]/descendant::span')result = html.xpath('//li[1]/following::*[2]')result = html.xpath('//li[1]/following-sibling::*')


3.lxml案例

為了偷懶,小編決定還是採用urllib那篇文章的代碼,哈哈哈,機智如我。

好了,今天就講這麼多,大家感興趣的話可以多多關注哦,精彩不停息!!!!

本文參考文獻:

重磅!Python交流已成立

為了給小夥伴們提供一個互相交流的技術平臺,特地開通了Python交流群。群裡有不少技術大神,不時會分享一些技術要點,更有一些資源收藏愛好者不時分享一些優質的學習資料。(免費,不賣課!)


▲長按掃碼

相關焦點

  • python 爬蟲 | 解析庫之 XPath(1)
    我的計劃是通過《python3 網絡爬蟲開發實戰》這本書,寫下自己的讀書筆記。並且在最後我會把今天文章所學到的內容,整理成一個思維導圖,方便大家理清知識點,也方便自己日後複習。話不多說,這周讓我們一起來學習下 python 爬蟲很重要的一個模塊「解析庫的使用」。
  • Python爬蟲利器之Xpath語法與lxml庫的用法
    參考來源lxml用法源自 lxml python 官方文檔,更多內容請直接參閱官方文檔,本文對其進行翻譯與整理。lxmlhttp://lxml.de/index.htmlXPath語法參考 w3schoolw3schoolhttp://www.w3school.com.cn/xpath/index.asp安裝pip install lxml利用 pip 安裝即可
  • 數據提取工具lxml及xpath
    來自:標點符的《數據提取工具lxml及xpath》連結:https://www.biaodianfu.com
  • 10-python爬蟲之lxml庫
    python 官方文檔 http://lxml.de/index.html學習目的利用上節課學習的XPath語法,來快速的定位 特定元素以及節點信息,目的是 提取出 HTML、XML 目標數據如何安裝sudo apt-get install libxml2-dev libxslt1-dev
  • Python爬蟲——Xpath和lxml
    title 元素//book/title | // book/price選取 book 元素的所有 title 和 price 元素//title | //price選取文檔中的所有 title 和 price 元素//bookstore/book/title | //price選取屬於 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素2. lxml
  • 使用XPath語法與lxml模塊提取信息
    lxml 是 一個HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 數據。lxml和正則一樣,也是用C實現的,是一款高性能的 Python HTML/XML 解析器,我們可以利用XPath語法,來快速的定位特定元素以及節點信息。
  • 第64天:XPath 和 lxml
    XPath 和 lxml XPath 全稱為 Xml Path Language,即 Xml 路徑語言,是一種在 Xml 文檔中查找信息的語言。它提供了非常簡潔的路徑選擇表達式,幾乎所有的節點定位都可以用它來選擇。XPath 可以用於 Xml 和 Html,在爬蟲中經常使用 XPath 獲取 Html 文檔內容。
  • xpath語法簡介
    除此之外,xpath表達式也是一種常見用法。xpath稱之為xml路徑語言,是一種基於xml的樹狀結構,來提取特定元素的語言。在python中,最常見的是通過lxml模塊來使用xpath, 基本用法如下>>> from lxml import etree>>> html = etree.parse("K00001.html", etree.HTMLParser())>>>
  • Python爬蟲之Selector的用法
    Selector是基於lxml來構建的,支持Xpath選擇器、CSS選擇器以及正則表達式,功能全面,解析速度和準確度非常高。本節我們將介紹Selector的用法。直接使用Selector是一個可以獨立使用的模塊。
  • Python 爬蟲必殺技:XPath
    除了這一利器外,了解Xpath定位的原理及其基本用法可以大幅提高我們的爬蟲技巧。XPath即XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。現在問題來了,爬蟲是從HTML網頁上抓取信息,你給我介紹XML幹嘛?實際上,XML是一種與HTML很相似的可擴展標記語言,均為具備結構和層次的文檔,我們所關注的文本內容都由各種標籤「包圍」著。
  • 「爬蟲初步」十分鐘學會簡單實用XPath定位教程
    我們使用python3中lxml模塊,它的特點是簡單易用速度快,缺點是在windows環境下安裝起來對新手不太友好。三、簡單快速安裝lxmlLinux/Mac 用戶推薦執行如下shell,就能搞定。pip3 install lxmlWindows用戶如果cmd直接執行上訴語句可能會報一堆錯誤,通過百度查詢錯誤,得到的答案應該是教你安裝一堆VC庫,甚至需要安裝VS這個龐然大物來編譯一個小小的python模塊。正所謂前人栽樹,後人乘涼。
  • python數據抓取3種方法總結
    這篇文章主要給大家介紹了關於python數據抓取的3種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單線程爬蟲和多線程爬蟲的爬取效率。什麼是BeautifulSoup及如何安裝BeautifulSoup是一個解析HTML或XML文件的第三方庫。
  • Python爬蟲實戰 批量下載高清美女圖片
    ,熟悉python寫爬蟲的基本方法:發送請求、獲取響應、解析並提取數據、保存到本地。很多人學習python,不知道從何學起。很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。很多已經做案例的人,卻不知道如何去學習更加高深的知識。
  • python爬蟲技術:如何定位網頁上的內容?xpath定位元素
    在使用python爬蟲的時候,我們需要分析網頁元素,定位我們需要的內容。那麼,如何在python爬蟲過程中定位我們需要的內容的位置呢?接下來我們就來說說xpath定位。 xpath可以定位文檔中的節點。使用xpath可以在無法通過名字和id進行定位的時候,方便高效的查找元素。
  • 一個超詳細的 Python 入門爬蟲實戰案例
    python中提供了多種庫用於網頁解析,例如lxml,BeautifulSoup,pyquery等。每一個工具都有相應的解析規則,但都是把HTML文檔當做一個DOM樹,通過選擇器進行節點和屬性的定位。本次我們使用lxml對網頁進行解析,主要用到了xpath的語法。lxml的執行效率通常也比BeautifulSoup更高一些。
  • 實戰|Python輕鬆實現動態網頁爬蟲(附詳細源碼)
    1from urllib.parse import urlencode2import csv3import random4import requests5import traceback6from time import sleep7from lxml import etree    #lxml為第三方網頁解析庫,強大且速度快
  • Python神技能 | 六張表,搞定 Xpath 語法!
    選取當前節點xpath('./div')選取當前節點下的div節點..選取當前節點的父節點xpath('..'))選取body下的第一個div節點xpath('/body/div[last()]')選取body下最後一個div節點xpath('/body/div[last()-1]')選取body下倒數第二個div節點xpath('/body/div[positon()<3]')選取body下前兩個div節點
  • 四種Python爬蟲常用的定位元素方法對比,你偏愛哪一款?
    基於 BeautifulSoup 的 CSS 選擇器這種方法實際上就是 PyQuery 中 CSS 選擇器在其他模塊的遷移使用,用法是類似的。-24hours-0-0-1-1'response = requests.get(url).textdef xpath_for_parse(response):    selector = html.fromstring(response)    books = selector.xpath("//ul[@class='bang_list clearfix bang_list_mode