Python网络爬虫 - Xpath

本文介绍了Python网络爬虫中使用XPath提取数据的方法。XPath是一种在XML和HTML文档中查找信息的语言,用于通过元素和属性定位数据。文章详细讲解了XPath的环境配置、语句格式、语法及特殊情况,强调XPath返回结果为列表,需用列表操作处理。还提到了XPath在Python中的应用,使用lxml库进行解析和数据提取。

我们获取了想要的html页面之后,接下来的问题就是如何将我们需要的数据给提取下来,一 般来说有三种方式,分别是Xpath语法,正则表达式和bs4库。

解析方式解析速度难度
Xpath中等
bs4容易
re(正则表达式)最快困难

Xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言, 可用来在XML和HTML文档中对元素和属性进行遍历。简单来说,我们的数据是超文本数据,想要获取超文本数据里面的内容,就要按照一定规则来进行数据的获取,这 种规则就叫做Xpath语法。

XPath 用于在 HTML 文档中通过元素【HTML标签】和属性【HTML标签的属性】进行数据的定位。

Xpath的环境配置安装:

通常安装在谷歌浏览器(chrome)环境下,可以百度搜索配置方法。

在Python中,为了使用XPath,需要安装一个第三方库:lxml。

Python 里面的lxml库只做了这样一件事:将html字符串进行解析,供Xpath语法进行数据提取。

在线安装:CMD下 pip install lxml

XPath语句格式:

核心思想:写XPath就是写地址。
获取文本:
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../text()

获取属性值:
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../@属性n
其中,[@属性="属性值"]不是必需的。它的作用是帮助过滤相同的标签。在不需要过滤相同标签的情况下可以省略。

XPath语法:

表达式描述用法说明
nodenane选取此节点的所有子节点div选取div下的所有标签
//从全局节点中选择节点,任意位置均可//div选取整个HEML页面的所有div标签
/选取某个节点下的节点//head/title选取head标签下的title标签
@选取带某个属性的节点//div[@id]选择带有id属性的div标签
.当前节点下./span选择当前节点下的span标签
*匹配任意节点//div[@id='u1']/*选择所有拥有id=u1的div标签下的所有节点
@*匹配节点中的任何属性//meta[@*]
//a[@*]
选择所有拥有属性的meta标签
选择所有拥有属性的a标签

注意:Xpath提取数据返回的结果是列表,后续操作需要使用列表操作

表达式用法说明
//head/meta[1]
//head/neta[k]
选择所有head下的第一个meta标签
选择所有head下的第k个meta标签
//head/meta[last()]选择所有head下的最后一个meta标签
//head/meta[postion()<3]选择所有head下的前两个meta标签
//div[@id]选择带有id属性的div标签
//div[@id='u1']选择所有拥有id=u1的div标签
//meta | //title选择所有的meta和title

XPath的特殊情况

(1)以相同字符串开头

在XPath中,属性以某些字符串开头,可以写为:
//标签[starts-with(@属性名, "相同的开头部分")]

<body>     
<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>
<div id="useless">这是我不需要的内容</div>
</body>

//div[starts-with(@id, "test")]/text()

(2)属性值包含相同字符串

//标签[contains(@属性名, "相同的开头部分")]

(3)对XPath返回的对象执行XPath

可以通过下面的代码来获取需要的信息:
//div[@class="useful"]/ul/li/text()
同时,还可以先抓取useful标签,再对这个标签进一步执行XPath,获取里面子标签的文字。
useful = selector.xpath('//div[@class="useful"]') #这里返回一个列表

info_list = useful[0].xpath('ul/li/text()') 

(4)不同标签下的文字

<!DOCTYPE html> 
<html> 
<head lang="en">
     <meta charset="UTF-8">    
     <title></title> 
</head> 
<body>     
    <div id="test3">
         我左青龙,         
         <span id="tiger">             
             右白虎,
             <ul>上朱雀,                 
                 <li>下玄武。</li>             
             </ul>            
             老牛在当中,         
         </span> 
         龙头在胸口。     
    </div> 
</body> 
</html>


data = selector.xpath('//div[@id="test3"]')[0]
info = data.xpath('string(.)')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值