表達式
|
描述
|
---|---|
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
pip install lxml
- 解析原理: - 獲取頁面源碼數據 - 實例化一個etree對象,並將頁面源碼數據加載到該對象中 - 調用該對象的xpath方法進行指定標籤的定位 - 注意:xpath函數必須結合着xpath表達式進行標籤的定位和內容的捕獲
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)
"""
i.xpath("./div[2]/h2/a/text() |./div[3]/h2/a/text()")[0] # xpath中能夠使用管道符表示或的關係,用這兩種規則進行匹配
"""
1
2
3
4
5
6
7
8
9
|
注意:這裏遇到中文亂碼問題
解決方法一:
# 處理中文亂碼,將響應數據統一編碼成utf-8
# response.encoding = "utf-8"
解決方法二:
# 哪裏亂碼解碼哪裏
img_name.encode(
"iso-8859-1"
).decode(
"gbk"
)
|
import os import urllib import requests from lxml import etree url = "http://pic.netbian.com/4kmeinv/" headers = { '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=url,headers=headers) # 處理中文亂碼,將響應數據統一編碼成utf-8 # response.encoding = "utf-8" if not os.path.exists("./imgs"): os.mkdir("./imgs") page_text = response.text # 實例化etree對象並加載頁面源碼數據 tree = etree.HTML(page_text) # 找到全部li標籤 li_list = tree.xpath("//div[@class='slist']/ul/li") for li in li_list: img_name = li.xpath("./a/b/text()")[0] # ./表明從li標籤開始解析,不寫m默認從整張HTML頁面開始解析 # 處理中文亂碼 img_name = img_name.encode("iso-8859-1").decode("gbk") # 拼接圖片路徑 img_url = "http://pic.netbian.com" + li.xpath("./a/img/@src")[0] img_path = "./imgs/" + img_name+".jpg" # 調用urllib中的urlretrieve方法存儲 urllib.request.urlretrieve(url=img_url,filename=img_path) print("正在下載",img_name) print("download ok")