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

如何用Python从XML站点地图提取URL并去除多余后缀?

解决Sitemap XML中URL提取的正则问题

首先,你的问题出在正则表达式里的\S+——它会匹配所有非空白字符,所以如果URL后面跟着XML标签的闭合部分(比如</loc>)或者其他非空白的多余内容(比如你遇到的 /liv),都会被一起包含进去,导致提取结果带后缀。

修正后的正则表达式方案

要精准提取合法URL,我们应该限定匹配的字符范围(URL的合法字符包括字母、数字以及特定符号),而不是用宽泛的\S+。比如:

import re

# 读取sitemap文件内容
with open('sitemap.xml', 'r') as f:
    content = f.read()

# 匹配合法URL,自动停止在URL末尾
urls = re.findall(r'https?://[\w\-._~:/?#\[\]@!$&\'()*+,;=]+', content)
for url in urls:
    print(url)

如果你的sitemap严格遵循标准(URL都放在<loc>标签里),可以进一步缩小匹配范围,只提取<loc>标签内的内容,这样更准确:

urls = re.findall(r'<loc>(https?://[\w\-._~:/?#\[\]@!$&\'()*+,;=]+)</loc>', content, re.IGNORECASE)

re.IGNORECASE是为了兼容大小写的标签(比如<LOC>),不过标准sitemap都是小写的。

更推荐的XML解析方案

其实正则处理XML容易踩坑(比如XML换行、特殊字符、命名空间等),用Python内置的XML解析库会更可靠。比如用xml.etree.ElementTree:

import xml.etree.ElementTree as ET

# 解析sitemap文件
tree = ET.parse('sitemap.xml')
root = tree.getroot()

# Sitemap默认的命名空间,必须指定才能正确查找标签
namespace = {'sm': 'http://www.sitemaps.org/schemas/sitemap/0.9'}

# 遍历所有<loc>标签并提取URL
for loc_element in root.findall('.//sm:loc', namespace):
    url = loc_element.text.strip()
    print(url)

这个方法能完美处理XML的结构,不用担心格式变化导致的提取错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:07