成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python Xpath語法的使用

瀏覽:81日期:2022-07-04 10:20:24

一、XMl簡介

(一)什么是 XML

XML 指可擴展標記語言(EXtensible)XML 是一種標記語言,很類似 HTML。XML 的設計宗旨是傳輸數據,而非顯示數據。XML 的標簽需要我們自行定義。XML 被設計為具有自我描述性。XML 是 W3C 的推薦標準。W3School 官方文檔:http://www.w3school.com.cn/xml/index.asp

(二)XML 和 HTML 的區別

他們兩者都是用于操作數據或者結構數據,在結構上大致相同的,但他們在本質上卻存在著明顯的區別。

數據格式 描述 設計目標 XML Extensible Markup Language ( 可擴展標記語言) 被設計為傳輸和存儲數據,其焦點是數據的內容。 HTML HyperText Markup Language(超文本標記語言) 顯示數據以及如何更好顯示數據。 HTML DOM Document Object Model for HTML(超文本標文檔對象模型) 通過 HTML DOM,可以訪問所有的 HTML 元素, 連同它們所包含的文本和屬性。可以對其中的內容進行修改和刪除,同時也可以創建新的元素。

(三)XML 的節點關系

<?XML version=’1.0’ encoding=''utf-8><book category='cooking'> <title lang='en'>Harry Potter</title> <author>J K.Rowling</author> <year>2005</year> <price>29.00</price></book>

1.父(Parent)每個元素以及屬性都有一個父。上面是一個簡單的 XML 例子中,book 元素是 title、author、year 以及 price 元素的父

2.子(Children)元素節點可有零個、一個或多個子元素。在上面的例子中,title、author、year 以及 price 元素都是 book 元素的子元素

3. 同胞(Sibling)擁有相同的父的節點。在上面的例子中,title、author、year 以及 price 元素都是同胞

4. 先輩(Ancestor)某節點的父、父的父,等等。在上面的例子中,title 元素的先輩是 book 元素和 bookstore元素

5. 后代(Descendant)某個節點的子,子的子等等。在上面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:

二、XPATH

XPath (XML Path Language) 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷。

(一)選取節點

XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和我們在常規的電腦文件系統中看到的表達式非常相似。下面列出了最常用的路徑表達式:

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

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

路徑表達式 描述 bookstore 選取 bookstore 元素的所有子節點 /bookstore 選取根元素 bookstore。代表元素的絕對路徑。 bookstore/book 選取屬于 bookstore 的子元素的所有 book 元素。 //book 選取所有 book 子元素,而不管它們在文檔中的位置 bookstore//book 選擇屬于 booksore 元素的后代所有的 book 元素,而不管他們位于 bookstore 之下的什么位置。 //@lang 選取名為 lang 的所有屬性。 text() 取標簽當中的值

(二)謂語(Predicates)

謂語用來查找某個特定的節點或者包含某個指定的值的節點,被嵌在方括號中。在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:

路徑表達式 描述 /bookstore/book[l] 選取屬于 bookstore 子元素的第一個 book 元素。 /bookstore/book[last()] 選取屬于 bookstore 子元素的最后一個 book 元素。 /bookstore/book[last()-1] 選取屬于 bookstore 子元素的倒數第二個 book 元素。 /bookstore/book[position()<2] 選最前面的一個屬于 bookstore 元素的子元素的 book 元素。 //title[@lang] 選取所有屬性名為 lang 的屬性的 title 元素。 //titlel@lang=‘eng’] 選取所有 tltle 元素,且這些元素有屬性值為 eng 的 lang 屬性。

(三)選取未知節點

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

通配符 描述 * 匹配任何元素節點。 @* 匹配任何屬性節點。

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

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

(四)選取若干路徑

通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式 描述 //book/title //book/price //title //price //price 選取文檔中所有的 price 元素。

三、lxml 模塊

