国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

lxml&xpath一站式教學(xué)

這篇具有很好參考價值的文章主要介紹了lxml&xpath一站式教學(xué)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

XPath定義

XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進(jìn)行遍歷。它最初是用來搜尋 XML 文檔的,現(xiàn)在它同樣適用于 HTML 文檔的搜索

XPath 概覽

XPath 的選擇功能十分強(qiáng)大,它提供了非常簡潔明了的路徑選擇表達(dá)式 。 另外,它還提供了超過100 個內(nèi)建函數(shù),用于字符串、數(shù)值、時間的匹配以及節(jié)點、序列的處理等 。 幾乎所有我們想要定位的節(jié)點,都可以用 XPath 來選擇 。

安裝lxml

pip install lxml

初步使用

讀取本地html文件
etree模塊會自動修正HTML文件中缺失的內(nèi)容

from lxml import etree

# 讀取html文檔,字符串
fp = open("index.html",'r',encoding='utf-8')
html = fp.read()

# 實例化XPath解析對象,可以將字符串轉(zhuǎn)換成Element對象
tree = etree.HTML(html)
print(tree)

web網(wǎng)站html文件

from lxml import etree
import requests

html = requests.get(url="https://www.baidu.com")
tree = etree.HTML(html.text)
print(tree)

xpath 常用表達(dá)式

xpath的使用其實就是根據(jù)表達(dá)式找出文檔中所有符合條件的內(nèi)容

表達(dá)式 描述
nodename 選取此節(jié)點的所有子節(jié)點
/ 從當(dāng)前節(jié)點選取直接子節(jié)點
// 從當(dāng)前節(jié)點選取子孫節(jié)點
. 選取當(dāng)前節(jié)點
.. 選取當(dāng)前節(jié)點的父節(jié)點
@ 選取屬性
* 通配符,選擇所有元素節(jié)點與元素名
[@attrib] 選取具有給定屬性的所有元素
[@attrib=‘value’] 選取給定屬性具有給定值的所有元素
[tag] 選取所有具有指定元素的直接子節(jié)點
[tag=‘text’] 選取所有具有指定元素并且文本內(nèi)容是text節(jié)點

lxml&xpath一站式教學(xué)

獲取所有節(jié)點

fp = open("index.html",'r',encoding='utf-8')
html = fp.read()
tree = etree.HTML(html)
result = tree.xpath("http://*") # 獲取所有節(jié)點
print(result)

輸入:
lxml&xpath一站式教學(xué)
解釋:

// 獲取當(dāng)前節(jié)點的子孫節(jié)點 * 代表匹配所有節(jié)點,//* 就代表獲取當(dāng)前節(jié)點的所有子孫節(jié)點

獲取子孫節(jié)點中的div節(jié)點

# 獲取當(dāng)前節(jié)點下的所有div的子孫節(jié)點
result = tree.xpath("http://div") 

輸出:
lxml&xpath一站式教學(xué)

獲取子節(jié)點

現(xiàn)在要獲取<html>下的head節(jié)點以及head節(jié)點里面的title節(jié)點

result = tree.xpath("/html/head") # 獲取head節(jié)點
print(result)

result = tree.xpath("/html/head/title") # 獲取title節(jié)點
print(result)

輸出:lxml&xpath一站式教學(xué)
解釋:這里我們采用的是 /來進(jìn)行獲取的,每次獲取一級,依次獲取到目標(biāo)元素

獲取父親節(jié)點

通過 / 、//可以獲取子節(jié)點或者子孫節(jié)點,現(xiàn)在我學(xué)習(xí)如何通過子節(jié)點找父節(jié)點

找出li節(jié)點的父節(jié)點,找出li節(jié)點的父節(jié)點的父親節(jié)點

result = tree.xpath("http://li/..")
print(result)

result = tree.xpath("http://li/../..") 
print(result)

輸出:
lxml&xpath一站式教學(xué)
通過輸出我們可以看到li的父節(jié)點是ul, ul的父節(jié)點是div
解釋:
先通過 //li找到li節(jié)點在通過 .. 找到父節(jié)點

屬性匹配

lxml&xpath一站式教學(xué)
找出li標(biāo)簽中class=item01的元素

result = tree.xpath('/html/body/div/ul/li[@class="item01"]')
print(result)

輸出:
lxml&xpath一站式教學(xué)
選擇屬性中有id的

result = tree.xpath('/html/body/div/ul/li[@id]')
print(result)

