脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python爬虫指南之xpath实例解析(附实战)

python爬虫指南之xpath实例解析(附实战)

2022-09-07 10:03李富贵要上岸985 Python

在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块,下面这篇文章主要给大家介绍了关于python爬虫指南之xpath实例解析的相关资料,需要的朋友可以参考下

前言

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

XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择

xpath解析原理:

1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。

2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

 

环境的安装

pip install lxml

lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高

如何实例化一个etree对象

1.将本地的html文档中的源码数据加载到etree对象中:

etree. parse(filePath)#你的文件路径

2.可以将从互联网上获取的源码数据加载到该对象中

etree.HtML("page_ text")#page_ text互联网中响应的数据

xpath 表达式

表达式 描述
nodename 选取此节点的所有子节点
/ 表示的是从根节点开始定位。表示的是一个层级。
// 表示的是多个层级。可以表示从任意位置开始定位。
. 选取当前节点
选取当前节点的父节点
@ 选取属性
* 通配符,选择所有元素节点与元素名
@* 选取所有属性
[@attrib] 选取具有给定属性的所有元素
[@attrib=‘value’] 选取给定属性具有给定值的所有元素
[tag] 选取所有具有指定元素的直接子节点
[tag=‘text’] 选取所有具有指定元素并且文本内容是text节点

对上面表达式的实例详解

这是一个HTML的文档

  1. <html lang="en"
  2. <head> 
  3.     <meta charset="UTF-8" /> 
  4.     <title>测试bs4</title> 
  5. </head> 
  6. <body> 
  7.     <div> 
  8.         <p>百里守约</p> 
  9.     </div> 
  10.     <div class="song"
  11.         <p>李清照</p> 
  12.         <p>王安石</p> 
  13.         <p>苏轼</p> 
  14.         <p>柳宗元</p> 
  15.         <a href="http://www.song.com/" title="赵匡胤" target="_self"
  16.             <span>this is span</span> 
  17.         宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a> 
  18.         <a href="" class="du">总为浮云能蔽日,长安不见使人愁</a> 
  19.         <img src="http://www.baidu.com/meinv.jpg" alt="" /> 
  20.     </div> 
  21.     <div class="tang"
  22.         <ul> 
  23.             <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li> 
  24.             <li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li> 
  25.             <li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li> 
  26.             <li><a href="http://www.sina.com" class="du">杜甫</a></li> 
  27.             <li><a href="http://www.dudu.com" class="du">杜牧</a></li> 
  28.             <li><b>杜小月</b></li> 
  29.             <li><i>度蜜月</i></li> 
  30.             <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li> 
  31.         </ul> 
  32.     </div> 
  33. </body> 
  34. </html> 

从浏览器中打开是这样的

python爬虫指南之xpath实例解析(附实战)

为了方便直观,我们对写个HTML文件进行本地读取进行测试

子节点和子孙节点的定位 / 和 //

先来看子节点和子孙节点,我们从上往下找div这个节点,可以看到div的父节点是body,body父节点是html

python爬虫指南之xpath实例解析(附实战)

定位到这个HTML的div对象中,看上面html源码,可以知道有三个div对象

python爬虫指南之xpath实例解析(附实战)

python爬虫指南之xpath实例解析(附实战)

python爬虫指南之xpath实例解析(附实战)

我们通过三种不同的方法来输出这个节点的信息,可以看到输出的是三个一样的Element,也就是这三种方法实现的功能是一样的。

import requests
from lxml import etree
tree = etree.parse("test.html")
r1=tree.xpath("/html/body/div")	#直接从上往下挨着找节点
r2=tree.xpath("/html//div")#跳跃了一个节点来找到这个div节点的对象
r3=tree.xpath("//div")##跳跃上面所有节点来寻找div节点的对象
r1,r2,r3

>>
([<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>],
  
 [<Element div at 0x19d44765108>,
  <Element div at 0x19d447658c8>,
  <Element div at 0x19d44765588>])

 

属性定位

如果我只想要div里面song这一个标签,就可以对其属性定位

python爬虫指南之xpath实例解析(附实战)

当然返回的还是一个element

r4=tree.xpath("//div[@class="song"]")
r4

>>
>[<Element div at 0x19d447658c8>]

 

索引定位

如果我只想获得song里面的苏轼的这个标签

我们找到了song,/p可以返回里面的所有标签,

tree.xpath("//div[@class="song"]/p")
>>
[<Element p at 0x19d4469a648>,
 <Element p at 0x19d4469a4c8>,
 <Element p at 0x19d4469af88>,
 <Element p at 0x19d4469a148>]

这个单独返回的苏轼的p标签,要注意的是这里的索引不是从0开始的,而是1

tree.xpath("//div[@class="song"]/p[3]")
[<Element p at 0x19d4469af88>]

 

取文本

比如我想取杜牧这个文本内容

python爬虫指南之xpath实例解析(附实战)

和上面一样,我们要定位到杜牧的这个a标签,首先要找到他的上一级 li ,这是第五个 li 里面的a所以就有了下面的写法,text()是把element转化为文本,当然上面的在后面加个text()都可以展示文本内容。

