更简单高效的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 [1]: page.xpath('head')
从根节点进行查找
- In [2]: page.xpath('/html')
- Out[2]: [<Element html at 0x11208be88>]
- In [2]: page.xpath('/html')
从整个文档中所有节点查找
- In [3]: page.xpath('//book')
- Out[3]:
- [<Element book at 0x1128c02c8>,
- <Element book at 0x111c74108>,
- <Element book at 0x111fd2288>,
- <Element book at 0x1128da348>]
- In [3]: page.xpath('//book')
选取当前节点的父节点
- In [4]: page.xpath('//book')[0].xpath('..')
- Out[4]: [<Element bookstore at 0x1128c0ac8>]
- In [4]: page.xpath('//book')[0].xpath('..')
选取属性
- In [5]: page.xpath('//book')[0].xpath('@category')
- Out[5]: ['COOKING']
- In [5]: page.xpath('//book')[0].xpath('@category')
节点查找
表达式 | 结果 |
---|---|
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']
- In [1]: page.xpath('//book[2]/@category')
选取倒数第三个book元素
- In [2]: page.xpath('//book[last()-2]/@category')
- Out[2]: ['CHILDREN']
- In [2]: page.xpath('//book[last()-2]/@category')
选取第二个元素开始的所有元素
- In [3]: page.xpath('//book[position() > 1]/@category')
- Out[3]: ['CHILDREN', 'WEB', 'WEB']
- In [3]: page.xpath('//book[position() > 1]/@category')
选取category属性为WEB的的元素
- In [4]: page.xpath('//book[@category="WEB"]/@category')
- Out[4]: ['WEB', 'WEB']
- In [4]: page.xpath('//book[@category="WEB"]/@category')
未知节点
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
匹配第一个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>]
- In [1]: page.xpath('//book[1]/*')
获取节点中的文本
用
text()
获取某个节点下的文本- In [1]: page.xpath('//book[1]/author/text()')
- Out[1]: ['Giada De Laurentiis']
如果这个节点下有多个文本,则只能取到一段。
- In [1]: page.xpath('//book[1]/author/text()')
用
string()
获取某个节点下所有的文本- In [2]: page.xpath('string(//book[1])')
- Out[2]: '\n Everyday Italian\n Giada De Laurentiis\n 2005\n 30.00\n '
- In [2]: page.xpath('string(//book[1])')
选取多个路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
- 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采用业界 ...
随机推荐
- MSP430 G2553 Timer 中断总结
目前总共用到了四个中断向量,我觉得已经把G2553的所有定时器中断都用到了. 定时器有两个,TA0与TA1,每个定时器又有两个中断向量 1,CCR0到达时的中断,在计数模式时候很有用,平时定时器的基本 ...
- Scala 返回多个值
class A{ var c var d def return={ (c,d,"soyo") //以元组形式返回 }}调用: val s=new A var(a1,a2,a3)=s ...
- php的session
来源:http://blog.163.com/lgh_2002/blog/static/4401752620105246517509/ http协议是WEB服务器与客户 端(浏览器)相互通信的协议,它 ...
- [Apple开发者帐户帮助]九、参考(6)支持的功能(watchOS)
watchOS扩展可用的功能取决于您的程序成员身份. 注意:对于watchOS应用程序目标,可用的功能是应用程序组和后台模式,并且不依赖于您的程序成员身份. 能力 ADP 企业 Apple开发者 应用 ...
- Oh,mygoddess
很早的时候就看了这一道题目 , 当时不会做 , 现在 边听歌边写无压力 ........ 题意 : 光辉骑士 一直都在 迷宫的右上角 , 第一行给你迷宫的规格 , 下面是迷宫 "O" ...
- NS2学习笔记(五)
对无线网络,生成nam文件要使用namtrace-all-wireless, 而不是namtrace-all: set nf [open test_1.nam w] $ns_ namtrace-all ...
- BZOJ 3625 多项式求逆+多项式开根
思路: RT //By SiriusRen #include <bits/stdc++.h> using namespace std; <<,mod=; int A[N],C[ ...
- 【洛谷2469/BZOJ1927】[SDOI2010]星际竞速(费用流/最小路径覆盖)
题目: 洛谷2469 分析: 把题目翻译成人话:给一个带边权的DAG,求一个路径覆盖方案使路径边权总和最小.从点\(i\)开始的路径需要额外加上\(A_i\)的权值. 回xian忆chang一xue下 ...
- [转]Linux命令之iconv
转自:http://lorna8023.blog.51cto.com/777608/420313 用途说明 iconv命令是用来转换文件的编码方式的(Convert encoding of given ...
- mysql远程服务器访问数据库
创建一个MySQL用户,并设置可以远程访问 grant usage on *.* to 'fred'@'localhost' identified by 'fred';//创建用户fred密码ferd ...