當前位置:首頁 » 編程語言 » pythonhtmlxpath

pythonhtmlxpath

發布時間: 2024-04-09 00:41:09

python解析庫lxml與xpath用法總結

本文主要圍繞以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 來選取的。下面列出了最有用的路徑表達式:

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


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

謂語被嵌在方括弧中。

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


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

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


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

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


4.xpath 軸

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


5.xpath運算符

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

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


二、lxml

1.lxml安裝

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


2.lxml 使用

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

導入包:


1.解析離線網頁:

2.解析在線網頁:

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

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

1.表達式內獲取

2.表達式外獲取

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


下面再來lxml的解析規則:



3.lxml案例

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

⑵ 如何用Python爬取出HTML指定標簽內的文本

你好!

可以通過lxml來獲取指定標簽的內容。

#安裝lxml
pipinstalllxml

importrequests
fromlxmlimporthtml

defgetHTMLText(url):
....

etree=html.etree
root=etree.HTML(getHTMLText(url))
#這里得到一個表格內tr的集合
trArr=root.xpath("//div[@class='news-text']/table/tbody/tr");

#循環顯示tr裡面的內容
fortrintrArr:
rank=tr.xpath("./td[1]/text()")[0]
name=tr.xpath("./td[2]/div/text()")[0]
prov=tr.xpath("./td[3]/text()")[0]
strLen=22-len(name.encode('GBK'))+len(name)
print('排名:{:<3},學校名稱:{:<{}} ,省份:{}'.format(rank,name,strLen,prov))

希望對你有幫助!

⑶ python中function沒有xpath屬性什麼意思

在Python中,函數(function)是一種對象,它可以被調用以執行特定的任務。與其他對象一樣,函數也有一些屬性,例如__name__、__doc__等。隱山但是,函數對象沒有xpath屬性,因為xpath是一種用於在XML文檔中定位元素的語言,與Python函指坦數沒有直接關系。如果您需要在Python中使用xpath,可以使用lxml庫或者xml.etree.ElementTree庫。這些庫提供了一些函數和類,可以幫灶逗中助您解析XML文檔並使用xpath表達式來定位元素。

⑷ python里的爬蟲如何使用xpath 提取script里的元素

xpath也許只能提取html元素?
建議你先把content保存到本地文件,看看需要的內容有沒有下載下來。
你這個屬於script內容,看看直接正則能獲得嗎?

⑸ python使用xpath(超詳細)

使用時先安裝 lxml 包

開始使用 #

和beautifulsoup類似,首先我們需要得到一個文檔樹

把文本轉換成一個文檔樹對象

from lxml import etreeif __name__ == '__main__':doc='''

把文件轉換成一個文檔樹對象

fromlxmlimportetree# 讀取外部文件 index.htmlhtml = etree.parse('./index.html')result = etree.tostring(html, pretty_print=True)#pretty_print=True 會格式化輸出print(result)

均會列印出文檔內容

節點、元素、屬性、內容 #

xpath 的思想是通過 路徑表達 去尋找節點。節點包括元素,屬性,和內容

元素舉例

html --->...div --->

這里我們可以看到,這里的元素和html中的標簽一個意思。單獨的元素是無法表達一個路徑的,所以單獨的元素不能獨立使用

路徑表達式 #

/  根節點,節點分隔符,//  任意位置.  當前節點..  父級節點@  屬性

通配符 #

*  任意元素@*  任意屬性node()  任意子節點(元素,屬性,內容)

謂語 #

使用中括弧來限定元素,稱為謂語

//a[n] n為大於零的整數,代表子元素排在第n個位置的 元素//a[last()]  last()  代表子元素排在最後個位置的 元素//a[last()-]  和上面同理,代表倒數第二個//a[position()<3] 位置序號小於3,也就是前兩個,這里我們可以看出xpath中的序列是從1開始//a[@href]    擁有href的 元素//a[@href='www..com']    href屬性值為'www..com'的 元素//book[@price>2]  price值大於2的元素

多個路徑 #

用| 連接兩個表達式,可以進行 或匹配

//book/title | //book/price

函數 #

xpath內置很多函數。更多函數查看 https://www.w3school.com.cn/xpath/xpath_functions.asp

contains(string1,string2)

starts-with(string1,string2)

ends-with(string1,string2) #不支持

upper-case(string) #不支持

text()

last()

position()

node()

可以看到last()也是個函數,在前面我們在謂語中已經提到過了

案例 #

定位元素 #

匹配多個元素,返回列表

fromlxmlimportetreeif__name__ =='__main__':doc='''

