python中xpath的基本使用

來源:互聯網
上載者:User

標籤:a標籤   實驗   使用方法   image   com   匯入   文章   解析   基本   

寫在前面的話 :上一篇文章我們利用requests進行了一些爬蟲小實驗,但是想要更順利的深入爬蟲學習,瞭解一些解析網頁的方法肯定是必須的,所以接下來我們就一起來學習lxml.etree模組的基礎使用方法吧

溫馨提示 :博主使用的系統為win10,使用的python版本為3.6.5

一、XPATH簡介

若想瞭解xpath,我們首先需要知道什麼是xml文檔,其實簡單地說,xml文檔就是由一系列節點構成的樹,例如

<html>    <body>        <div>            <p>Hello world<p>            <a href="/home">Click here</a>        </div>    </body></html>

xml文檔常見的節點有

  • 根節點:html
  • 元素節點:html、body、div、p、a
  • 屬性節點:href
  • 文本節點:Hello world、Click here

xml文檔常見的節點間關係有

  • 父子:p和a是div的子節點,反之,div是p和a的父節點
  • 兄弟:p和a為兄弟節點
  • 祖先/後代:body、div、p、a都是html的後裔節點,反之,html是body、div、p、a的祖先節點

而xpath則是一種用來確定xml文檔中某部分位置的語言,它的全稱是XML路徑語言(XML Path Language),對於網頁解析來說,xpath比Regex來得更方便更簡潔,故python中專門提供了一個特殊的模組——lxml庫中的etree模組用於處理xpath,我們可以使用以下命令進行安裝

$ pip install lxml
二、XPATH的基本使用方法1. 匯入模組
>>> from lxml import etree

在這裡為了簡便起見,我們自己構造一個簡單的xml文檔

>>> sc = ‘‘‘<html>    <head>        <meta charset=UTF-8>        <link rel=stylesheet href=style/base.css>        <link rel=stylesheet href=style/home.css>        <base href="https://www.example.com"/>        <title>Example website</title>    <body>        <div id="images" class="content">            <a href="image1.html">Image1<br/><img src="image1.jpg"/>            <a href="image2.html">Image2<br/><img src="image2.jpg"/>            <a href="image3.html">Image3<br/><img src="image3.jpg"/>            <a href="image4.html">Image4<br/><img src="image4.jpg"/>            <a href="image5.html">Image5<br/><img src="image5.jpg"/>‘‘‘
2. 構造_Element對象
#可以使用HTML()方法構造_Element對象並自動補全不完整代碼>>> html = etree.HTML(sc)#構造對象結果檢查>>> type(html)<class ‘lxml.etree._Element‘>#補全代碼結果檢查,注意tostring()方法用於將_Element對象轉化成bytes類型字串,decode(‘utf-8‘)方法用於將bytes類型字串轉化為str類型字串>>> print(etree.tostring(html).decode(‘utf-8‘))<html>    <head>        <meta charset="UTF-8"/>        <link rel="stylesheet" href="style/base.css"/>        <link rel="stylesheet" href="style/home.css"/>        <base href="https://www.example.com"/>        <title>Example website</title>    </head>    <body>        <div id="images" class="content">            <a href="image1.html">Image1<br/><img src="image1.jpg"/></a>            <a href="image2.html">Image2<br/><img src="image2.jpg"/></a>            <a href="image3.html">Image3<br/><img src="image3.jpg"/></a>            <a href="image5.html">Image5<br/><img src="image5.jpg"/></a>        </div>    </body></html>
3. 匹配結果

可以使用xpath()方法進行匹配,注意該方法返回匹配列表,且列表中的每一項都是_Element對象

(1)/ 表示子代,例如E1/E2表示E1子節點中的E2節點,/E表示文檔子節點中的E節點

>>> test = html.xpath(‘/html/body/div/a‘)>>> print(test)[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]

(2)// 表示後代,例如E1//E2表示E1後代節點中的E2節點,//E表示文檔後代節點中的E節點

>>> test = html.xpath(‘//a‘)>>> print(test)[<Element a at 0x3843bc0>, <Element a at 0x3843c10>, <Element a at 0x3843c38>, <Element a at 0x3843c60>, <Element a at 0x3843c88>]

(3)* 表示屬性節點,例如E/*表示E子節點中的所有節點

>>> test = html.xpath(‘/html/*‘)>>> print(test)[<Element head at 0x3843be8>, <Element body at 0x3843c10>]

(4)text() 表示文本節點,例如E/text()表示E子節點中的文本節點

>>> test = html.xpath(‘/html/head/title/text()‘)>>> print(test)[‘Example website‘]

(5)@ATTR 表示屬性節點,例如E/@ATTR表示E子節點中的ATTR屬性節點

>>> test = html.xpath(‘//a/@href‘)>>> print(test)[‘image1.html‘, ‘image2.html‘, ‘image3.html‘, ‘image4.html‘, ‘image5.html‘]

(6)謂語 用於匹配指定的標籤

#指定第二個a標籤>>> test = html.xpath(‘//a[2]‘)>>> print(test)[<Element a at 0x3843c88>]#指定前兩個a標籤>>> test = html.xpath(‘//a[position()<=2]‘)>>> print(test)[<Element a at 0x3843c60>, <Element a at 0x3843c88>]#指定帶有href屬性的a標籤>>> test = html.xpath(‘//a[@href]‘)>>> print(test)[<Element a at 0x3843c38>, <Element a at 0x385c300>, <Element a at 0x385c2d8>, <Element a at 0x385c350>, <Element a at 0x385c328>]#指定帶有href屬性且值為image1.html的a標籤>>> test = html.xpath(‘//a[@href="image1.html"]‘)>>> print(test)[<Element a at 0x3843c38>]
4. _Element對象的常用屬性與方法

我們先用xpath()方法得到匹配列表tests,tests中的每一項都是一個 _Element對象

>>> tests = html.xpath(‘//a‘)

(1)屬性tag 返回標籤名

>>> for test in tests:        test.tag‘a‘‘a‘‘a‘‘a‘‘a‘

(2)屬性 attrib 返回屬性與值組成的字典

>>> for test in tests:        test.attrib{‘href‘: ‘image1.html‘}{‘href‘: ‘image2.html‘}{‘href‘: ‘image3.html‘}{‘href‘: ‘image4.html‘}{‘href‘: ‘image5.html‘}

(3)方法 get() 返回指定屬性的值

>>> for test in tests:        test.get(‘href‘)‘image1.html‘‘image2.html‘‘image3.html‘‘image4.html‘‘image5.html‘

(4)屬性 text 返迴文本值

>>> for test in tests:        test.text‘Image1‘‘Image2‘‘Image3‘‘Image4‘‘Image5‘

寫在後面的話 :現在我們已經學習完requests和lxml.etree模組的基礎使用方法了,下一篇文章我們將利用它們進行一個基礎的爬蟲實戰訓練,謝謝大家

python中xpath的基本使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.