python爬虫笔记(2-1)Xpath解析

Xpath是在XML文档中搜索内容的一门语言,可以通过属性或节点路径来查找内容
Xpath选择器教程及参考手册:https://www.w3school.com.cn/xpath/index.asp
 
1、安装:
pip install lxml
 
2、导入:
etree中包含了xpath功能,要导入etree
from lxml import etree
 
3、语法:
/:  表示层级关系,第一个/表示根节点
./:  表示相对路径
//:  搜索后代,如"/div/content/name//nick/text()" # 取name中所有nick中的文本
*:  通配符:如"/div/content/*/nick/text()" # 取content中所有nick中的文本(nick的父节点可以是name也可以是其它的)
text():提取文本
 
4、例子:
from lxml import etree
tree = etree.HTML("a.html")
 
# 拿到a标签的内容
result = tree.xpath("/html/body/ul/li/a/text()")
 
# 拿到第1个li中a标签的内容
result = tree.xpath("/html/body/ul/li[1]/a/text()")
 
# 拿到第a标签中属性href的值为dapao的内容,[@xxx='xxx']是属性的筛选
result = tree.xpath("/html/body/ul/li/a[@href = 'dapao']/text()")
 
# 拿到第a标签中属性href的值,@属性:拿到属性值
result = tree.xpath("/html/body/ul/li/a/@href")
 
# 相对路径查找 ./ (或者说是在某个元素内部使用xpath查找)
li_list = tree.xpath("/html/body/ul/li")
for li in li_list:
  result = li.xpath("./a/text()")     # ./表示相对查找,在li中继续查找
 
# 找到网页中所有的div(等于CSS选择器中直接写div)
//div
 
# 找到网页中所有div里所有的p标签(等于CSS选择器中的div p)
//div//p
 
# 找到网页中所有div里的直接子节点p(等于CSS选择器中的div > p)
//div/p
 
# 通配符*的使用   
:选择属性id为111的元素(不管元素的标签名是什么,只要属性id=111)
//*[@id='111']
:选择具有id属性的所有页面元素
//*[@id]
:div中任何类型的第2个元素
//div/*[2]
 
# 选择属性值包含某个字符串的元素,例:选择href属性值包含baidu
//*[contains(@href,'baidu')]
 
# 选择属性值以某个字符串开头的元素,例:href属性以http开头
//*[starts-with(@href,'http')]
 
# 选择属性值以某个字符串结尾的元素,例:href属性以cn结尾
//*[ends-with(@href,'cn')]
 
# 范围选择:正数用position()函数;倒数时position()和last()配合使用,last()表示最后一个元素
:选择option类型第1到2个子元素
//option[position()<3]
:选择class属性为red的前3个子元素
//*[@class='red']/*[position()<4]
:选择class属性为red的后3个子元素
//*[@class='red']/*[position()>=last()-2]
 
# 组选择,如,两种条件满足其一即可,两条件之间用 | 关联
:选择所有id=111或class=t的元素(等于CSS选择器中的 #1,.t)
//*[@id='111'] | //*[@class='t'] 
 
# 选择父节点  /..
:选择id=111的父节点
//*[@id='111']/..
 
# 选择兄弟节点  前面的兄弟节点:preceding-sibling::   后续兄弟节点:following-sibling::   
:选择id=111的元素的所有前面的兄弟节点
//*[@id='111']/preceding-sibling::*
:选择id=111的元素的所有后续的兄弟节点(等于CSS选择器中的 ~)
//*[@id='111']/following-sibling:: *