xpath 第一个元素_XPath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言,但它同样适用于HTML的文档搜索。
在爬虫中我们使用xpath提取特定位置的文本内容
相关链接:
XPath用法:http://www.w3school.com.cn/xpath/index.asp
目录1、XPath语法 2、准备工作
3、功能示范 4、属性获取
5、属性匹配 6、例子示范
1、XPath语法
用法及结果:
2、准备工作
xpath在python中是lxml库中的一个功能,所以首先要确保安装好lxml库,若没有安装可以参考前面的文章——爬虫开发环境部署(一)
3、例子示范
我们要从这段html中提取出XPath
from lxml import html html_text = ''' <html> <head></head> <body> <div class="name"> <span class="title">XPath</span> </div> <div class="name"> <span class="text">爬虫</span> </div> </body> </html> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div/span[1]/text()') print(result)方法二,把div的class属性加上(这种方式在实际应用中经常用到)
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[1]/text()') print(result)运行结果:
['XPath', '爬虫']调用HTML类进行初始化,这样就成功构造了一个XPath解析对象,也可以自动修正HTML文本,变成符合规则的文本。如果我们要提取文本的话需要在xpath规则后加/text()。
我们发现结果是列表['XPath', '爬虫'],里面有两个字符串,但是我们只想要XPath那我们要怎么做呢?发现XPath的span标签的class属性是title,而爬虫的class属性是text,我们只需要在把span标签的属性在明确一下就可以了
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[@class="title"]/text()') print(result)运行结果:
['爬虫']4、属性获取
属性获取可以获取html标签里的属性值,多用在获取网页链接上
例如我要获取百度一下的网站地址:
from lxml import htmlhtml_text = ''' <html> <head></head> <body> <div class="name"> <a href="https://www.baidu.com">百度一下</span> </div> </body> </html> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/a/@href') print(result)运行结果:
['https://www.baidu.com']5、属性匹配
属性匹配包含属性多值匹配和多属性匹配
- 5.1、属性多值匹配
例如我们要获取span标签的XPath:
from lxml import htmlhtml_text = ''' <div class="name"> <span class="title text">XPath</span> </div> ''' etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[@class="title"]/text()') print(result)运行结果:
[]居然是空列表为什么呢?
我们可以看到span标签的class属性中有两个属性值,这时就要用到contains()函数了,代码如下:
etree = html.etree a = etree.HTML(html_text) result = a.xpath('//div[@class="name"]/span[contains(@class, "title")]/text()') print(result)运行结果:
['XPath']
- 5.2、多属性匹配
有些标签有多个属性,这时需要同时匹配多个属性,这时要用到运算符and来连接,
例:
from运行结果:
['XPath']
6、例子示范
接下来实战一波
目标网站:https://gz.fang.lianjia.com/loupan
我们要获取这些小区的名字
在网页中点右键选择检查,我们会看到界面的右侧出现了一堆看不懂的英文(其实这些就是网页的源码),点击我标记红框内的按钮,这个按钮是查找网页元素的,点完后移到小区名上点击一下就可以看到相关的源码
我们可以很快的在源码中找到我们所需要的金茂湾这几个字,它是在一个a标签中,在往上看发现这是一个在div标签内的第一个a标签的文本,这个div标签的属性是class="resblock-name",那xpath的规则就是:'//div[@class="resblock-name"]/a/text()'
同样的原理我们查找越秀东坡,可以发现xpath规则和金茂湾的是一样的,我们就可以推断出这个网站的小区名应该都是这样的,当然要获取数据还需要配合requests库,先请求获取网页的源码
代码如下:
from lxml import html import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36' }url = 'https://gz.fang.lianjia.com/loupan' reponse = requests.get(url, headers=headers) name_regex = '//div[@class="resblock-name"]/a/text()' etree = html.etree a = etree.HTML(reponse.text) result = a.xpath(name_regex) print(result)运行结果:
['金茂湾', '越秀东坡', '景业东湖洲豪园', '振业天颂花园', '珠光山水诚品', '天健汇', '保利花海湾', '保利半岛', '时代幸汇', '绿地柏玥晶舍']
请求的时候一定要加入headers,不然会比封掉
headers也很好拿到
序号2随便选都可以,然后把序号4的内容加入headers就好了
《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的xpath 第一个元素_XPath的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 能量时域空间物理_5G新在哪儿(11)-
- 下一篇: .net 将html写成的table 转