【結果為】

[<Element li at 0x2b41b749848>, <Element li at 0x2b41b749808>, <Element li at 0x2b41b749908>, <Element li at 0x2b41b749948>, <Element li at 0x2b41b749988>][]  #沒找到p元素

html = etree.HTML(doc)print(etree.tostring(html.xpath("//li[@class='item-inactive']")[0]))print(html.xpath("//li[@class='item-inactive']")[0].text)print(html.xpath("//li[@class='item-inactive']/a")[0].text)print(html.xpath("//li[@class='item-inactive']/a/text()"))print(html.xpath("//li[@class='item-inactive']/.."))print(html.xpath("//li[@class='item-inactive']/../li[@class='item-0']"))

【結果為】

b' third item \n                'None    #因為第三個li下面沒有直接text,Nonethird item  #['third item'][<Element ul at 0x19cd8c4c848>][<Element li at 0x15ea3c5b848>, <Element li at 0x15ea3c5b6c8>]

使用函數 #

contains #

有的時候,class作為選擇條件的時候不合適@class='....' 這個是完全匹配,當王爺樣式發生變化時,class或許會增加或減少像active的class。用contains就能很方便

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

[<Element p at 0x23f4a9d12c8>, <Element li at 0x23f4a9d13c8>, <Element li at 0x23f4a9d1408>, <Element li at 0x23f4a9d1448>, <Element li at 0x23f4a9d1488>]

starts-with #

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

[<Element ul at 0x23384e51148>, <Element p at 0x23384e51248>, <Element li at 0x23384e51288>, <Element li at 0x23384e512c8>, <Element li at 0x23384e51308>, <Element li at 0x23384e51388>][<Element ul at 0x23384e51148>]

ends-with #

print(html.xpath("//*[ends-with(@class,'ul')]"))

【結果為】

Traceback (most recent call last):File"F:/OneDrive/pprojects/shoes-show-spider/test/xp5_test.py",line18,inprint(html.xpath("//*[ends-with(@class,'ul')]"))File"src\lxml\etree.pyx",line1582,inlxml.etree._Element.xpathFile"src\lxml\xpath.pxi",line305,inlxml.etree.XPathElementEvaluator.__call__File"src\lxml\xpath.pxi",line225,inlxml.etree._XPathEvaluatorBase._handle_resultlxml.etree.XPathEvalError: Unregisteredfunction

看來python的lxml並不支持有的xpath函數列表

upper-case #

和ends-with函數一樣,也不支持。同樣報錯lxml.etree.XPathEvalError: Unregistered function

print(html.xpath("//a[contains(upper-case(@class),'ITEM-INACTIVE')]"))

text、last #

#最後一個li被限定了print(html.xpath("//li[last()]/a/text()"))#會得到所有的`<a>`元素的內容,因為每個<a>標簽都是各自父元素的最後一個元素。#本來每個li就只有一個<a>子元素,所以都是最後一個print(html.xpath("//li/a[last()]/text()"))print(html.xpath("//li/a[contains(text(),'third')]"))

【結果為】

['fifth item']['second item', 'third item', 'fourth item', 'fifth item'][<Element a at 0x26ab7bd1308>]

position #

print(html.xpath("//li[position()=2]/a/text()"))#結果為['third item']

上面這個例子我們之前以及講解過了

* 這里有個疑問,就是position()函數能不能像text()那樣用呢

print(html.xpath("//li[last()]/a/position()"))#結果  lxml.etree.XPathEvalError: Unregisteredfunction

這里我們得到一個結論,函數不是隨意放在哪裡都能得到自己想要的結果

node #

返回所有子節點,不管這個子節點是什麼類型(熟悉,元素,內容)

print(html.xpath("//ul/li[@class='item-inactive']/node()"))print(html.xpath("//ul/node()"))

【結果為】

[]['\n                ', , '\n                ', , '\n                ', , '\n                ', , '\n                ', , ' 閉合標簽\n            ']

獲取內容 #

**剛剛已經提到過,可以使用.text和text()的方式來獲取元素的內容