輸出:
lxml&xpath一站式教學(xué)
解釋:
通過@ 我們可以根據(jù)屬性尋找節(jié)點,可以指定屬性值,也可以直接根據(jù)屬性進(jìn)行查詢

獲取文本

lxml&xpath一站式教學(xué)
獲取li中的文字

# 直接獲取li標(biāo)簽下面所有子孫元素的文字
result = tree.xpath('/html/body/div/ul/li//text()')
print(result)
# 通過尋找子元素的方式,一級一級的找到文字
result2 = tree.xpath('/html/body/div/ul/li/a/text()')
print(result2)

輸出:
lxml&xpath一站式教學(xué)
通過輸出的內(nèi)容分析我們能夠看出,直接通過li//text()獲取到文本內(nèi)容會比li/a/text()獲取的多,因為li//text()或獲取li中所有的文字包括換行,而li/a/text()只會找出a標(biāo)簽下所有的文字

獲取屬性

有時候我們在進(jìn)行數(shù)據(jù)解析的時候會需要一些屬性值,例如我們在寫爬蟲項目的時候我們往往需要url鏈接

找出liid=id01 a標(biāo)簽中 href的值

result = tree.xpath('/html/body/div/ul/li[@id="id01"]/a/@href')
print(result)

輸出
lxml&xpath一站式教學(xué)
解釋:
屬性值的獲取也是通過@ 來進(jìn)行實現(xiàn)的,@href:獲取href的屬性值

屬性多值匹配

lxml&xpath一站式教學(xué)

在實際的項目中會出現(xiàn)一個屬性值有多個值的情況出現(xiàn),例如class在實際項目中會有多個值的情況出現(xiàn)

獲取class中含有class_val1的節(jié)點

# 這種方式是錯誤的,并不會找出對應(yīng)的class中含有class_val1的節(jié)點
tree.xpath('/html/body/div/ul/li[@class="class_val1"]')

# 正確的做法 使用contains()函數(shù)
# 獲取class中含有class_val1的節(jié)點
result = tree.xpath('/html/body/div/ul/li[contains(@class,"class_val1")]')
print(result)

輸出:
lxml&xpath一站式教學(xué)
解釋:
contains()函數(shù) 獲取指定屬性中包含某一屬性值的節(jié)點
使用方式contains(@屬性,"屬性值")

多屬性匹配

有時候我還需要根據(jù)多個屬性來確定一個節(jié)點

找出liclass中含有item01且id=id01a標(biāo)簽中的文本

result = tree.xpath('/html/body/div/ul/li[contains(@class,"item01") and @id="id01"]/a/text()')
print(result)

lxml&xpath一站式教學(xué)
解釋:
使用 and可以連接多個條件值

拓展類似的操作符還有

運算符 描述 實例 返回值
or age=10 or age=20 如果age等于10或者等于20則返回true反正返回false
and age>19 and age<21 如果age等于20則返回true,否則返回false
mod 取余 5 mod 2 1
| 取兩個節(jié)點的集合 //book | //cd 返回所有擁有book和cd元素的節(jié)點集合
+ 5+4 9
- 5-4 1
* 5*4 20
div 除法 6 div 3 2
= 等于 age=10 true
!= 不等于 age!=10 true
< 小于 age<10 true
<= 小于或等于 age<=10 true
> 大于 age>10 true
>= 大于或等于 age>=10 true

按序選擇

在有些時候我們在選擇的時候可能匹配了多個節(jié)點,但是我們可能只需要其中的某些節(jié)點,xpath為我們提供了可以 根據(jù)索引進(jìn)行取值的操作。

注意在xpath中索引從1開始,并不是以0開始

lxml&xpath一站式教學(xué)
獲取第一個li標(biāo)簽
獲取前三個li標(biāo)簽
獲取最后一個li標(biāo)簽

# 獲取第一個`li`標(biāo)簽
result = tree.xpath('/html/body/div/ul/li[1]')
print(result)
# 獲取前三個`li`標(biāo)簽
result2 = tree.xpath('/html/body/div/ul/li[position()<4]')
print(result2)
# 獲取最后一個`li`標(biāo)簽
result3 = tree.xpath('/html/body/div/ul/li[last()]')
print(result3)

輸出:
lxml&xpath一站式教學(xué)
解釋:
position() 返回當(dāng)前正在被處理的節(jié)點的 index 位置
last() 返回所有匹配節(jié)點的最后一個的索引

節(jié)點軸選擇