tree.xpath("//div[@class="tang"]//li[5]/a/text()")

>>
["杜牧"]

可以看到这个返回的是一个列表,如果我们想取里面的字符串,可以这样

tree.xpath("//div[@class="tang"]//li[5]/a/text()")[0]

杜牧

看一个更直接的,//li 直接定位到 li这个标签,//text()直接将这个标签下的文本提取出来。但要注意,这样会把所有的li标签下面的文本提取出来,有时候你并不想要的文本也会提取出来,所以最好还是写详细一点,如具体到哪个div里的li。

tree.xpath("//li//text()")

["清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村",
 "秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山",
 "岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君",
 "杜甫",
 "杜牧",
 "杜小月",
 "度蜜月",
 "凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘"]

 

取属性

比如我想取下面这个属性

python爬虫指南之xpath实例解析(附实战)

可以直接用@取属性

tree.xpath("//div[@class="song"]/img/@src")

["http://www.baidu.com/meinv.jpg"]

或者如果我想取所有的href这个属性,可以看到tang和song的所有href属性

tree.xpath("//@href")

["http://www.song.com/",
 "",
 "http://www.baidu.com",
 "http://www.163.com",
 "http://www.126.com",
 "http://www.sina.com",
 "http://www.dudu.com",
 "http://www.haha.com"]

爬虫实战之58同城房源信息

#导入必要的库
import requests
from lxml import etree
#URL就是网址,headers看图一
url="https://sh.58.com/ershoufang/"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.7 Safari/537.36"}
#对网站发起请求
page_test=requests.get(url=url,headers=headers).text
# 这里是将从互联网上获取的源码数据加载到该对象中
tree=etree.HTML(page_test)
#先看图二的解释,这里li有多个,所里返回的li_list是一个列表
li_list=tree.xpath("//ul[@class="house-list-wrap"]/li")
#这里我们打开一个58.txt文件来保存我们的信息
fp=open("58.txt","w",encoding="utf-8")
#li遍历li_list
for li in li_list:
	#这里 ./是对前面li的继承,相当于li/div...
    print(title+"
")
    #把文件写入文件
    fp.write(title+"
")
fp.close()

图一:

python爬虫指南之xpath实例解析(附实战)

图二:.

这里我们要提取所有的房源信息,可以看到每个小节点的上一个节点都是一样的,我们要提取的是h2节点a里的房源信息,看图三

python爬虫指南之xpath实例解析(附实战)

这里每个 /li 节点里面的子节点都是一样的,所以我们可以先找到所有的li节点,再往下找我们想要的信息

python爬虫指南之xpath实例解析(附实战)

 

总结

到此这篇关于python爬虫指南之xpath实例解析的文章就介绍到这了,更多相关python爬虫之xpath内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45755332/article/details/107193013

延伸 · 阅读

精彩推荐
  • Pythonpython中的print()输出

    python中的print()输出

    print() 方法用于打印输出,最常见的一个函数。这篇文章主要介绍了python的print()输出 ,需要的朋友可以参考下...

    Anxc10062021-06-15
  • PythonWindows安装Anaconda3的方法及使用过程详解

    Windows安装Anaconda3的方法及使用过程详解

    今天带大家学习的是关于Python的相关知识,文章围绕着在windows上Anaconda3的安装方法及使用展开,文中有非常详细的介绍,需要的朋友可以参考下...

    诗雨时7232021-11-29
  • PythonNumpy实现矩阵运算及线性代数应用

    Numpy实现矩阵运算及线性代数应用

    这篇文章主要介绍了Numpy实现矩阵运算及线性代数应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    sakura小樱11172021-09-26
  • PythonPython方差特征过滤的实例分析

    Python方差特征过滤的实例分析

    在本篇文章里小编给大家整理了一篇关于Python方差特征过滤的实例分析内容,有需要的朋友们可以跟着学习下。...

    小妮浅浅9242021-12-20
  • Python解决PyCharm同目录下导入模块会报错的问题

    解决PyCharm同目录下导入模块会报错的问题

    今天小编就为大家分享一篇解决PyCharm同目录下导入模块会报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    半壁灯9352021-04-07
  • PythonTensorflow全局设置可见GPU编号操作

    Tensorflow全局设置可见GPU编号操作

    这篇文章主要介绍了Tensorflow全局设置可见GPU编号操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    silent56_th8022020-06-30
  • PythonPython小程序爬取今日新闻拿走就能用

    Python小程序爬取今日新闻拿走就能用

    这篇文章主要教大家怎样实现一个Python小程序,爬取今日新闻,文中给出了详细的示例代码,拿走就能用,有需要的朋友可以借鉴参考下,希望能够有所帮...

    Hann Yang7862022-01-18
  • Python详解如何利用Cython为Python代码加速

    详解如何利用Cython为Python代码加速

    这篇文章主要介绍了详解如何利用Cython为Python代码加速,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    农大鲁迅10422021-01-09