更简单高效的HTML数据提取-Xpath
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
相比于BeautifulSoup
,Xpath
在提取数据时会更加的方便。
安装
在Python中很多库都有提供Xpath
的功能,但是最基本的还是lxml
这个库,效率最高。在之前BeautifulSoup
章节中我们也介绍到了lxml
是如何安装的。
pip install lxml
语法
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
我们将用以下的HTML文档来进行演示:
html_doc = '''<html>
<head></head>
<body>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year> <price>39.95</price> </book> </bookstore></body></html>''' from lxml import etree
page = etree.HTML(html_doc)
路径查找
表达式 | 描述 |
---|---|
nodename | 选取此节点的子节点。 |
/ | 从当前根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
查找当前节点的子节点
In [1]: page.xpath('head')
Out[1]: [<Element head at 0x111c74c48>]从根节点进行查找
In [2]: page.xpath('/html')
Out[2]: [<Element html at 0x11208be88>]从整个文档中所有节点查找
In [3]: page.xpath('//book')
Out[3]:
[<Element book at 0x1128c02c8>,
<Element book at 0x111c74108>,
<Element book at 0x111fd2288>,
<Element book at 0x1128da348>]选取当前节点的父节点
In [4]: page.xpath('//book')[0].xpath('..')
Out[4]: [<Element bookstore at 0x1128c0ac8>]选取属性
In [5]: page.xpath('//book')[0].xpath('@category')
Out[5]: ['COOKING']
节点查找
表达式 | 结果 |
---|---|
nodename[1] | 选取第一个元素。 |
nodename[last()] | 选取最后一个元素。 |
nodename[last()-1] | 选取倒数第二个元素。 |
nodename[position()<3] | 选取前两个子元素。 |
nodename[@lang] | 选取拥有名为 lang 的属性的元素。 |
nodename[@lang='eng'] | 选取拥有lang属性,且值为 eng 的元素。 |
选取第二个book元素
In [1]: page.xpath('//book[2]/@category')
Out[1]: ['CHILDREN']选取倒数第三个book元素
In [2]: page.xpath('//book[last()-2]/@category')
Out[2]: ['CHILDREN']选取第二个元素开始的所有元素
In [3]: page.xpath('//book[position() > 1]/@category')
Out[3]: ['CHILDREN', 'WEB', 'WEB']选取category属性为WEB的的元素
In [4]: page.xpath('//book[@category="WEB"]/@category')
Out[4]: ['WEB', 'WEB']
未知节点
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
匹配第一个book元素下的所有元素
In [1]: page.xpath('//book[1]/*')
Out[1]:
[<Element title at 0x111f76788>,
<Element author at 0x111f76188>,
<Element year at 0x1128c1a88>,
<Element price at 0x1128c1cc8>]
获取节点中的文本
用
text()
获取某个节点下的文本In [1]: page.xpath('//book[1]/author/text()')
Out[1]: ['Giada De Laurentiis']如果这个节点下有多个文本,则只能取到一段。
用
string()
获取某个节点下所有的文本In [2]: page.xpath('string(//book[1])')
Out[2]: '\n Everyday Italian\n Giada De Laurentiis\n 2005\n 30.00\n '
选取多个路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
In [1]: page.xpath('//book[1]/title/text() | //book[1]/author/text()')
Out[1]: ['Everyday Italian', 'Giada De Laurentiis']
更简单高效的HTML数据提取-Xpath的更多相关文章
- 云如何让App开发更简单?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借 ...
- 让开发更简单 —— Coding Enterprise 发布
今天,我们很高兴地宣布 Coding Enterprise 发布了 —— Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大 ...
- 数据提取--JSON
什么是数据提取? 简单的来说,数据提取就是从响应中获取我们想要的数据的过程 非结构化的数据:html等 结构化数据:json,xml等 处理方法:正则表达式.xpath 处理方法:转化为python数 ...
- HiLink & LiteOS & IoT芯片 让IoT开发简单高效
HiLink & LiteOS & IoT芯片让IoT开发简单高效 华为HiLink & LiteOS & IoT芯片使能三件套,让IoT开发更简单高效.下一代智能手机 ...
- SQL 正则表达式使模式匹配和数据提取变得更容易
SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易 David Banister 本文讨论: 使用正则表达式进行高效的 SQL 查询 SQL Server 2005 对正则表达式 ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)
上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...
- Python爬虫10-页面解析数据提取思路方法与简单正则应用
GitHub代码练习地址:正则1:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac15_RE1.py 正则2:match. ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。
微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...
随机推荐
- bzoj 1935 Tree 园丁的烦恼
题目大意: 一些点,每次查询一个矩形内有多少个点 思路: 因为空间太大 所以不能用什么二维树状数组 需要把这些点和所有查询的矩阵的左下和右上离线下来 先离散化 然后每个子矩阵像二维前缀和那样查询 按照 ...
- Counterfeit Dollar
http://poj.org/problem?id=1013 #include<stdio.h> #include<string.h> #include<math.h&g ...
- xfs文件备份恢复篇一vm中linux新增磁盘
XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统.centos7选择xfs格式作为默认文件系统,而且不 ...
- CyclibcBarrier与CountDownLatch区别
1.CyclibcBarrier的线程运行到某个位置后即停止运行,直到所有的线程都到达这个点,所有线程才开始运行:CountDownLatch是线程运行到某个点后,计数器-1,程序继续运行即Cycli ...
- 【LeetCode】 -- 68.Text Justification
题目大意:给定一个数组容器,里面存有很多string: 一个int maxWith.让你均匀安排每一行的字符串,能够尽可能的均匀. 解题思路:字符串+贪心.一开始想复杂了,总觉的题意描述的不是很清楚, ...
- 未能加载文件或程序集Microsoft.SharePoint.Sandbox.dll
项目引用了MiscroSoft.SharePoint.dll程序集,编译后页面报错: 未能加载文件或程序集“Microsoft.Sharepoint.Sandbox, Version=14.0.0.0 ...
- c#异步多线程
1.asyncrel = delegate.BeginInvoke实现委托异步调用. 2.异步等待 asyncrel.IsCompleted用于判断是否执行完毕 or EndInvoke用于等待执行完 ...
- 商业计算中Java高精度计算BigDecimal类
<Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{ p ...
- 使用adb命令提示端口被占用
图是我的65535端口被占用了,一般adb默认使用的是5037端口##方式一 5037为adb默认端口,若5037端口被占用,查看占用端口的进程(使用命令netstat -aon|findstr ...
- ajax不跳转页面的快速删除操作,可添加美观样式
以前我们讲的删除是利用嵌入php代码,跳转到另一个页面,从而降低了删除速度,但我们今天讲的利用ajax不仅可以达到不跳页面快速删除,并且能添加特效来美化页面. 上代码,我们先来做主页面 <!DO ...