安裝
pip install lxml
子產品導入
from lxml import etree
使用xpath查詢
解析html源代碼,得到html節點對象
html=etree.HTML(r.text)
檢視html元素節點的内容
print(etree.tostring(html,encoding="utf-8").decode("utf-8"))
查找節點
xpath() 傳回查找到的元素清單
nodename,直接寫節點名稱,查找标簽,/代表層級
html.xpath("head") #查找head标簽
html.xpath("head/title") #查找head标簽下的title标簽
html.xpath("body/div") #查找body下的所有div清單,bs4的.文法隻能找到第一個
/開頭代表最頂層
html.xpath("/html/head") #查找根節點下的html節點下一層的head
//代表從任意位置查找節點
html.xpath("//img") #查找任意位置的img标簽,所有的img标簽清單
html.xpath("//li/div") #查找所有li标簽下面的div标簽
屬性查找 @ 符号使用
html.xpath("//li[@class='column']") #查找class是column的所有li元素清單
如果有多個class,比如<div class='nav1 nav2 nav3'>
html.xpath("//div[@class='nav1']") #無法找到
html.xpath("//div[@class='nav1 nav2 nav3']") #可以找到
屬性查找的是等于class的,少一個字元都不行
contains()函數,xpath文法的包含
html.xpath("//div[contains(@class,'nav1')]") # class中包含nav1的所有div節點
. 目前層級
div.xpath(".//img/@src")
搜尋div目前節點下的所有img的src屬性清單
.. 上一層及
謂語
html.xpath("//li[@class='column'][1]") # 找到class為column的li标簽的第一個元素
html.xpath("//li[@class='column']/ul/li[1]") # 找到class為column的li标簽下的ul下的第一個li
last() 最後一個
html.xpath("//li[@class='column']/ul/li[last()]") # ul下的最後一個li
html.xpath("//li[@class='column']/ul/li[last()-1]") # ul下的倒數第二個li
html.xpath("//li[@class='column']/ul/li[last()-1]") # ul下的倒數第二個li
position()
html.xpath("//li[@class='column']/ul/li[position()=2 or position()=4]") # ul下的第二個li 和第四個li
html.xpath("//li[@class='column']/ul/li[position()>=2 and position()<=4]") # ul下的第2、3、4個li
text搜尋
不用@,後續補充
選取未知節點
未知節點類型
html.xpath("//*[@class='column']") # 找到class為column的所有節點
未知屬性名
html.xpath("//*[@*='container']") # 選取任意屬性為container的所有節點
未知屬性值,隻知道有該屬性
html.xpath("//*[@data-id]") # 選取包含data-id屬性的所有标簽,不考慮屬性值
選取标簽下的所有節點
node() 擷取所有子孫節點,包括換行。等于bs4裡面的contents
html.xpath("//head/node()")
xpath運算符

擷取文本和屬性
文本
text() 隻能擷取該節點的文本
string() 擷取該節點下和所有子孫節點的所有文本
html.xpath("//h1/text()") # 傳回的是清單集
html.xpath("//h1//text()") # 搜尋h1節點下的所有文本清單
html.xpath("string(//div)") # 擷取第一個div下的所有文本内容
屬性擷取
标簽/@屬性
html.xpath("//img/@src") #擷取所有img标簽的src屬性,清單