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

使用requests和bs4解析XML URL无结果,找不到table报错求助

XML站点采集报错修复方案

问题根源

  1. 你用HTML解析器(lxml)解析XML文档,触发XMLParsedAsHTMLWarning警告,且解析逻辑完全错误——目标站点是XML sitemap,原文档里根本没有浏览器渲染出的<table id="sitemap">元素,所以soup.find("table", {"id": "sitemap"})返回None,后续调用find自然触发AttributeError。
  2. 代码中countElems变量未定义,即使前面逻辑正确也会报错。

修复步骤

  1. 切换XML解析器:在BeautifulSoup初始化时指定features="xml",适配XML文档结构。
  2. 适配XML sitemap结构:XML sitemap的标准结构是<urlset>包含多个<url>节点,每个<url>下的<loc>标签存储目标链接,直接遍历这些节点即可。
  3. 定义缺失变量:给countElems赋值,明确要提取的末尾元素数量。

修复后完整代码

import time
from bs4 import BeautifulSoup
import requests

if __name__ == '__main__':
    url = "https://www.bobvila.com/articles/post-sitemap12.xml/"
    page = requests.get(url)    
    time.sleep(3) 
    # 使用XML解析器处理文档
    soup = BeautifulSoup(page.content, "xml")  
    # 获取所有url节点
    url_nodes = soup.find_all("url")
    # 定义要提取的末尾元素数量,比如取最后5个
    countElems = 5
    # 提取指定数量的末尾节点
    target_nodes = url_nodes[-countElems:]
    # 遍历节点提取链接
    for node in target_nodes:
        link = node.find("loc").text
        print(link)

代码说明

  • features="xml":告诉BeautifulSoup用XML解析规则处理文档,消除警告同时正确解析XML结构。
  • soup.find_all("url"):获取XML中所有的<url>节点,每个节点对应一条站点链接数据。
  • url_nodes[-countElems:]:取列表末尾的countElems个元素,实现你原代码的切片逻辑。
  • node.find("loc").text:提取每个<url>节点下的链接地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:02:12