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

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

在抓取网页时,分析和定位html节点是获取抓取信息的关键。目前我用的是lxml模块。下面这篇文章主要介绍python爬虫指南xpath实例分析的相关信息,有需要的朋友可以参考一下。

目录

前言环境安装属性定位索引定位文本和属性摘要

前言

XPath,全称XML Path Language,是XML路径语言。它是一种在XML文档中搜索信息的语言。它最初用于搜索XML文档,但也适用于搜索HTML文档。

XPath的选择功能非常强大。它提供了一个非常简洁的路径选择表达式。此外,它还提供了100多个内置函数,用于匹配字符串、值、时间,以及处理节点和序列。几乎所有我们想要定位的节点都可以被XPath选择。

xpath解析原理:

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

2.在etree对象中调用xpath方法,结合xpath表达式实现标签定位和内容抓取。

环境的安装

pip安装lxml

Lxml是一个python解析库,支持HTML和xml解析,XPath解析,解析效率很高。

如何实例化etree对象

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

伊特里。parse(filePath)#您的文件路径

2.您可以将从Internet获得的源数据加载到该对象中。

Etree.html(' page _ text ')# page _ text互联网响应数据

Xpath表达式

表达式nodename选择此节点的所有子节点/表示它位于根节点。表示层次结构。//表示多个级别。它可以指从任何位置定位。选择当前节点…选择当前节点的父节点@选择属性*通配符,选择所有元素节点和元素名称@ *选择所有属性[@attrib]选择具有给定属性的所有元素[@ attrib=' value']选择具有给定属性的所有元素[tag]选择具有指定元素的所有直接子节点[tag=' text']选择具有指定元素和文本内容的所有元素。

对上面表达式的实例详解

这是一个HTML文档

html lang='en '

meta charset='UTF-8' /

测试标题bs4/标题

/头

身体

差异

p百里守约/p

/div

'宋'

p李清照/p

p王安石/p

p苏轼/p

p柳宗元/p

a=' 3358 www.song.com/'title='赵匡胤' target='_self '

这是span/span

宋朝是最强大的朝代,不是军队,而是经济和人民富裕/a

一朵云在天堂之光和我之间升起,把他的城市从我忧郁的心里隐藏起来/a

img src=' http://www . Baidu . com/meinv . jpg ' alt=' '/

/div

保险商实验所

lia=' 3358 www . Baidu . com ' title=' Qing '清明时节雨纷纷,路上行人奄奄一息。对不起,餐馆在哪里?牧童指杏花村/a/李。

Lia=' 3358 www.163.com' title='秦'秦时明月当空,汉时明月闭,长征人未归,龙城飞将在,呼玛不教阴山/a/李

Lia=' 3358 www.126.com' alt=' qi '这在齐王的府邸里很常见,崔以前也听过几次。又是江南美景,又是落花时节。/a/李

李,杜甫,李

李,李

/b/李

李蜜月/我/李

凤凰曾在此嬉戏,故名于此,如今已弃于此河,吴宫径草曲,金衣古尘/a/李

/ul

/div

/body

/html

像这样从浏览器打开它

为了方便和直观,我们测试编写一个本地读取的HTML文件。

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

我们先来看看子节点和后代节点。让我们从上到下寻找div节点。我们可以看到div的父节点是body,body的父节点是html。

定位这个HTML div对象,看看上面的HTML源代码,就可以知道有三个div对象。

我们通过三种不同的方法输出这个节点的信息,可以看到我们输出了三个相同的元素,也就是这三种方法的作用是相同的。

导入请求

从lxml导入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

([元素div在0x19d44765108,

0x19d447658c8处的元素div,

0x19d44765588处的元素div,

[元素div在0x19d44765108,

0x19d447658c8处的元素div,

0x19d44765588处的元素div,

[元素div在0x19d44765108,

0x19d447658c8处的元素div,

0x19d44765588处的元素div)

属性定位

如果我只想要div中的标签song,我可以定位它的属性。

当然,会返回一个元素。

R4=tree . XPath('//div[@ class=' song ']')

r4

[位于0x19d447658c8的元素分区]

索引定位

如果我只想在宋身上得到苏轼这个标签

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

tree . XPath('//div[@ class=' song ']/p ')

[元素p在0x19d4469a648,

0x19d4469a4c8处的元素p,

0x19d4469af88处的元件p,

0x19d4469a148处的元素p]

注意这里的索引不是从0开始的,而是1,对于苏轼单独返回的P标。

tree . XPath('//div[@ class=' song ']/p[3]')

0x19d4469af88处的元件p]

取文本

比如我想拿杜牧的文字内容。

如上,要定位杜牧的这一个标签,首先要找到他的上级李,也就是第五个李中的A,于是就有了下面的写法。text()是把元素转换成文本,当然在上面后面加一个text()就可以显示文本内容了。

tree . XPath('//div[@ class=' Tang ']//Li[5]/a/text()')

['杜牧']

您可以看到这返回了一个列表。如果我们想把绳子放进去,我们可以这样做。

tree . XPath('//div[@ class=' Tang ']//Li[5]/a/text()')[0]

杜牧

看一个更直接的。//li直接定位标签li,//text()直接提取该标签下的文本。不过需要注意的是,这样会把li标签下的文字全部提取出来,有时候你不想要的文字也会被提取出来,所以最好写的详细一点,比如具体的li在哪个div里。

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

【‘清明时节雨纷纷,路上行人欲死。对不起,餐馆在哪里?牧童指着杏花村,

秦时明月关汉,长征人不还,龙城飞将在,胡麻不教登阴山’,

在齐王寨常见,崔以前也听过几次,只是江南美景,正是花落时节。

杜甫,

杜牧,

杜小月,

蜜月,

‘曾在此嬉戏的凤凰,故名于此,今弃之于此荒河,吴宫径草曲,金衣古尘’]

取属性

例如,我想采用以下属性

可以直接用@来获取属性。

tree . XPath('//div[@ class=' song ']/img/@ src ')

[' http://www . Baidu . com/meinv . jpg ']

或者我要把所有的href属性都取了,就能看到唐和宋所有的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同城房源信息

#导入必要的库

导入请求

从lxml导入etree

#URL是网址。标题见图1。

URL=' https://sh . 58 . com/er shou Fang/'

headers={ ' User-Agent ':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/83 . 0 . 4103 . 7 Safari/537.36 ' }

#向网站提出请求

page_test=requests.get(url=url,headers=headers)。文本

#这里是将从互联网上获取的源数据加载到这个对象中。

tree=etree。HTML(页面测试)

#首先,看看图2中的解释。这里有很多李,研究所返回的li_list就是一个列表。

Li _ list=tree . XPath('//ul[@ class=' house-list-wrap ']/Li ')

#在这里我们打开一个58.txt文件来保存我们的信息

fp=open('58.txt ',' w ',编码='utf-8 ')

# liTraverse li_list

对于李_列表中的李:

#给你。/是对之前李的继承,相当于李/div。

title=li.xpath('。/div[2]/h2/a/text()')[0]

打印(标题' \n ')

#将文件写入文件

fp.write(标题' \n ')

fp.close()

图1:

图二。

这里,我们要提取所有的房屋信息。我们可以看到每个小节点的前一个节点都是一样的。我们希望提取h2节点A中的住房信息,如图3所示。

在这里,每个/li节点中的子节点都是相同的,所以我们可以先找到所有的li节点,然后再往下找我们想要的信息。

总结

这就是这篇关于python爬虫指南的xpath实例分析的文章。有关python crawler的xpath的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: