如何用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
相关产品推荐
相关产品推荐