from lxml import etreeif __name__ == '__main__':doc='''

【結果為】

['first item','second item','third item','fourth item','fifth item']first item18['\n                ','\n                ','\n                ','\n                ','\n                ',' 閉合標簽\n            ']

看到這里,我們觀察到text()和.text的區別。自己總結吧。不太好表達,就不表達了

獲取屬性 #

print(html.xpath("//a/@href"))print(html.xpath("//li/@class"))

【結果為】

['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']['item-0active', 'item-1', 'item-inactive', 'item-1', 'item-0']

自定義函數 #

我們從使用函數的過程中得到結論,就是有的函數不支持,有的支持,那問題來了,到底那些方法支持呢。我們在lxml官網找到了答案。 https://lxml.de/xpathxslt.html 。lxml 支持XPath 1.0 ,想使用其他擴展,使用libxml2,和libxslt的標准兼容的方式。 XPath 1.0官方文檔  以及其他版本的XPath文檔  https://www.w3.org/TR/xpath/

lxml supports XPath1.0, XSLT1.0andthe EXSLT extensions through libxml2andlibxsltina standards compliant way.

除此之外,lxml還提供了自定義函數的方式來擴展xpath的支持度  https://lxml.de/extensions.html

from lxml import etree#定義函數def ends_with(context,s1,s2):return s1[0].endswith(s2)if __name__ == '__main__':doc='''

【結果為】

[<Element li at 0x2816ed30548>, <Element li at 0x2816ed30508>]['first item', 'third item']

形參s1會傳入xpath中的第一個參數@class,但這里注意@class是個列表

形參s2會傳入xpath中的第二個參數'active','active'是個字元串

官網例子 https://lxml.de/extensions.html

defhello(context, a):return"Hello %s"% afromlxmlimportetreens = etree.FunctionNamespace(None)ns['hello'] = helloroot = etree.XML('<a><b>Haegar</b></a>')print(root.xpath("hello('Dr. Falken')"))# 結果為 Hello Dr. Falken

⑹ python爬蟲簡單問題,HTML對象的定位問題

這里有各種策略用於定位網頁中的元素(locate elements),你可以選擇最適合的方案,Selenium提供了一下方法來定義一個頁面中的元素:

  • find_element_by_id

  • find_element_by_name

  • find_element_by_xpath

  • find_element_by_link_text

  • find_element_by_partial_link_text

  • find_element_by_tag_name

  • find_element_by_class_name

  • find_element_by_css_selector

  • 下面是查找多個元素(這些方法將返回一個列表):

  • find_elements_by_name

  • find_elements_by_xpath

  • find_elements_by_link_text

  • find_elements_by_partial_link_text

  • find_elements_by_tag_name

  • find_elements_by_class_name

  • find_elements_by_css_selector

  • 除了上面給出的公共方法,這里也有兩個在頁面對象定位器有用的私有方法。這兩個私有方法是find_element和find_elements。
    常用方法是通過xpath相對路徑進行定位,同時CSS也是比較好的方法。舉例:

    [html]view plain

  • <html>

  • <body>

  • <formid="loginForm">

  • <inputname="username"type="text"/>

  • <inputname="password"type="password"/>

  • <inputname="continue"type="submit"value="Login"/>

  • <inputname="continue"type="button"value="Clear"/>

  • </form>

  • </body>

  • <html>

  • 定位username元素的方法如下:

  • [python]view plain

  • username=driver.find_element_by_xpath("//form[input/@name='username']")

  • username=driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")

  • username=driver.find_element_by_xpath("//input[@name='username']")

  • [1] 第一個form元素通過一個input子元素,name屬性和值為username實現

  • [2] 通過id=loginForm值的form元素找到第一個input子元素

  • [3] 屬性名為name且值為username的第一個input元素


  • 二. 操作元素方法

    在講述完定位對象(locate elements)之後我們需要對該已定位對象進行操作,通常所有的操作與頁面交互都將通過WebElement介面,常見的操作元素方法如下:

  • clear 清除元素的內容

  • send_keys 模擬按鍵輸入

  • click 點擊元素

  • submit 提交表單

  • 舉例自動訪問FireFox瀏覽器自動登錄163郵箱。

    [python]view plain

  • fromseleniumimportwebdriver

  • fromselenium.webdriver.common.keysimportKeys

  • importtime

  • #Login163email

  • driver=webdriver.Firefox()

  • driver.get("")

  • elem_user=driver.find_element_by_name("username")

  • elem_user.clear

  • elem_user.send_keys("15201615157")

  • elem_pwd=driver.find_element_by_name("password")

  • elem_pwd.clear

  • elem_pwd.send_keys("******")

  • elem_pwd.send_keys(Keys.RETURN)

  • #driver.find_element_by_id("loginBtn").click()

  • #driver.find_element_by_id("loginBtn").submit()

  • time.sleep(5)

  • assert""indriver.title

  • driver.close()

  • driver.quit()

  • 首先通過name定位用戶名和密碼,再調用方法clear()清除輸入框默認內容,如「請輸入密碼」等提示,通過send_keys("**")輸入正確的用戶名和密碼,最後通過click()點擊登錄按鈕或send_keys(Keys.RETURN)相當於回車登錄,submit()提交表單。

  • PS:如果需要輸入中文,防止編碼錯誤使用send_keys(u"中文用戶名")。


  • 三. WebElement介面獲取值

    通過WebElement介面可以獲取常用的值,這些值同樣非常重要。

  • size 獲取元素的尺寸

  • text 獲取元素的文本

  • get_attribute(name) 獲取屬性值

  • location 獲取元素坐標,先找到要獲取的元素,再調用該方法

  • page_source 返回頁面源碼

  • driver.title 返回頁面標題

  • current_url 獲取當前頁面的URL

  • is_displayed() 設置該元素是否可見

  • is_enabled() 判斷元素是否被使用

  • is_selected() 判斷元素是否被選中

  • tag_name 返回元素的tagName

