如何用Python脚本比较两个sitemap.xml的差异

煙雲
发布: 2025-12-22 08:23:02
原创
118人浏览过
用Python比较两个sitemap.xml差异需解析XML提取URL、标准化(小写/去尾斜杠/统协议)、递归处理嵌套sitemapindex,再集合比对新增/缺失URL并格式化输出。

如何用python脚本比较两个sitemap.xml的差异

用Python比较两个sitemap.xml的差异,核心是解析XML、提取URL列表,再做集合或有序比对。关键在于处理sitemap可能存在的嵌套(如sitemapindex)、重复URL、规范格式(如末尾斜杠、协议统一),以及输出可读性强的结果。

解析并标准化URL列表

sitemap.xml本质是XML,推荐用xml.etree.ElementTree标准库,无需安装)解析。注意:
• 多数sitemap用 <loc></loc> 标签包裹URL;
• 若是sitemapindex(含多个子sitemap),需递归抓取所有<loc></loc>并过滤出以.xml结尾的子链接;
• URL标准化建议:转小写、移除末尾/、统一用https://(若业务要求)。

示例代码片段:

import xml.etree.ElementTree as ET
from urllib.parse import urlparse, urlunparse
<p>def normalize_url(url):
parsed = urlparse(url)</p><h1>转小写,去掉末尾/,保留path/query/fragment</h1><pre class='brush:php;toolbar:false;'>path = parsed.path.rstrip('/')
return urlunparse((parsed.scheme, parsed.netloc.lower(), path,
                   parsed.params, parsed.query, parsed.fragment))
登录后复制

def extract_urls_from_sitemap(file_path): urls = set() try: tree = ET.parse(file_path) root = tree.getroot() namespaces = {'ns': 'https://www.php.cn/link/654f3a10edb3bb1755a43cc4f9be9dc6'}

先尝试找普通url条目

    for loc in root.findall('.//ns:loc', namespaces):
        if loc.text:
            urls.add(normalize_url(loc.text.strip()))
    # 若是sitemapindex,递归处理子sitemap(这里简化为只读本地文件,实际需HTTP请求)
except Exception as e:
    print(f"解析失败 {file_path}: {e}")
return urls
登录后复制

执行三类基础比对

拿到两个标准化URL集合后,常用比对方式有:

立即学习Python免费学习笔记(深入)”;

  • 仅在A中存在(新增):用 urls_a - urls_b
  • 仅在B中存在(删除或失效):用 urls_b - urls_a
  • 双方共有但内容不同(如参数变化):需逐条对比原始字符串或哈希值(如hashlib.md5(url.encode()).hexdigest()),但通常标准化后集合差已足够

支持远程sitemap和层级解析

真实场景中,sitemap常托管在https://example.com/sitemap.xml,且可能包含嵌套引用。此时需:

letterdrop
letterdrop

B2B内容营销自动化平台,从创意到产生潜在客户的内容的最佳实践和工具。

letterdrop 49
查看详情 letterdrop
  • requests下载XML(加timeoutheaders防被拒)
  • 识别<sitemapindex></sitemapindex>结构,对每个子<loc></loc>递归下载并解析(注意相对路径需拼接base URL)
  • lxml(可选)替代ElementTree,支持XPath更灵活,但需额外安装

输出差异结果到文件或控制台

建议按类别分块输出,带行号和简单统计:

# 示例输出结构
=== 新增URL(sitemap_A 比 sitemap_B 多出) ===
1. https://example.com/blog/new-post
2. https://example.com/products/item-77
<p>=== 缺失URL(sitemap_A 中已无,但 sitemap_B 仍有) ===</p><ol><li><a href="https://www.php.cn/link/65951d951d3b5df75fc887290a473774">https://www.php.cn/link/65951d951d3b5df75fc887290a473774</a></li><li><a href="https://www.php.cn/link/df0d020fc9a3e0bafef47e229b498ba5">https://www.php.cn/link/df0d020fc9a3e0bafef47e229b498ba5</a></li></ol><p>总计:新增 2 条,缺失 2 条,共同 142 条
登录后复制

也可导出为CSV或JSON,方便后续导入Excel或CI流程校验。

以上就是如何用Python脚本比较两个sitemap.xml的差异的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号