軸可定義相對于當(dāng)前節(jié)點的節(jié)點集。
(定義有點抽象,看完下面的實例就懂了)

獲取li的所有的祖先節(jié)點

result = tree.xpath('/html/body/div/ul/li/ancestor::*')
print(result)

輸出:
lxml&xpath一站式教學(xué)
獲取li祖先節(jié)點中的div

result = tree.xpath('/html/body/div/ul/li/ancestor::div')
print(result)

輸出:
lxml&xpath一站式教學(xué)
獲取li節(jié)點的子孫元素

result = tree.xpath('/html/body/div/ul/li/child::*')
print(result)

獲取li節(jié)點的子孫元素中a標(biāo)簽中href="./index.html"

result = tree.xpath('/html/body/div/ul/li/child::a[@href="./index.html"]')
print(result)

解釋:
ancestor、child都稱作軸 ancestor軸就是相對當(dāng)前節(jié)點的所有祖先節(jié)點的集合,child軸就是相對當(dāng)前節(jié)點的子孫節(jié)點的集合,而后面::后面跟著是對軸節(jié)點集合的操作 *代表匹配所有的節(jié)點 div 代表取節(jié)點集中的div節(jié)點,
另外還可以使用其他的篩選條件進(jìn)行篩選child::a[@href="./index.html"]:選取子孫節(jié)點中a節(jié)點href="./index.html"的節(jié)點,上面學(xué)習(xí)的篩選方式都可以在這里使用。

類似這樣的軸還有很多

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

xpath軸的使用方式都是一樣的,在實際中我們只需要根據(jù)自己的需求選擇合適的軸。

總結(jié)

關(guān)于lxml和xpath的教學(xué)大概就有這么多,這類教程很多用法都不便于講解,這里只是提供一些用法,后續(xù)如果想熟練的使用xpath解析數(shù)據(jù)還需要勤加練習(xí),結(jié)合自己的實際情況進(jìn)行選擇具體的xpath,

在使用一段時間后你可能會發(fā)現(xiàn)最常用的也就最基礎(chǔ)的獲取子節(jié)點、獲取子孫節(jié)點、獲取文本、獲取屬性值。這些也足夠你解決你遇到的絕大部分問題,后面關(guān)于xpath軸的或許在實際中沒等你想到就將問題解決了。但是我還是建議你學(xué)習(xí),在我們看別人的代碼的時候別人可能會用,我們平時可以不會寫但是見到這樣的代碼的時候一定要認(rèn)識。

lxml&xpath一站式教學(xué)文章來源地址http://www.zghlxwxcb.cn/news/detail-420352.html