⑺ Python lxml包下面的xpath基本用法

對於網頁數據抓取,有BeautifulSoup、lxml以及正則表達式三種方法,其中正則表達式過於復雜,而beautifulsoup和lxml使用起來較為方便。以前簡單使用過beautifulsoup(美味湯),後面為了擴展一下,熟悉一下lxml進行數據抓取。

先貼一個lxml的簡單框架:

其中,最主要的在於xpath路徑的獲取和解析,而XPath就是地址,具體地,就是需要知道所要尋找的內容處在哪個地址下。一般而言,我們可以根據開發者工具來定位我們需要的元素,然後右擊選擇其所在xpath,選擇初步的路徑,如下圖所示,

這只是一種簡單的方法,更重要的,需要掌握xpath的語法規則,下面分別論述。

使用xpath獲取信息,主要包括獲取本文和獲取屬性,基本用法為

對比可以看出,一個是採用text()獲取文本,一個是採用@屬性獲取屬性值。而前面標簽後面方括弧就是來對標簽進行篩選的。一般而言,通過選擇器可以獲取諸如/html/body/div[@class="useful"]/ul/li/text()的信息,但是開頭的信息沒有標志性,採用//div[@class="useful"]/ul/li/text()即可。

這個地方即涉及到了xpath的語法選擇,主要包括以下幾點:

而在選擇器方面,包括以下幾個

除此之外,在獲取了一個元素之後,我們需要獲取其下面元素的屬性,即要對基於xpath獲取的元素再次採用xpath,此時的獲取方式為:

另外,我們也可以獲取節點下面所有的字元串,方法為string(.),示例為:

懶得打字了,下面的截圖來自W3Cschool, https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html

主要的Xpath運算符包括以下:

按順序選擇等進一步的內容可以移步 https://www.w3cschool.cn/lxml/_lxml-eh1k3fk6.html

具體到不同的網頁上,需要的其他知識就更多了,慢慢補充吧。不過似乎還是beautifulsoup好用一些,哈哈。

參考資料:
https://blog.csdn.net/weixin_39851008/article/details/109960957
https://www.w3cschool.cn/lxml/_lxml-98h23fk0.html

熱點內容
redis永久緩存 發布:2024-11-28 12:37:40 瀏覽:55
php是自學網 發布:2024-11-28 12:33:57 瀏覽:732
php採集系統 發布:2024-11-28 12:32:04 瀏覽:907
資料庫恢復的實現技術 發布:2024-11-28 12:25:26 瀏覽:5
壓縮圖檔 發布:2024-11-28 12:25:23 瀏覽:423
自定義緩存 發布:2024-11-28 12:25:07 瀏覽:235
怎麼進電腦的伺服器 發布:2024-11-28 12:23:57 瀏覽:830
伺服器2s1u是什麼意思 發布:2024-11-28 12:22:54 瀏覽:511
伺服器怎麼當做掛機寶 發布:2024-11-28 12:16:49 瀏覽:45
ga演算法nn 發布:2024-11-28 12:12:17 瀏覽:50