使用requests和bs4解析XML URL无结果,找不到table报错求助
XML站点采集报错修复方案
问题根源
- 你用HTML解析器(
lxml)解析XML文档,触发XMLParsedAsHTMLWarning警告,且解析逻辑完全错误——目标站点是XML sitemap,原文档里根本没有浏览器渲染出的<table id="sitemap">元素,所以soup.find("table", {"id": "sitemap"})返回None,后续调用find自然触发AttributeError。 - 代码中
countElems变量未定义,即使前面逻辑正确也会报错。
修复步骤
- 切换XML解析器:在
BeautifulSoup初始化时指定features="xml",适配XML文档结构。 - 适配XML sitemap结构:XML sitemap的标准结构是
<urlset>包含多个<url>节点,每个<url>下的<loc>标签存储目标链接,直接遍历这些节点即可。 - 定义缺失变量:给
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
相关产品推荐
相关产品推荐

