使用 XPath
XPath 简介:
(1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 XPath 来进行提取
(2) XPath 即 XML Path Language,XML路径语言,起初是用来在 XML 文档中提取信息的,但同样适用于在 HTML 文档中提取信息,通过 XPath 来定位一个或多个HTML节点
(3) 什么是HTML节点:https://www.cnblogs.com/pzk7788/p/10530042.html ;在 Python 中,使用 lxml 库进行信息的提取,可以使用 pip3 install lxml 进行安装
XPath 规则:
// 用于提取指定的节点,如 //p 表示提取所有 <p> 节点
/ 用于提取当前节点的子节点,如 //ul/li 表示提取 <ul> 下的 <li> 节点
.. 用于提取当前节点的父节点,如 //body/../html 表示提取 <body> 节点的上一层 <html> 节点
@ 用于提取属性,如 //a[@href] 表示提取 <a> 节点的 href 属性值
XPath 用法:
假设 index.html 内容如下,使用 XPath 提取我们想要的内容:
<div>
<ul>
<li class="item-1"><a href="link1.html">first item</a> </li>
<li class="item-2"><a href="link2.html">second item</a> </li>
<li class="item-3"><a href="link3.html">third item</a> </li>
<li class="item-4"><a href="link4.html">fourth item</a> </li>
<li class="item-5 id-6"><a href="link5.html">fifth item</a> </li>
</ul>
</div>
from lxml import etree html = etree.parse('./index.html', etree.HTMLParser()) //etree.parse()用于加载本地文件,etree.HTMLParser() 是一个 HTML 解析器,用于解析 HTML 文件 result = html.xpath('//li') //提取所有<li>节点,结果为:[<Element li at 0x488030>, <Element li at 0x484fd0>, ......
result = html.xpath('//li/a') //提取所有 <li> 节点下的 <a> 节点,结果为:[<Element a at 0x3c28030>, <Element a at 0x3c24fd0>, ......
result = html.xpath('//li/a/text()') //提取所有 <li> 节点下的 <a> 节点的文本内容,结果为:['first item', 'second item', 'third item', 'fourth item', 'fifth item']
result = html.xpath('//li/a/@href') //提取所有 <li> 节点下的 <a> 节点的 href 属性值,结果为:['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
result = html.xpath('//li[1]/a/text()') //提取第一个出现的 <li> 节点,结果为:['first item']
result = html.xpath('//li[last()]/a/text()') //提取最后一个出现的 <li> 节点,结果为:['fifth item']
result = html.xpath('//li[last()-2]/a/text()') //提取倒数第三个出现的 <li> 节点,结果为:['third item']
result = html.xpath('//li[position()<3]/a/text()') //提取位置小于3的 <li> 节点,结果为:['first item', 'second item']
result = html.xpath('//a[@href="link4.html"]') //提取属性为 href="link4.html" 的 <a> 节点,结果为:[<Element a at 0x33b4fd0>]
result = html.xpath('//a[@href="link4.html"]/../@class') //提取属性为 href="link4.html" 的 <a> 节点的父节点,然后获取父节点的 class 属性,结果为:['item-4']
result = html.xpath('//li[1]/ancestor::*') //ancestor用于提取祖先节点,也就是提取第一个<li>节点上面的所有节点,结果为:[<Element html at 0x3738058>, <Element body at 0x3734fd0>, ......
result = html.xpath('//li[1]/ancestor::div') //ancestor用于提取祖先节点,这里表示提取第一个<li>节点上面的<div>节点,结果为:[<Element div at 0x3554fd0>]
result = html.xpath('//li[1]/attribute::*') //attribute用于提取节点的属性值,这里表示提取第一个<li>节点的所有属性值,结果为:['item-1']
result = html.xpath('//li[1]/child::*') //child用于提取指定节点下的所有子节点,这里表示提取第一个<li>节点下的所有子节点,结果为:[<Element a at 0xb58030>]
result = html.xpath('//li[contains(@class, "item") and contains(@class, "id")]') //在上面的最后一个 <li> 节点中,class属性有两个值,我们需要使用 contains 来进行模糊匹配,表示提取属性值包含 item 和 id 的节点
使用 XPath的更多相关文章
- xpath提取多个标签下的text
title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- 在Java中使用xpath对xml解析
xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等.在学习本文档之前应该对XML的节点,元素 ...
- XPath 学习二: 语法
XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 下面列出了最有用的路径表达式: 表达式 描述 nodename 选 ...
- xpath 学习一: 节点
xpath 中,有七种类型的节点: 元素.属性.文本.命名空间.处理指令.注释.以及根节点 树的根成为文档节点或者根节点. 节点关系: Parent, Children, sibling(同胞), A ...
- Python爬虫利器三之Xpath语法与lxml库的用法
前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- 关于robotframework,app,appium的xpath定位问题及常用方法
关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...
- Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium
Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...
- xpath定位中starts-with、contains和text()的用法
starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...
随机推荐
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- 设置将Maven的jar包发布到lib
2,设置将Maven的jar包发布到lib下. Add -> Java Build Path Entries -> Maven Dependencies -> Finish 设置完成 ...
- java华为面试题
JAVA方面 1 面向对象的特征有哪些方面 2 String是最基本的数据类型吗? 3 int 和 Integer 有什么区别 4 String 和StringBuffer的区别 5运行时异常与一般异 ...
- 基于jquery网站左侧下拉菜单
网站左侧下拉菜单jQuery代码.这是一款蓝色风格的适合做后台下拉菜单代码.效果图如下: 在线预览 源码下载 实现的代码: <div class="container"& ...
- displaytag的Excel导出实践
本文转自 http://lingceng.iteye.com/blog/1820081/ Displaytag官网有1.0, 1.1, 1.2等,注意找到对应的版本.源码和API可以在Maven库中找 ...
- 【C#】图像的变形/变换/扭曲。用Emgu或YLScsFreeTransform(FreeImageTransformation)或MagickImage
需求:将图像变形,如矩形图片变换成梯形的,图素拉伸. 解决方案:目前找到有两种. 使用EmguCV,它是.Net版的OpenCV.推荐直接在VS里的Nuget中搜索EmguCV进行下载. 使用第三方库 ...
- java执行jar包
一般运行包含manifest的jar包,可以使用 java -jar <jar-file-name>.jar 如果jar里没有 manifest,则可以使用 java -cp foo.ja ...
- Jqueruy验证 form表单提交之前的中的数据
//---表单提交---- $("#destiation_form").submit(function(){ var from_city_value=$("#from_c ...
- r 数据分组处理
一.R语言实现数据的分组求和 实验数据集 姓名,年龄,班级 ,成绩, 科目 student <- data.frame ( name = c("s1", "s2&q ...
- 软件测试工具MonkeyTalk使用方法
1.简单介绍 MonkeyTalk软件测试工具由两部分构成:MonkeyTalk IDE 和 MonkeyTalk Agents MonkeyTalk IDE是Eclipse平台的工具,工能是:对iO ...