解析XPath的模块有很多,这里使用第三方模块lxml模块解析。
首先安装模块:
pip install lxml
XPath常用路径表达式
符号 | 含义 |
---|---|
nodename | 获取此节点的所有子节点 |
/ | 从当前节点选取子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
* | 选取所有节点 |
以下面这段代码中的HTML源码为例
from lxml import etree
import csv
wb_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
# 创建一个Element对象
html_element = etree.HTML(wb_data)
程序运行结果
子模块etree的 HTML() 方法用于解析字符串类型的HTML代码。
如果是本地的HTML文件,则可以使用子模块etree的parse()方法:
parser = etree.HTMLParser() # 创建一个HTMLParser对象
html = etree.parse('demo.html', parser=parser) # 解析demo.html文件
获取li标签下面的a标签的href属性
选择属性用@符号。
links = html_element.xpath('//li/a/@href')
print(links)
输出结果:
获取li标签下面的a标签的文件数据
text() 表示标签的文本内容。
results = html_element.xpath('//li/a/text()')
print(results)
输出结果:
__
将上边获取的两组结果组合成字典{‘href’:‘link1.html’,‘tilte’:‘first item’}
lst = []
for link in links:
d = {
}
d['href'] = link
d['title'] = results[links.index(link)]
lst.append(d)
print(lst)
写入csv文件(存储数据)
headers = ('href', 'title')
with open('aaa.csv', 'w', encoding='utf-8', newline='') as f:
witer = csv.DictWriter(f, headers)
witer.writeheader()
witer.writerows(lst)
保存完成。