在抓取网页时,分析和定位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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。