表達式
|
描述
|
---|---|
nodename
|
選取此節點的全部子節點。
|
/
|
從根節點選取。
|
//
|
從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
|
.
|
選取當前節點。
|
..
|
選取當前節點的父節點。
|
@
|
選取屬性。
|
運算符
|
描述
|
實例
|
返回值
|
---|---|---|---|
|
|
計算兩個節點集
|
//book | //cd
|
返回全部擁有 book 和 cd 元素的節點集
|
+
|
加法
|
6 + 4
|
10
|
-
|
減法
|
6 - 4
|
2
|
*
|
乘法
|
6 * 4
|
24
|
div
|
除法
|
8 div 4
|
2
|
=
|
等於
|
price=9.80
|
若是 price 是 9.80,則返回 true。
若是 price 是 9.90,則返回 false。
|
!=
|
不等於
|
price!=9.80
|
若是 price 是 9.90,則返回 true。
若是 price 是 9.80,則返回 false。
|
<
|
小於
|
price<9.80
|
若是 price 是 9.00,則返回 true。
若是 price 是 9.90,則返回 false。
|
<=
|
小於或等於
|
price<=9.80
|
若是 price 是 9.00,則返回 true。
若是 price 是 9.90,則返回 false。
|
>
|
大於
|
price>9.80
|
若是 price 是 9.90,則返回 true。
若是 price 是 9.80,則返回 false。
|
>=
|
大於或等於
|
price>=9.80
|
若是 price 是 9.90,則返回 true。
若是 price 是 9.70,則返回 false。
|
or
|
或
|
price=9.80 or price=9.70
|
若是 price 是 9.80,
或者 price 是 9.70,則返回 true。
|
and
|
與
|
price>9.00 and price<9.90
|
若是 price 大於 9.00,
而且 price 小於9.90,則返回 true。
|
mod
|
計算除法的餘數
|
5 mod 2
|
1
|
- 獲取全部節點 - 獲取全部li標籤 - //* //li - 獲取子節點 - 咱們經過/或//便可查找元素的子節點和子孫節點 - li節點的全部直接a子節點 - //li/a - 獲取ul的全部子孫a節點 - //ul//a - 獲取父節點屬性 - 知道子節點查詢父節點 - //div[@class="filter-wrap"]/../@class' - //div[@class="filter-wrap"]/parent::*/@class' - 屬性定位 - 找到當前源碼中全部class屬性爲song的div標籤 - //div[@class="song"] - 層級&索引定位 - 找到class屬性值爲tang的div的直系子標籤ul下的第二個子標籤li下的直系子標籤a - //div[@class="tang"]/ul/li[2]/a - 多屬性匹配 - 從當前源碼中找到href屬性爲空且class屬性爲song的全部a標籤 - //a[@href="" and @class="song"] - 模糊匹配 - 找到全部class屬性值中包含nb的全部div標籤 - //div[contains(@class,"so")] - 找到全部class屬性值以zb開頭的全部div標籤 - //div[starts-with(@class,"ta")] - 獲取文本 - / 表示獲取某個標籤下的文本內容 - // 表示獲取某個標籤下的文本內容和全部子標籤下的文本內容 - //div[@class="song"]/p[1]/text() - //div[@class="tang"]//text() - 獲取屬性 - //div[@class="tang"]//li[2]/a/@href
from lxml import etree xpath解析 - 通用性比較強 - 環境的安裝:pip install lxml - 解析原理: - 1.實例化一個etree對象,且將解析的頁面源碼加載到該對象中 - 2.使用該對象中的xpath方法結合着xpath表達式進行標籤訂位和數據解析提取 - etree對象的實例化: - 本地加載: tree = etree.parse('filePath') - 網絡加載: tree = etree.HTML(page_text) 經常使用的xpath表達式:基於標籤的層級實現定位. 返回的永遠是一個列表 /:從根標籤開始實現層級定位 //:從任意位置實現標籤的定位 屬性定位:tag[@attrName="attrValue"] 索引定位://div[@class="tang"]/ul/li[5] 索引值是從1開始 取文本: 取得直系文本內容:/text() 取得全部的文本內容://text() 取屬性:/@attrName
import requests from lxml import etree url = "https://bj.58.com/shahe/ershoufang/?PGTID=0d30000c-0047-e4b2-f57c-08960a90aab4&ClickID=1" headres = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' } response = requests.get(url).text # 實列化一個etree對象,加載頁面源碼數據 tree = etree.HTML(response) # etree對象調用xpath函數,結合xpath表達式進行標籤訂位和內容捕獲 li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') # 返回值由不少個li標籤組成的列表 for i in li_list: tetle = i.xpath("./div[2]/h2/a/text()")[0] # 局部調用表達式時必須加點 procr = "".join(i.xpath("./div[3]/p//text()")) # 將價格拼接 print(tetle,procr)