java爬虫工具xpath提取,2020-07-16--爬虫数据提取--xpath

xpath

全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索

XPath 的选择功能十分强大,它提供了非常简洁的路径选择表达式,另外还提供了超过100个内置函数,用于字符串,数值,时间的匹配 以及节点和序列的处理

XPath 于1999年11月16日成为W3C标准 被设计为供XSLT、XPointer、以及其它XML解析软件使用

常用节点选择工具 Chrome插件 XPath Helper(下载crx扩展程序进行安装)

xpath工作原理就是通过对hmtl代码标签以及属性和css样式的抓取获取相应数据,所以要使用xpath必须做到对html代码了解。

常用规则

nodename 选取此节点的所有子节点

/ 从当前节点选取直接子节点

// 从当前节点选取子孙节点

. 选取当前节点

.. 选取当前节点的父节点

@ 选取属性

安装lxml

在终端

pipinstall lxml==4.5.0

实例

from lxml import etree #导入lxml的etree模块

text='''

  • first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

html = etree.HTML(text)#调用HTML类,初始化构造一个XPath解析对象

print(html) #

result = etree.tostring(html) #将HTML对象转为字节数组

print(result.decode('utf-8')) #解码输出字符串

print('*'*50)

'''

也可以获取本地的文件进行解析

'''

html1 = etree.parse('a.html',parser=etree.HTMLParser())

print(html) #

result1 = etree.tostring(html1)

print(result1.decode('utf-8'))

a.html:

Title
  • first item
  • second item
  • third item
  • fourth item
  • fifth item

1.1所有节点

一般会用//开头的XPath规则来选取所有符合要求的节点

例如:

from lxml import etree

html = etree.parse('a.html',etree.HTMLParser())

result1 = html.xpath('//*') #查找所有节点

print(result1)

*代表匹配所有节点 返回一个列表 每个元素是Element类型 其后是节点名

1.2指定节点

result2 = html.xpath('//li') #查找li元素所有节点

将html文档中所有的li标签查找出来

1.3子节点

通过/或者// 查找元素子节点或子孙节点

例如: 查找li节点的所有直接子节点a

result3 = html.xpath('//li/a') #查找li标签下的子节点a

print(result3)

查找li节点下所有子孙节点a

result4 = html.xpath('//li//a') #li标签下的所有a节点

print(result4)

1.4父节点

查找href="link4.html"的a标签的父节点的class值

result5 = html.xpath('//a[@href="link4.html"]/../@class')

print(result5) # ['item-1']

也可以通过parent:: 获取其父节点

# 查找href="link4.html"的a标签的所有父节点的class值,parent::*表示所有父节点,*可以替换指定标签

result5 = html.xpath('//a[@href="link4.html"]/parent::*/@class')

print(result5) # ['item-1']

1.5属性过滤

选取class为item-0 的li节点

result6 = html.xpath('//li[@class="item-1"]')

print(result6)

1.6文本获取

用xpath中text()方法获取节点中的文本

获取li节点中的文本

获取指定li标签下a标签的文本

e1 = html.xpath('//li[@class="item-1"]/a/text()') #返回list,['second item', 'fourth item']

print(e1)

获取指定li标签下所有的文本

e2 = html.xpath('//li[@class="item-0"]//text()')

print(e2)#返回三个结果

获取p标签中的文本

e3 = html.xpath('//p/text()')

print(e3)

1.7属性获取

获取指定li标签下所有a标签的href属性值

e4 = html.xpath('//li[@class="item-1"]/a/@href')

print(e4)

1.8属性多值

当一个标签有多个属性值时,怎么查找。

使用contains()函数:

包含任意一个属性即可匹配

text='''

first item

'''

html = etree.HTML(text)

result = html.xpath('//li[contains(@class,"li")]/a/text()')

print(result)#返回结果是["first item"]

1.9多属性

有时需要匹配一个标签的多个属性时,采用运算符进行连接

text='''

first itemsecond item

'''

html = etree.HTML(text)

result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')

print(result) #返回结果是["first item"]

1.10常见运行算符

85858cef0815

查找多个元素标签

查找p标签和li标签

e4 = html.xpath('//p|//li')

1.11按序选择

有时候选择某些属性 可能同时匹配了多个节点 但是想要其中某个节点

如 第一个节点或者最后一个节点

'''排序'''

# 第一个li元素

e7 = html.xpath('//li[1]/a/@href')

print(e7) #['link1.html']

#最后一个li元素

e8 = html.xpath('//li[last()]/a/@href')

print(e8) #['link5.html']

#前两个li元素

e9 = html.xpath('//li[position()<3]/a/@href')

print(e9) #['link1.html', 'link2.html']

#倒数第三个

e10 = html.xpath('//li[last()-2]/a/@href')

print(e10)

1.12 节点轴选择

xpath提供了很多节点轴选择方法 包括子元素,兄弟元素,父元素,祖先元素等

'''节点轴选择'''

from lxml import etree

text='''

  • 11first item
  • second item
  • third item
  • fourth item
  • fifth item

