标签:The 第一个 默认 文件 htm 补全 基本使用 har 直接
节点类型
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。其中,XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
比如说:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore> #文档节点
<book>
<title lang="en">Harry Potter</title> #lang="en"属性节点
<author>J K. Rowling</author> #元素节点
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
基本值(原子值)
基本只是无父或无子的节点
JJ K. Rowling
"en"
节点关系
①父:每个元素及属性都有一个父
②子:元素节点可有零个、一个、多个子
③同胞:拥有相同的父的节点
④先辈:某节点的父、父的父
⑤后代:某个节点的子、子的子,等等
选取节点
表达式 | 描述 |
---|---|
nodename(节点名) | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点,比如说 ‘.//a‘ 就是获取某一个节点下的a标签,而不是整个文档中的a标签 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
谓语
谓语是用来查找某个特定的节点或者包含某个指定的值的节点
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()<2] | 选取第一个 bookstore 的子元素 book 元素 |
//title[@lang] | 选取有 lang 属性的 title 元素 |
//title[@lang=‘eng‘] | 选取有值为 eng 的 lang 属性的 title 元素 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
通配符 | 描述 | 例子 |
---|---|---|
* | 匹配任何元素节点 | /bookstore/*,选取bookstore的所有子元素 |
@* | 匹配任何属性节点 | //title[@*],选取所有带有属性的title元素 |
解析html字符串:
from lxml import etree #使用lxml的etree
url = ‘www.baidu.com‘
resp = requests.get(url) #获取HTML网页信息
text = resp.text #获取一个 unicode 型的文本数据(字符串)
html = etree.HTML(text) #利用etree.HTML,将字符串解析为HTML文档
注:在使用lxml来解析HTML代码的时候,如果HTML代码不规范,它会自动补全。
注:上述定义的html并不是一个字符串,而是一个对象。
解析html文件:
在使用 ‘lxml.etree.parse‘ 进行解析时,这个函数默认使用的是 ‘XML‘ 解析器,所以遇到不规范的html代码时会解析错误,这时候要自己指定 ‘HTML‘ 解析器。
parser = etree.HTMLParser(encoding=‘utf-8‘)
html = etree.parse(‘文件.html‘,parser=parser)
print(etree.tostring(html, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element对象转换成字符串输出
与xpath结合
①获取一个html对象中所有的tr标签
trs = html.xpath(‘//tr‘) # ‘.xpath‘ 返回的是一个list
for tr in trs:
print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element转换成str输出
②获取第二个tr标签
tr = html.xpath(‘//tr‘)[0] #因为 ‘.xpath‘ 返回的是列表,所以获取第一个元素需要加[0]
③获取所有class等于even的tr标签
trs = html.xpath(‘//tr[@class=‘even‘]‘)
for tr in trs:
print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘))
④获取所有a标签的href属性的值
datas = html.xpath(‘//a/@href‘)
for data in datas:
print(data) #该例href的值已经是一个str类型,所以不用再使用 ‘.tostring‘ 方法
⑤获取文本信息
data = tr.xpath(‘./td[3]/text()‘)[0] #xpath返回的永远是list,不要忘记加[0]
注:如果文本信息不是直接在td标签下的话,就要 ‘//text()‘
标签:The 第一个 默认 文件 htm 补全 基本使用 har 直接
原文地址:https://www.cnblogs.com/Vinson-Cheung/p/12639162.html