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