16.python爬虫—Xpath

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'}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值