1. 什麼是xpath
xml是用來存儲和傳輸資料的,和html的不同有兩點:
- html用來顯示資料,xml用來傳輸資料
-
html的标簽是固定的,xml标簽是可以自定義的
(二者寫法、結構基本相同,是以xpath能在html中搜尋内容)
Xpath是一門在XML文檔中查找資訊的語言,是一種路徑表達式。
主要用的節點:元素、屬性、文本。
常用的路徑表達式:
// 不考慮位置,從比對選擇的目前節點選擇文檔中的節點
./ 從目前節點開始往下查找
../ 從目前節點的父節點查找
@ 選擇屬性
選擇執行個體:
/bookstore/book:選擇節點bookstore下的book(直接子節點)
//book : 所有book
bookstore//book :查找bookstore下面所有的book(不管是不是子節點)
//@lang :選取名為lang的節點
/bookstore/book[1] :bookstore下的第一個book(直接子節點)
/bookstore/book[last()] :bookstore下的最後一個book(最後一個子節點)
/bookstore/book[position()<3] :提取前兩個
//title[@] :查找帶有lang屬性的title,屬性值還需要為eng
* 任何元素節點
2. Xpath插件
Xpath使用神器!
下載下傳Xpath Helper插件,安裝在Chrome浏覽器擴充程式内,即可使用。
(好多大神們有介紹插件安裝使用,這裡略過)
2.1 定位方式
(1)層級和索引定位:
1. 屬性定位: //input[@id="kw"]
或者 //input[@class="btn self-btn bg s_btn"]
2. 層級+屬性+索引定位: //div[@id="head_wrapper"]/div/div[1]/a
(這裡索引從1而不是0開始,例子隻是為了展示索引應用)
3. 靈活使用雙斜杠//,代表節點下所有的節點,不管位置!
(2)邏輯運算
一般使用and,限制兩個屬性,找相應節點
(3)模糊比對
contains :
//input[contains(@class,'s_i')]
表示選擇所有input,有class屬性,并帶有s_i
starts-with :
//input[starts-with(@class,'s')]
表示選擇所有input,有class屬性,并以s開頭
2.2 取文本
//div[@id="s-top-left"]/a[5]/text() 擷取節點内容
//div[@id='ul']//text() 擷取節點裡面不帶标簽的所有内容
2.3 取屬性
//div[@id="s-top-left"]/a[5]/@href
3. 初始化
可被解析的有字元串(string)和html檔案(filename.html)
3.1 字元串
以下面一段html為例:
res = '''
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1316510/" target="_blank" rel="external nofollow" class="">
<span class="title">張三李四</span>
<span class="title"> / 王五趙六</span>
<span class="other class-1" name="item"> / 錢包 / 口袋</span>
</a>
<span class="playable">[可]</span>
</div></div>
'''
調用HTML方法初始化字元串(string):
from lxml import etree
html=etree.HTML(res) #調用HTML方法初始化字元串(string)
#html=etree.tostring(html) #調用tostring()方法可補全未閉合的标簽
#print(html.decode('utf-8')) #以字元串的格式列印
查找文本内容:
spans=html.xpath('//span')
for span in spans:
print(span.text)
3.2 html檔案
檔案導入即可
from lxml import etree
html=etree.parse('text.html',etree.HTMLParser())#調用parse()方法執行個體化檔案
result=html.xpath('比對規則')