(一)lxml 簡介與安裝lxml 是一個 HTML/XML 的解析器,主要的功能是如何解析和提取 HTML/XML 數據。我們可以利用之前學習的 XPath 語法,來快速的定位特定元素以及節點信息。安裝方法:pip install lxml

(二)lxml 初步使用

1、解析HTML字符串

from lxml import etreetext = '''<div> <ul> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link1.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >first item</a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link2.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >second item</a></li> <li class='item-inactive'><a href='http://www.piao2010.com/bcjs/link3.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >third item</a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link4.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fourth item</a></li> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link5.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fifth item</a> </ul></div>'''html = etree.HTML(text)result = etree.tostring(html,pretty_print=True).decode(’utf-8’)print(result)from lxml import etreetext = '''<div> <ul> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link1.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >first item</a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link2.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >second item</a></li> <li class='item-inactive'><a href='http://www.piao2010.com/bcjs/link3.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' ><span class='bold'>third item</span>></a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link4.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fourth item</a></li> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link5.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fifth item</a></li> </ul></div>'''# 初始化一個Xpath解析對象html = etree.HTML(text)# 解析對象輸出代碼 是一個bytes類型result = etree.tostring(html,encoding=’utf-8’)print(type(html)) # <class ’lxml.etree._Element’>print(type(result)) # <class ’bytes’>print(result.decode(’utf-8’))

小結:lxml 可以自動修正 html 代碼,例子里不僅補全了 li 標簽,還添加了 body,html 標簽。

2.、lxml 文件讀取

from lxml import etreetext = '''<div> <ul> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link1.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >first item</a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link2.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >second item</a></li> <li class='item-inactive'><a href='http://www.piao2010.com/bcjs/link3.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' ><span class='bold'>third item</span>></a></li> <li class='item-1'><a href='http://www.piao2010.com/bcjs/link4.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fourth item</a></li> <li class='item-0'><a href='http://www.piao2010.com/bcjs/link5.html' rel='external nofollow' rel='external nofollow' rel='external nofollow' >fifth item</a></li> </ul></div>'''# 初始化一個Xpath解析對象html = etree.HTML(text)# 解析對象輸出代碼 是一個bytes類型result = etree.tostring(html,encoding=’utf-8’)print(type(html)) # <class ’lxml.etree._Element’>print(type(result)) # <class ’bytes’>print(result.decode(’utf-8’))

除了直接讀取字符串,lxml 還支持從文件里讀取內容。我們新建一個 hello.html 文件,再利用 etree.parse()方法來讀取文件。注意:從文件中讀取數據,要求文件內容符合 xml 格式,如果標簽缺失,則不能正常讀取。

四、XPath 節點信息解析:

