在使用正規表示式來尋找感興趣內容的時候,需要知道感興趣內容附近內容的特徵。
而xpath則不同。
xpath與html的結構:
html為樹狀結構,可以逐層展開,逐層定位。xpath就是根據這一特性來工作的。
其中兩根斜線 // 定位根節點,一根斜線 / 表示往下層尋找,其中乙個html標籤表示一層,提取文字內容則是 /text() ,要提取某個屬性的內容則 /@*** (***為具體屬性的名字)。
首先,使用xpath提取一般內容:
根據html中的標籤來進行定位。如下面一段簡短**:
# -*- coding: utf-8 -*-
"""created on fri may 20 22:21:12 2016
@author: ldl
"""from lxml import etree
html='''
lang="en">
charset="utf-8">
測試-常規用法title>
head>
id="content">
id="useful">
這是第一條資訊li>
這是第二條資訊li>
這是第三條資訊li>
ul>
id=「useless」>
1不需要的資訊li>
2不需要的資訊li>
3不需要的資訊li>
ul>
id="url">
href="屬性1">這個不屬於屬性值a>
href="屬性2"
href2="屬性3">這個也不是屬性值a>
href3="attribute">3也不是屬性值a>
div>
div>
body>
html>
'''selector=etree.html(html)
#提取文字資訊
content=selector.xpath('//ul[@id="useful"]/li/text()')
for each in content:
print each
#此語句列印出了標籤a下的內容
content2=selector.xpath('//a/text()')
for each in content2:
print each
#提取屬性
content3=selector.xpath('//a/@href')
for each in content3:
print each
content4=selector.xpath('//a/@href2')
print content4[0]
content5=selector.xpath('//a[@href3="attribute"]/text()')
print content5[0]
其中html代表乙個簡單網頁的源**,而使用etree.html(html)將源**html轉換成xpath可以處理的物件,然後該物件呼叫xpath成員進行相應處理得到感興趣的內容。
輸出文字
如上面**所示xpath成員的引數』//ul[@id=」useful」]/li/text()』該引數表示在根目錄下的ul標籤內的內容表示當有多個ul標籤的時候,用中括號中的內容來定位具體哪個標籤,後面的斜槓後li代表li標籤/text()表示要取的是li標籤下的文字內容。此時根據該語句而得到的輸出為:
這是第一條資訊
這是第二條資訊
這是第三條資訊
該語句中如果把ul後面的中括號去掉,由於html中有兩處ul標籤,且兩處ul標籤下都有li標籤,因此兩處ul下的li都會定位到,因而輸出:
這是第一條資訊
這是第二條資訊
這是第三條資訊
1不需要的資訊
2不需要的資訊
3不需要的資訊
輸出屬性
如上面**中提取網頁的**:
content3=selector.xpath(『//a/@href』)
在源**html中,href對應的等號右邊為href的屬性內容,也就是href的值,其定位方式與前面文字定位方式是一樣的,但是取內容方式有差別,取文字內容是直接用text(),而取屬性是用@***,***為要取的屬性,該表示式為取出該屬性具體的內容。同理,content3=selector.xpath(『//a/@href』)取出了a標籤中href3對應的屬性內容。此處由於有兩處標籤a下都有href,因而返回兩處屬性都會返回,此處列印內容為:
屬性1
屬性2
注意,xpath取出的內容是以列表形式返回的,因而如果取出其中乙個元素或者其中只有乙個元素的時候,需要用訪問列表元素的方式來取出。且上面的html內容比較簡單,標籤不複雜,因而xpath中的具體引數也比較簡單,對於標籤層次較多的網頁檔案而言,則表示式的層次結構也應該較明確,一層一層標籤標示出來,否則容易導致匹配到其他有相同標籤的內容上去而沒有真正找出感興趣內容。
xpath教程一 簡單的標籤搜尋
網頁 都是成對的標籤,基礎結構如下 網頁名title head div text div body html 網頁結構基本都是如此,一般有價值的資料都是在body中 html str 網頁名title head div text span textspan a texta p textp div h...
爬蟲 xpath 匹配
從根標籤開始 必須具有嚴格的父子關係 從當前標籤 後續節點含有即可選出 import lxml.html test data 111111 29.99 222222 39.95 33333 40 123 萬用字元,選擇所有 div book 1 title 選擇div下第乙個book標籤的title...
使用xpath獲取指定標籤下html內容
通常使用xpath我們直接定位到標籤後,使用 text 或 text 來獲取標籤對之間的文字值,但特殊情況下我們也需要獲取標籤本身含文字值,操作如下 檔案為html,標籤對結構如下 1h row value 1td row value 2td tr table 如下 from lxml import...