天天看點

Python爬蟲(四)lxml、xpath安裝子產品導入查找節點 屬性查找 @ 符号使用 謂語選取未知節點擷取文本和屬性

安裝

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運算符

Python爬蟲(四)lxml、xpath安裝子產品導入查找節點 屬性查找 @ 符号使用 謂語選取未知節點擷取文本和屬性

擷取文本和屬性

文本

text()  隻能擷取該節點的文本

string() 擷取該節點下和所有子孫節點的所有文本

html.xpath("//h1/text()") # 傳回的是清單集

html.xpath("//h1//text()") # 搜尋h1節點下的所有文本清單

html.xpath("string(//div)") # 擷取第一個div下的所有文本内容

屬性擷取

标簽/@屬性

html.xpath("//img/@src") #擷取所有img标簽的src屬性,清單

繼續閱讀