# 安裝lxml: pip install lxml# 1. 導入etree: 兩種導入方式# 第一種: 直接導入from lxml import etree# 注意: 此種導入方式,可能會導致報錯(etree下面會出現紅色波浪線,不影響正常使用)# 第二種: # from lxml import html# etree = html.etreestr = ’<bookstore>’ ’<book>’ ’<title lang='bng' src='https://www.baidu.com'>Harry Potter</title>’ ’<price>29.99</price>’ ’</book>’ ’<book>’ ’<title lang='ang'>Learning XML</title>’ ’<price>39.95</price>’ ’</book>’ ’<book>’ ’<title lang='cng'>西游記</title>’ ’<price>69.95</price>’ ’</book>’ ’<book>’ ’<title lang='dng' src='https://www.jd.com'>水滸傳</title>’ ’<price>29.95</price>’ ’</book>’ ’<book>’ ’<title lang='dng' src='https://www.jd.com'>三國演義</title>’ ’<price>29.95</price>’ ’</book>’ ’</bookstore>’# 2. etree.HTML() 將字符串轉換成HTML元素對象,可以自動添加缺失的元素html = etree.HTML(str) # <Element html at 0x1e17b839708> 是一個el對象# print(html)# 3. 方法:# 3.1 tostring() 查看轉換之后的內容(二進制類型)# 如果想要查看字符串,需要解碼# 如果想要顯示漢字,需要先編碼,再解碼# content = etree.tostring(html,encoding=’utf-8’)# print(content.decode())# 3.2 xpath()方法 作用:提取頁面數據,返回值是一個列表# xpath的使用一定是建立在etree.HTML()之后的內容中的# xpath是如何來提取頁面數據的?# 答:使用的是路徑表達式# 3.2.1 xpath路徑分為兩種:# 第一種: / 代表一層層的查找,如果/存在于開頭,代表根路徑# bookstore = html.xpath(’/html/body/bookstore’)# print(bookstore) # [<Element bookstore at 0x2dd535efb88>]# 第二種: // 任意路徑 焦點在元素身上# 例如:查找bookstore標簽# bookstore = html.xpath(’//bookstore’)# print(bookstore) # [<Element bookstore at 0x1639054fdc8>]# 第一種和第二種結合# 例如:查找所有book標簽# book = html.xpath(’//bookstore/book’)# print(book) # [<Element book at 0x2737fd7fa48>, <Element book at 0x2737fd7fc88>, <Element book at 0x2737fd7fcc8>, <Element book at 0x2737fd7fd08>, <Element book at 0x2737fd7fd88>]# 3.2.2 /text() 獲取標簽之間的內容# 例如:獲取所有title標簽的內容# 步驟:# 1. 找到所有title標簽# 2. 獲取內容# title = html.xpath(’//book/title/text()’)# print(title) # [’Harry Potter’, ’Learning XML’, ’西游記’, ’水滸傳’, ’三國演義’]# 3.3 位于 使用[] 可以理解成條件# 3.3.1 [n] 代表獲取第n個元素,n是數字,n<=1# 例如: 獲取第二個title標簽# title = html.xpath(’//book[2]/title/text()’)# title1 = html.xpath(’//title[2]/text()’)# print(title) # [’Learning XML’]# print(title1) # []# last() 獲取最后一個# 同理: last()-1 獲取倒數第二個# 例如: 獲取最后一本書的title標簽之間的內容# title = html.xpath(’//book[last()]/title/text()’)# title1 = html.xpath(’//book[last()-1]/title/text()’)# print(title) # [’三國演義’]# print(title1) # [’水滸傳’]# 3.3.2 position() 位置,范圍 支持 > / < / = / >= / <= / !=# 例如: 獲取最后兩本書的title標簽之間的內容# 步驟:# 1. 先獲取后兩本書# 2. 獲取內容# title = html.xpath(’//book[position()>3]/title/text()’)# print(title) # [’水滸傳’, ’三國演義’]# ? title = html.xpath(’//book[position()>last()-2]/title/text()’)# print(title) # [’水滸傳’, ’三國演義’]# 3.3.3 獲取屬性值:@屬性名# 例如: 獲取lang屬性值為cng的title標簽的內容# title = html.xpath(’//book/title[@lang='cng']/text()’)# print(title) # [’西游記’]# 例如: 獲取包含src屬性得title標簽的內容# title = html.xpath(’//book/title[@src]/text()’)# print(title) # [’Harry Potter’, ’水滸傳’, ’三國演義’]# 例如: 獲取包含屬性的title標簽的內容# title = html.xpath(’//book/title[@*]/text()’)# print(title) # [’Harry Potter’, ’Learning XML’, ’西游記’, ’水滸傳’, ’三國演義’]# 例如: 獲取最后一個title標簽的src屬性的值# title = html.xpath(’//book[last()]/title/@src’)# print(title) # [’https://www.jd.com’]# 例如: 獲取所有包含src屬性的標簽之間的內容# node = html.xpath(’//*[@src]/text()’)# print(node) # [’Harry Potter’, ’水滸傳’, ’三國演義’]# 3.4 and 與 連接的是謂語(條件)# 例如: 獲取lang='dng'并且class='t1'的title標簽的內容# title = html.xpath(’//book/title[@lang='dng' and @class='t1']/text()’)# title1 = html.xpath(’//book/title[@lang='dng'][@class='t1']/text()’)# print(title) # [’三國演義’]# print(title1) # [’三國演義’]# 3.5 or 或 連接謂語# 例如: 查找lang='cng'或者lang='bng'的title標簽的內容# title = html.xpath(’//book/title[@lang='cng' or @lang='bng']/text()’)# print(title) # [’Harry Potter’, ’西游記’]# 3.6 | 連接路徑# 例如: 獲取所有title標簽和price標簽之間的內容# title = html.xpath(’//title/text() | //price/text()’)# print(title) # [’Harry Potter’, ’29.99’, ’Learning XML’, ’39.95’, ’西游記’, ’69.95’, ’水滸傳’, ’29.95’, ’三國演義’, ’29.95’]# 3.8 parse() 作用:從文件中讀取數據# 注意: 讀取的文件,必須滿足xml格式**(不存在單標簽,全部都是上標簽)**content = etree.parse(’test.html’)# print(content) # <lxml.etree._ElementTree object at 0x000001DC5CF5ED08>res = etree.tostring(content,encoding=’utf-8’)print(res.decode()) <!DOCTYPE html><html lang='en'><head> <title>test</title></head><body> <h1> 這是一個html </h1></body></html>

