16.1 Xpath
- XPath 是一门在 XML 文档中查找信息的语言。
- XPath 用于在 XML 文档中通过元素和属性进行导航。
16.1.1 什么是 XPath?
- XPath 使用路径表达式在 XML 文档中进行导航
- XPath 包含一个标准函数库
- XPath 是 XSLT 中的主要元素
- XPath 是一个 W3C 标准
16.1.2 XPath 路径表达式
- XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
- 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
- XPath 使用路径表达式来选取 XML 文档中的节点或节点集。
- 节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
16.2 lxml库
- lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解 析方式,而且解析效率非常高
- 使用入门:
- 导入lxml 的 etree 库 – from lxml import etree html
- 利用etree.HTML,将字符串转化为Element对象
- Element对象具有xpath的方法
- etree = html.etree
- html = etree.HTML(text)
- lxml 可以自动修正 html 代码
16.3 实验
In:
import requests
In:
url = "https://www.liepin.com/zhaopin/?key=大数据分析工程师"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}
In:
req = requests.get(url=url,headers=headers)
cont = req.content.decode()
In:
# import lxml
from lxml import html
In:
et = html.etree
lp_html = et.HTML(cont)
In:
elms = lp_html.xpath("//div[@class='job-info']/p/span[1]/text()")
In:
elms
out:
['10-15k·12薪',
'投递后:7个工作日内反馈',
'10-20k·12薪',
'投递后:72小时反馈',
'10-15k·13薪',
'投递后:7个工作日内反馈',
'10-20k·12薪',
'投递后:10个工作日内反馈',
'7-15k·12薪',
'投递后:10个工作日内反馈',
'7-13k·12薪',
'投递后:7个工作日内反馈',
'面议',
'投递后:10个工作日内反馈',
'35-60k·14薪',
'35-55k·14薪',
'22-30k·14薪',
'20-40k·14薪',
'35-55k·14薪',
'10-20k·12薪',
'投递后:7个工作日内反馈',
'6-10k·13薪',
'投递后:7个工作日内反馈',
'20-30k·12薪',
'15-25k·12薪',
'15-25k·12薪',
'投递后:7个工作日内反馈',
'15-30k·13薪',
'投递后:72小时反馈',
'面议',
'投递后:72小时反馈',
'25-40k·12薪',
'投递后:72小时反馈',
'30-40k·15薪',
'15-25k·13薪',
'15-25k·13薪',
'8-13k·14薪',
'投递后:72小时反馈',
'8-15k·12薪',
'投递后:5个工作日内反馈',
'15-25k·12薪',
'投递后:7个工作日内反馈',
'15-25k·12薪',
'15-28k·12薪',
'20-25k·12薪',
'10-17k·12薪',
'投递后:10个工作日内反馈',
'30-50k·14薪',
'8-12k·12薪',
'投递后:72小时反馈',
'面议',
'投递后:24小时反馈',
'5-10k·12薪',
'投递后:24小时反馈',
'2-3k·12薪',
'投递后:10个工作日内反馈',
'20-30k·12薪',
'15-25k·12薪',
'14-16k·12薪',
'投递后:24小时反馈',
'15-25k·14薪',
'投递后:24小时反馈',
'25-40k·14薪',
'投递后:24小时反馈']
In:
for elm in elms:
print(elm)
out:
10-15k·12薪
投递后:7个工作日内反馈
10-20k·12薪
投递后:72小时反馈
10-15k·13薪
投递后:7个工作日内反馈
10-20k·12薪
投递后:10个工作日内反馈
7-15k·12薪
投递后:10个工作日内反馈
7-13k·12薪
投递后:7个工作日内反馈
面议
投递后:10个工作日内反馈
35-60k·14薪
35-55k·14薪
22-30k·14薪
20-40k·14薪
35-55k·14薪
10-20k·12薪
投递后:7个工作日内反馈
6-10k·13薪
投递后:7个工作日内反馈
20-30k·12薪
15-25k·12薪
15-25k·12薪
投递后:7个工作日内反馈
15-30k·13薪
投递后:72小时反馈
面议
投递后:72小时反馈
25-40k·12薪
投递后:72小时反馈
30-40k·15薪
15-25k·13薪
15-25k·13薪
8-13k·14薪
投递后:72小时反馈
8-15k·12薪
投递后:5个工作日内反馈
15-25k·12薪
投递后:7个工作日内反馈
15-25k·12薪
15-28k·12薪
20-25k·12薪
10-17k·12薪
投递后:10个工作日内反馈
30-50k·14薪
8-12k·12薪
投递后:72小时反馈
面议
投递后:24小时反馈
5-10k·12薪
投递后:24小时反馈
2-3k·12薪
投递后:10个工作日内反馈
20-30k·12薪
15-25k·12薪
14-16k·12薪
投递后:24小时反馈
15-25k·14薪
投递后:24小时反馈
25-40k·14薪
投递后:24小时反馈
In:
lp_html.xpath("//div[@class='job-info']/h3/@title")
out:
['招聘大数据分析工程师/算法工程师',
'招聘高级测试工程师(大数据分析方向)',
'招聘大数据分析-AE工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘数据科学家/算法工程师/大数据分析师Data Scientist',
'招聘大数据分析开发工程师',
'招聘25926-用户画像大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师-风险咨询部门',
'招聘大数据分析工程师',
'招聘大数据分析挖掘工程师-昆山-05417',
'招聘大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师(实习生)',
'招聘大数据分析工程师',
'招聘IP网络大数据分析工程师',
'招聘大数据分析工程师',
'招聘大数据分析工程师(J10166)',
'招聘大数据分析工程师']
In:
text = '''
<div> <ul>
<li class="item-1"><a>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>'''
In:
tx_html = et.HTML(text)
In:
tx_html.xpath("//li[@class='item-1']/a/text()")
out
['first item', 'second item', 'fourth item']
In:
item1_elms = tx_html.xpath("//li[@class='item-1']")
In:
for elm in item1_elms:
dic1 = {}
dic1['url'] = elm.xpath("./a/@href")[0] if len(elm.xpath("./a/@href")) > 0 \
else 'default.html'
dic1['text'] = elm.xpath("./a/text()")[0]
print(dic1)
out
{'url': 'default.html', 'text': 'first item'}
{'url': 'link2.html', 'text': 'second item'}
{'url': 'link4.html', 'text': 'fourth item'}