Python使用xpath对解析内容进行数据提取

在前面的文章当中,已经教大家如何去获取我们需要的数据原文内容,今天就介绍一个用于提取所需数据的方法之一xpath。在后续会讲解bs4(beautifulsoup),re正则表达式。

正文

XPath 使用路径表达式来选取HTML/ XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

使用到python中的一个lxml库:下载 pip install lxml

选取节点
表达式描述
nodename选取此节点的所有子节点。
/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

路径表达式
路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

谓语

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。

选取未知节点
通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

--- 在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。

选取若干节点

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

路径表达式结果
//book/title//book/price选取 book 元素的所有 title 和 price 元素。
//title//price选取文档中的所有 title 和 price 元素。
/bookstore/book/title//price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

示例

下面给出一个示例代码

# -*- coding:utf-8 -*-
import requests
from lxml import etree

class DouGuo(object):
    def __init__(self):
        self.url = "https://www.douguo.com/caipu/%E5%AE%B6%E5%B8%B8%E8%8F%9C/0/20"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
        }

    def get_data_index(self):
        response = requests.get(self.url, headers=self.headers)
        response.encoding="utf-8"
        if response.status_code == 200:
            return response.text
        else:
            return None

    def parse_data_index(self, response):
        html = etree.HTML(response)
        data_list = html.xpath('//ul[@class="cook-list"]//li[@class="clearfix"]')
        for data in data_list:
            # 提取文本值
            title = data.xpath("./div/a/text()")[0]
            major = data.xpath("./div/p/text()")[0]
            # 提取属性值
            head = data.xpath("./div/div[2]/a/img/@alt")[0]
            score = data.xpath("./div/div[1]//span/text()")[0]
            print(f"title: {title}\nmajor: {major}\nhead:{head}\nscore:{score}\n\n")

    def run(self):
        response = self.get_data_index()
        # print(response)
        self.parse_data_index(response)

if __name__ == '__main__':
    spider = DouGuo()
    spider.run()

结语

大家可以尝试去抓取这个url: https://cs.lianjia.com/ershoufang/

获取第一页数据即可,同时也可以思考一下,如何进行多页的获取,实现翻页功能。

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 XPath 爬取下厨房菜谱数据也是一种常见的方法。步骤如下: 1. 使用 requests 库向下厨房的菜谱搜索页面发送请求,获取 HTML 页面内容。 2. 使用 lxml 库解析 HTML 页面,创建 XPath 对象。 3. 使用 XPath 对象提取菜谱列表,以及每道菜谱的详细页面链接。 4. 遍历菜谱列表,使用提取到的详细页面链接,向每道菜谱的详细页面发送请求,获取 HTML 页面内容。 5. 使用 XPath 对象提取菜谱的详细信息,例如食材、做法等。 下面是一个简单的 Python 爬取下厨房菜谱的示例代码: ```python import requests from lxml import etree # 发送请求,获取搜索页面的 HTML 内容 url = 'https://www.xiachufang.com/search/?keyword=红烧肉' response = requests.get(url) html = response.text # 解析 HTML 页面,创建 XPath 对象 selector = etree.HTML(html) # 提取菜谱列表,以及每道菜谱的详细页面链接 recipe_list = selector.xpath('//div[@class="recipe"]') for recipe in recipe_list: recipe_link = recipe.xpath('./a/@href')[0] # 发送请求,获取详细页面的 HTML 内容 recipe_response = requests.get(recipe_link) recipe_html = recipe_response.text # 解析 HTML 页面,创建 XPath 对象 recipe_selector = etree.HTML(recipe_html) # 提取菜谱的详细信息 recipe_name = recipe_selector.xpath('//h1[@class="page-title"]/text()')[0] recipe_ingredients = recipe_selector.xpath('//div[@class="ings"]/text()')[0] recipe_steps = recipe_selector.xpath('//div[@class="steps"]/ol/li/p/text()') # 打印菜谱的详细信息 print(recipe_name) print(recipe_ingredients) print(recipe_steps) ``` 注意,XPath 的语法需要熟悉,可以通过 Chrome 浏览器的开发者工具,选中网页中的元素,然后右键选择 Copy -> Copy XPath,获取该元素的 XPath 表达式。同时,爬取网站内容时需要遵守网站的爬虫协议,不要过度频繁地发送请求,以免对网站造成影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值