到此這篇關于python Xpath語法的使用的文章就介紹到這了,更多相關python Xpath語法內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品国产sm最大网站| 国产精品日韩成人| 欧美激情在线免费观看| 福利一区二区在线观看| 欧美性猛交xxxxxx富婆| 香蕉久久一区二区不卡无毒影院| 欧美日韩在线高清| 亚洲精品一区在线观看| 免播放器亚洲一区| 久久天天狠狠| 午夜精品一区二区三区免费视频| 亚洲少妇一区| 亚洲欧美一区二区不卡| 狠狠入ady亚洲精品| 欧美激情一区二区| 99视频一区二区| 日韩欧美国产综合一区 | 国产精品va| 国产日韩欧美一区二区三区综合 | 性欧美大战久久久久久久久| 新狼窝色av性久久久久久| 亚洲妇女屁股眼交7| 亚洲综合精品| 亚洲第一福利视频在线| 美女91精品| 午夜精品久久久久影视| 久久久久久9| 日av在线不卡| 欧美性videosxxxxx| 久久 天天综合| 在线播放欧美女士性生活| 国模无码大尺度一区二区三区| 欧美午夜精品电影| 精品一区二区三区香蕉蜜桃| 欧美日韩国产系列| 国产精品1区2区| 日韩一区二区三区免费看| 成人一道本在线| 久久久久久久综合| 伊人久久久大香线蕉综合直播| 亚洲精品国久久99热| 国产乱码精品一区二区三区不卡| 亚洲高清免费在线| 欧美在线观看18| 国产一区二区三区综合| 日韩视频一区二区三区在线播放| 9i在线看片成人免费| 国产无一区二区| 1024成人| 亚洲福利一二三区| 欧美日韩一区二区三区四区五区 | 亚洲精品国产成人久久av盗摄| 国产精品主播| 日本不卡123| 日韩欧美国产一区在线观看| 欧美激情第二页| 亚洲男人天堂av网| 色丁香久综合在线久综合在线观看| 久久99精品视频| 精品久久久久久久久久久久久久久 | 亚洲欧美日韩综合一区| 美女视频黄a大片欧美| 91精品国产一区二区三区| 欧美一区精品| 亚洲精品国产a久久久久久 | 黄色精品一二区| 久久综合成人精品亚洲另类欧美 | 日韩不卡手机在线v区| 日韩欧美一区中文| 国内精品久久国产| 亚洲国产成人av| 欧美精品一卡二卡| 91麻豆精品在线观看| 亚洲一区二区三区视频在线播放| 在线国产电影不卡| 91玉足脚交白嫩脚丫在线播放| 亚洲美女淫视频| 欧美日本乱大交xxxxx| 午夜精品一区二区在线观看 | 97久久超碰国产精品电影| 亚洲精品免费在线| 欧美日韩亚洲国产综合| bt欧美亚洲午夜电影天堂| 亚洲免费成人av| 666欧美在线视频| 国产一区二区无遮挡| 免费观看成人av| 亚洲国产精品二十页| 欧美性猛交xxxx黑人交| 国产精品videossex久久发布| 日韩精品五月天| 久久精品人人做| 老牛影视一区二区三区| 99久久久国产精品免费蜜臀| 亚洲午夜免费视频| 久久婷婷国产综合国色天香| 国产精品久久久免费| 国产成人日日夜夜| 亚洲宅男天堂在线观看无病毒| 91麻豆精品国产91久久久久久久久| 欧美日本国产精品| 免费在线观看精品| 国产欧美一区二区精品性色| 日本精品视频一区二区| 欧美尤物一区| 久久精品国产澳门| 国产精品久久久久久福利一牛影视 | 欧美日韩免费高清一区色橹橹| 欧美一区二区三区另类 | 中文字幕一区二区三区色视频| 欧美三级日韩在线| 激情视频一区二区三区| 国产一区二区三区四区五区美女| 亚洲婷婷综合色高清在线| 91精品国产麻豆| 香港久久久电影| 色综合视频一区二区三区高清| 日产欧产美韩系列久久99| 欧美国产在线观看| 欧美精品视频www在线观看| 一区二区福利| 亚洲国产精品一区二区久久 | 久久精品999| 亚洲精品日日夜夜| 精品粉嫩超白一线天av| 日本韩国欧美在线| 亚洲精选在线| www.欧美日韩| 麻豆久久久久久久| 亚洲精品第1页| 久久久99精品久久| 欧美久久一二区| 欧美成人中文| 国产一区二区电影| 亚洲成人动漫精品| 国产精品久久久久影院老司| 91精品国产全国免费观看| 麻豆成人小视频| 亚洲黄色视屏| 91蜜桃在线观看| 懂色av一区二区夜夜嗨| 蜜臀精品一区二区三区在线观看 | 亚洲图片欧美色图| 国产精品久久网站| 久久综合九色综合欧美98| 91精品国产综合久久久久久| 色悠久久久久综合欧美99| 99www免费人成精品| 欧美日韩亚洲免费| 99久久综合狠狠综合久久| 国产精品综合在线视频| 麻豆国产精品官网| 日韩中文字幕亚洲一区二区va在线| 亚洲精品日日夜夜| 国产精品三级av| 国产日韩三级在线| 久久蜜桃一区二区| 精品欧美一区二区在线观看| 91麻豆精品国产91久久久资源速度 | 在线精品福利| 91丨porny丨在线| 国产99精品视频| 国产在线精品免费av| 日韩av一区二区三区| 亚洲国产视频在线| 一区二区成人在线观看| 亚洲色图清纯唯美| 中文字幕一区二区三区四区不卡| 国产欧美一区二区精品久导航| 欧美精品一区男女天堂| 日韩三级高清在线| 51午夜精品国产| 欧美精品一卡二卡| 91精品国产综合久久久久久久 | 国产精品永久| 国产精品一区二区欧美| 国产偷久久久精品专区| 樱桃成人精品视频在线播放| 国产精品初高中精品久久| 国产一区二区三区四区老人| 亚洲夜间福利| 99精品国产在热久久| 国产日韩在线一区二区三区| 国产婷婷精品| 六月婷婷久久| 久久久精品性| 欧美综合一区二区| 欧美日韩精品免费观看视频| 欧美久久高跟鞋激| 日韩视频不卡中文| 亚洲精品一区二区三区精华液 | 午夜精品福利视频网站| 丝袜亚洲精品中文字幕一区| 亚洲不卡在线观看| 日韩国产一二三区| 久久精品国产99| 国产盗摄精品一区二区三区在线| 从欧美一区二区三区| 97久久超碰国产精品| 国内精品久久久久国产盗摄免费观看完整版 |