'''

html = etree.HTML(text)

result = html.xpath('//li[1]/ancestor::*')

print(result)# 获取第一个li所有祖先节点 包括html body div ul

result = html.xpath('//li[1]/ancestor::div')

print(result)#限定条件 div

result = html.xpath('//li[1]/attribute::*')

print(result)#获取所有属性值 返回li节点所有属性值

result = html.xpath('//li[1]/child::a[@href="link1.html"]')

print(result)#获取所有直接子节点 限定条件href = link1.html

result = html.xpath('//li[1]/descendant::span')

print(result)# 获取所有子孙节点 限定span节点 不包含a节点

result = html.xpath('//li[1]/following::*[2]/text()')

print(result)#获取当前节点之后的所有节点 虽然加了* 但又加了索引选择 只获取第二个后续节点

result = html.xpath('//li[1]/following-sibling::*')

print(result)#获取当前节点之后的所有同级节点

实战爬取百度校花吧

分析:

分析校花吧的url以及网页结构:

85858cef0815

分析可得:我们要爬取的内容以及网页是分页显示的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant压缩在哪卸载_反病毒软件这么多,到底哪一款适合你

记得大学读书的时候,买了电脑,第一件事情就是卸载windows自带的杀毒软件,然后装上自己心仪的杀毒软件,可是市面上杀毒软件这么多,哪一款适合你呢?我找了市面上排名最靠前的三款杀毒软件,让我们看看他们孰胜孰劣,还是各有千秋.他们分别是腾讯的电脑管家,金山毒霸,360安全卫士.这…

连接局域网的SQL Server数据库配置

首先要保证两台机器位于同一局域网内,然后打开配置工具→SQL Server配置管理器进行配置,将MSSQLSERVER的协议的TCP/IP的(IP1,IP2)TCP端口改为1433,已启用改为是。 服务器名称:输入IP 登录名:输入数据库帐号

.NetCore使用NETCore.MailKit发送邮件

前言平时工作中很少用到需要发邮件的功能&#xff0c;所以邮件这块的功能也没有太过关注。近期有一个项目需要接收用户的反馈&#xff0c;上边决定使用邮件&#xff0c;直接将反馈信息发送给领导&#xff0c;也就有了这篇文章。实现发邮件不难&#xff0c;但是开发中遇到了一个…

Erlang 进程创建性能测试

测试代码来自 Progremming Erlang。Erlang&#xff1a; R13B (erts-5.7.1)&#xff0c; 启动参数 P 5000000系统&#xff1a; Window XPCPU&#xff1a; E8200 2.66G 双核内存&#xff1a; 4GErlang R13B (erts-5.7.1) [smp:2:2] [rq:2] [async-threads:0]Eshell V5.7.1 (abor…

Linux bash shell基础语法

转自&#xff1a;http://blog.sina.com.cn/s/blog_46177c3401014fty.html一、Shell基本类型的变量&#xff1a;&#xff08;1&#xff09;Shell定义的环境变量&#xff1a;Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量&#xff0c;用户还可以重新定义这些变量…

通俗理解T检验与F检验的区别【转】

转自&#xff1a;http://blog.sina.com.cn/s/blog_4ee13c2c01016div.html1&#xff0c;T检验和F检验的由来一般而言&#xff0c;为了确定从样本(sample)统计结果推论至总体时所犯错的概率&#xff0c;我们会利用统计学家所开发的一些统计方法&#xff0c;进行统计检定。 通过把…

shell之通过if [ $? != 0 ]判断上次程序是否执行成功

1、问题 在shell脚本里面有时候我们需要判断上一个程序有没有执行成功&#xff0c;比如用chomd 777 file命令&#xff0c;我们可以用通过if [ $? ! 0 ]判断 $?这里表示上一次运行的结果 2、代码实现 #!/bin/bashtest() {return 2; }testresult$?echo "result is:&q…

哄媳妇

1、如果你的女人在你面前哭了&#xff0c;无论什么原因&#xff0c;请抱紧她&#xff0c;再反抗也要抱紧&#xff0c;趴在桌子上永远没有在你怀里安心&#xff1b; 2、如果你的女人指出了你的不是&#xff0c;请不要总是嫌她唠叨&#xff0c;若不是因为在乎她不会说你&#xff…

自己搭建一个k8s环境

背景Kubernetes 是时下流行的容器编排引擎&#xff0c;因为字母太多&#xff0c;且掐头去尾后剩下 8 个字母&#xff0c;于是被大家亲切的缩写为 k8s。Kubernetes https://kubernetes.io/另外所谓“云原生”概念火爆&#xff0c;各大云厂商也纷纷推出了自己的容器服务&#xff…

大数据在金融领域的应用及问题时

互联网使信息变的扁平&#xff0c;但是信息的利用效率却没有得到提高&#xff0c;因为技术的限制和认知的局限&#xff0c;海量的信息无法深度挖掘价值&#xff0c;甚至是信息本身被直接忽视。很多情况下人们能看到的只是互联网的便利&#xff0c;而挖掘信息背后的价值则无从做…

个人电脑 公司电脑 代理_这样的电脑谁来用?一体式水冷,磁悬浮风扇!

原标题&#xff1a;这样的电脑谁来用&#xff1f;一体式水冷&#xff0c;磁悬浮风扇&#xff01;海盗船是个人电脑市场资历最老、信誉最好的个人电脑元件制造商之一。该公司最初的产品主要是和存储相关的&#xff0c;后来&#xff0c;海盗船开始慢慢向其他细分市场扩张。虽然他…

VMware虚拟机中CentOS网络设置

在VMware虚拟机中安装了一个CentOS系统&#xff0c;试着学习了一下该系统下的网络设置&#xff0c;记录如下&#xff1a; VMware虚拟机中比较方便的联网方式是NAT方式&#xff0c;这里采用该方式。 CentOS默认使用ipv6协议联网&#xff0c;则虚拟机会给该系统分配ipv6地址&…

filegetcontents php 返回值,php – file_get_contents没有返回任何数据

标签&#xff1a;php所以我正在使用足球联赛API,我让它返回我需要的数据.然而,它现在突然停止工作,我不知道为什么.class leagueTable {public $data;public $baseUri;public $config;public $tr;public function __construct($payload) {$this->data $payload;$this->c…

shell之用command在终端判断是否存在这个命令

1、command解释 command命令在shell脚本里面&#xff0c;如果发现有个函数和我们需要执行的命令同名&#xff0c;我们可以用command用来强制执行后面的命令&#xff0c;而不是同名函数&#xff0c;然后我们也可以在shell脚本里面判断莫个命令是否存在&#xff0c;我们平时一般…

关于.NET

.NET简单分析&#xff1a; .Net目前主要的开发方向主要分为&#xff1a;Web开发、桌面系统开发、移动开发。1、Web开发&#xff1a;通俗的说就是开发网站&#xff0c;包括类似于大众点评网等这样的互联网以及OA等内网系统&#xff0c;Web开发是目前.Net开发的主要方向。&#x…

沿途风景

1.麦积山&#xff08;甘肃省天水市麦积区&#xff09;2014年8月27日 2.柳湖公园&#xff08;甘肃省平凉市&#xff09;2014年8月25日 3.崆峒山&#xff08;甘肃省平凉市&#xff09;2014年8月26日 4.净土寺&#xff08;甘肃省天水市麦积区&#xff09;2014年8月27日 5.仙人崖&a…

如何格式化电脑_移动硬盘提示格式化如何解决?数据恢复软件解决问题

使用移动硬盘的时候&#xff0c; 硬盘用久了&#xff0c;会出现各种各样的错误&#xff0c;最终导致无法使用&#xff0c;常常出现提示“格式化”&#xff0c;这时候就挺烦恼的&#xff0c;如果使用不当的话&#xff0c;就会引发各种奇怪的问题&#xff0c;其中最严重的的就是提…

运营商在万物互联扮演什么角色?上海联通NB-IoT奠定基础

万物互联时代&#xff0c;人与人、人与物、物与物之间都通过网络进行更紧密的联系&#xff0c;实现更智能、更安全化的生活。而刚刚冻结标准的窄带物联网&#xff08;NB-IoT&#xff09;也成为本届“世界移动大会上海”上的焦点&#xff0c;联通的展台将会展出与华为合作的NB-I…

在 WASI 上运行 .NET 7 应用程序

WASI代表 WebAssembly 系统接口&#xff0c;WASI 让沙盒化的 WebAssembly 应用程序通过一系列类似 POSIX 的函数访问底层操作系统&#xff0c;允许独立于浏览器运行 WebAssembly 代码。这是一个高度实验性的项目&#xff0c;但同时也是一个非常有趣的项目&#xff0c;并且有可能…

Android之通过ContentProvider实现两个app(进程间)间通信以及函数调用

1、ContentProvider简单介绍 ContentProvider以在不同的应用程序之间共享数据,ContentProvider底层实现是Binder,它为存储和获取数据提供统一的接口 2、实现哪些功能? 比如我们有两个app,分别是ContentProviderServer和ContentProviderClient 1)、需要在app里面ContentPro…