天天看点

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属性,列表

继续阅读