到了這里,關(guān)于lxml&xpath一站式教學(xué)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 布谷鳥配音:一站式配音軟件

    布谷鳥配音:一站式配音軟件

    這是一款智能語音合成軟件,可以快速將文字轉(zhuǎn)換成語音,擁有多種真人模擬發(fā)音,可以選擇不同男聲、女聲、童聲,以及四川話、粵語等中文方言和外語配音,并且可對語速、語調(diào)、節(jié)奏、數(shù)字讀法、多音字、背景音等進(jìn)行全方位設(shè)置,可以自動合成語音,無需專人錄制和

    2024年02月13日
    瀏覽(24)
  • AllData一站式大數(shù)據(jù)平臺【一】

    ? ???? Hey there! I\\\'m AllDataDC. Developing BigData Platform Exploring new technologies Studying Computer Science Enthusiast in BigData and AI Full Stack developer and BigData developer Create a product that is useful to society [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-RsXUstB2-1679966837577)(

    2024年02月02日
    瀏覽(34)
  • AllData一站式大數(shù)據(jù)平臺【二】

    AllData科學(xué)護(hù)城河:一種在數(shù)據(jù)驅(qū)動的科學(xué)和研究領(lǐng)域中, 保護(hù)和維護(hù)數(shù)據(jù)的競爭優(yōu)勢和獨特性的解決方案。 AllData通過匯聚大數(shù)據(jù)與AI領(lǐng)域生態(tài)組件,提供自定義化數(shù)據(jù)中臺。 包括大數(shù)據(jù)生態(tài)方案,人工智能生態(tài)方案, 大數(shù)據(jù)組件運維方案,大數(shù)據(jù)開發(fā)治理方案, 機(jī)器學(xué)習(xí)方案,大

    2024年02月02日
    瀏覽(69)
  • 實用便捷!一站式BI系統(tǒng)推薦

    實用便捷!一站式BI系統(tǒng)推薦

    在企業(yè)數(shù)字化轉(zhuǎn)型過程中,BI系統(tǒng)可以建立業(yè)務(wù)、數(shù)據(jù)的雙驅(qū)引擎,形成業(yè)務(wù)、數(shù)據(jù)的互補(bǔ)作用,通過建立數(shù)字化技術(shù)架構(gòu),明確企業(yè)的戰(zhàn)略定位和業(yè)務(wù)目標(biāo),從而支撐實現(xiàn)這個目標(biāo)。而一站式BI系統(tǒng),則是指可以輕松從數(shù)據(jù)采集進(jìn)行到數(shù)據(jù)可視化分析環(huán)節(jié)的BI系統(tǒng)。擁有一個

    2024年02月16日
    瀏覽(22)
  • Elasticsearch從結(jié)構(gòu)到集群一站式學(xué)習(xí)

    Elasticsearch從結(jié)構(gòu)到集群一站式學(xué)習(xí)

    elasticsearch結(jié)合kibana、Logstash、Beats,也就是elastic stack (ELK)。被廣泛應(yīng)用在日志數(shù)據(jù)分析、實時監(jiān)控等領(lǐng)域。 什么是elasticsearch? 一個開源的分布式搜索引擎,可以用來實現(xiàn)搜索、日志統(tǒng)計、分析系統(tǒng)監(jiān)控等功能 什么是elastic stack (ELK) ? 是以elasticsearch為核心的技術(shù)棧,包括beats、

    2023年04月11日
    瀏覽(45)
  • springboot minio 工具類,一站式解決

    注意 minio 新版本有9000和9090兩個端口,web訪問是9000,但走api上傳和訪問都是9090端口 引入pom controller

    2024年01月20日
    瀏覽(26)
  • 【STL】 string類使用一站式攻略

    【STL】 string類使用一站式攻略

    目錄 一,STL 1. 簡介 2. STL的版本 3. STL 六大組件?? 4.? 學(xué)習(xí)STL, 三境界 5. 學(xué)會查看C++文檔? 二, string類 1. 相對于C語言,我們?yōu)槭裁催€需要學(xué)習(xí)C++的string? 2. 頭文件 3.? 常見構(gòu)造函數(shù) 4.? operator=??? 5.? operator[]? ? at函數(shù) 6. string容量方面 1. 關(guān)于? size 與 length? 的選擇 2. 關(guān)

    2024年02月09日
    瀏覽(38)
  • 一站式自動化測試平臺-Autotestplat

    一站式自動化測試平臺-Autotestplat

    3.1 自動化平臺開發(fā)方案 3.1.1 功能需求 3.1.3 開發(fā)時間計劃 如果是剛?cè)腴T、但有一點代碼基礎(chǔ)的測試人員,大概 3 個月能做出演示版(Demo)進(jìn)行自動化測試,6 個月內(nèi)勝任開展工作中項目的自動化測試。 如果是有自動化測試基礎(chǔ)的測試人員,大概 1 個月能做出演示版(Demo)進(jìn)行自動

    2024年02月13日
    瀏覽(36)
  • k8s一站式使用筆記

    k8s一站式使用筆記

    ? ? ? ? 細(xì)節(jié)太多,建議零碎時間多遍看,k8s版本低于1.24,需要對接docker容器 2.1.關(guān)閉防火墻和selinux 2.2. 關(guān)閉swap分區(qū) 2.3.修改hosts文件 設(shè)置主機(jī)名(不設(shè)置也可以,但是要保證主機(jī)名不相同) 修改本地hosts文件 2.4.修改內(nèi)核參數(shù) 2.5.安裝docker 配置yum源(這里使用阿里云的源)

    2024年02月15日
    瀏覽(32)
  • 提升技能,挑戰(zhàn)自我——一站式在線題庫小程序

    提升技能,挑戰(zhàn)自我——一站式在線題庫小程序

    在這個信息爆炸的時代,我們總是在尋找一種方式,讓自己在眾多的知識海洋中快速提升技能,挑戰(zhàn)自我。今天,我要向大家推薦一款全新的在線題庫小程序 KD蝌蚪阿坤 ,它將幫助你實現(xiàn)這個目標(biāo)。 KD蝌蚪阿坤 是一款全面的在線題庫類應(yīng)用,涵蓋了 阿里云認(rèn)證 、 華為云認(rèn)

    2024年02月08日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包