You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页爬虫如何实现迭代?以宝马3系世代页面为例遍历元素

网页爬虫迭代与宝马3系世代信息爬取方案

一、网页爬虫中迭代遍历匹配元素的通用方法

要遍历所有匹配元素并打印输出,核心是先获取目标元素的节点列表,再通过循环逐个处理:

  1. 解析网页得到DOM结构(以lxml为例)
  2. 使用XPath/CSS选择器定位所有匹配的节点
  3. 遍历节点列表,提取所需内容并输出

示例代码:

import requests
from lxml import html

# 请求并解析网页
page = requests.get("目标网页URL")
tree = html.fromstring(page.content)

# 用XPath获取所有匹配的元素节点(比如所有<p>标签的文本)
target_elements = tree.xpath("//p/text()")

# 迭代遍历并打印
for index, content in enumerate(target_elements, start=1):
    cleaned_content = content.strip()
    if cleaned_content:  # 过滤空文本
        print(f"第{index}个元素:{cleaned_content}")

二、宝马3系世代信息的遍历爬取优化

你的初始代码存在两个关键问题:绝对XPath路径易因页面结构变动失效、重复赋值变量无意义。以下是优化后的实现方案:

优化后代码

import requests
from lxml import html

# 请求目标页面
page = requests.get('https://www.bmw.com/en/automotive-life/bmw-3-series-generations.html')
tree = html.fromstring(page.content)

# 定位所有世代的容器节点(使用相对路径+特征class,避免绝对路径的脆弱性)
generation_items = tree.xpath("//div[contains(@class, 'generations-list__item')]")

# 迭代每个世代容器,提取信息
for idx, item in enumerate(generation_items, start=1):
    # 提取世代名称
    gen_name = item.xpath(".//h3/text()")[0].strip() if item.xpath(".//h3/text()") else "未获取到名称"
    # 提取生产年份区间
    gen_years = item.xpath(".//div[contains(@class, 'generations-list__item-year')]/text()")[0].strip() if item.xpath(".//div[contains(@class, 'generations-list__item-year')]/text()") else "未获取到年份"
    # 提取世代描述
    gen_desc = item.xpath(".//p/text()")[0].strip() if item.xpath(".//p/text()") else "无描述信息"
    
    # 格式化输出
    print(f"=== 第{idx}世代 ===")
    print(f"名称:{gen_name}")
    print(f"生产年份:{gen_years}")
    print(f"描述:{gen_desc}\n")

关键优化点

  • 使用contains(@class, 'xxx')匹配特征class,避免依赖固定的DOM层级
  • 对每个世代容器使用相对路径(.//)提取子元素,确保只获取当前容器内的内容
  • 添加空值判断,避免因页面节点缺失导致索引错误
  • 迭代遍历每个世代节点,逐一提取并输出信息

内容的提问来源于stack exchange,提问作者kush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:10:28