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

如何用Python批量爬取URL列表中维基百科页面infobox的指定数据

现有代码存在的问题
  • 缺少页面请求逻辑:遍历URL列表时没有针对每个URL发起HTTP请求获取页面内容,直接使用未定义的text变量构造BeautifulSoup对象,无法获取对应页面的DOM结构
  • 对infobox的DOM结构理解错误:infobox-label类的td标签和infobox-data类的td标签是同级兄弟节点,同属于一个tr标签的子元素,在label节点下查找data节点永远返回空
  • 判断逻辑错误:判断条件写反了,应该校验infobox-label的文本内容是否为目标字段(比如Date),而不是判断查找data节点的结果等于"date"
  • 取值方法错误:item.get()是用来获取HTML标签的属性值,infobox-data是类名不是属性,无法用该方法获取目标内容
调整后的实现方案

你可以先定位整个infobox容器,再逐行匹配目标字段提取内容,容错性更高,参考实现代码如下:

import requests
from bs4 import BeautifulSoup

list_of_urls = [] # 替换为你自己的URL列表
# 存储最终结果的列表
result = []

for url in list_of_urls:
    # 发起请求获取页面内容,加超时避免卡住
    resp = requests.get(url, timeout=10)
    resp.encoding = "utf-8"
    soup = BeautifulSoup(resp.text, features="lxml")
    
    # 先定位整个infobox盒子,避免全局找label误匹配
    infobox = soup.find("table", class_="infobox")
    if not infobox:
        # 没有infobox的页面可跳过或者做特殊处理
        continue
    
    page_data = {}
    # 遍历infobox里的每一行
    for tr in infobox.find_all("tr"):
        label_td = tr.find("td", class_="infobox-label")
        data_td = tr.find("td", class_="infobox-data")
        # 同时存在label和data的行才处理
        if not label_td or not data_td:
            continue
        # 提取label文本,去除多余空白
        label_text = label_td.get_text(strip=True)
        # 匹配目标字段,可根据需要新增其他字段
        if label_text == "Date":
            page_data["date"] = data_td.get_text(strip=True)
        elif label_text == "Coordinates":
            # 坐标可以单独处理提取经纬度,也可以直接存文本
            page_data["coordinates"] = data_td.get_text(strip=True)
        # 其他需要提取的字段可以继续加elif
    
    result.append(page_data)
    print(page_data)

如果需要提取更多字段,只需要在判断分支里新增对应label的匹配规则即可;如果需要结构化的经纬度数据,可以进一步解析infobox-data下的geo标签内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:05