今天补完了年前的笔记,开始学新东西
- xpath的基本使用
xpath能解析两种数据(1)本地数据、(2)服务器响应的数据,例如response.read().decode('utf-8')
解析本地文件使用的是etree.parse('xpath路径'),解析服务器响应文件用的是etree.HTML()
tree = etree.parse('xpath基本使用.html')
print(tree)
但出现了报错:lxml.etree.XMLSyntaxError: Opening and ending tag mismatch,查找原因发现是因为html文件的meta开闭标签不匹配,所有的标签最好都用 / 来结束,如下更改后运行成功
<meta charset="UTF-8"/>
xpath的几个基本语法
①路径查询://为查找子孙节点,不考虑层级关系、/为找直接子节点
#查询ul下面的li
li_list = tree.xpath('//body/ul/li')
li_list = tree.xpath('//body//li')
②内容查询:
#获取标签中的内容
li_list = tree.xpath('//body/ul/li[@id]/text()')
③谓词查询:
#查找所有有id属性的li标签
li_list = tree.xpath('//body/ul/li[@id]/text()')
#查找id为l1的li标签
li_list = tree.xpath('//body/ul/li[@id="l1"]/text()')
注意在单引号里写字符串要用双引号括起
④属性查询:
#查找id为l1的li标签的class的属性值
li = tree.xpath('//body/ul/li[@id="l1"]/@class')
⑤模糊查询:
#查找id中包含l的li标签
li_list = tree.xpath('//body/ul/li[contains(@id,"l")]/text()')
#查找id以c开头的li标签
li_list = tree.xpath('//body/ul/li[starts-with(@id,"c")]/text()')
⑥逻辑运算:
#查找id为l1且class为c1的li标签
li_list = tree.xpath('//body/ul/li[@id="l1" and @class="c1"]/text()')
#查找id为l1或为id为l2的标签
li_list = tree.xpath('//body/ul/li[@id="l1"]/text() | //body/ul/li[@id="l2"]/text()')