Python提取XML中URL的核心是用xml.etree.ElementTree或lxml解析并定位文本内容或href/src/url等属性中的HTTP/HTTPS链接,需去重、清洗、校验合法性并支持相对路径补全。

Python提取XML中的所有URL链接,核心是解析XML结构并定位包含URL的元素或属性。常用方法是用xml.etree.ElementTree(内置、轻量)或lxml(功能强、支持XPath和HTML容错)。URL通常出现在元素文本内容中(如),或作为属性值(如),需根据实际XML格式灵活处理。
使用ElementTree提取文本中的URL
适用于URL直接写在标签内的场景(如、、等)。ElementTree可递归遍历所有元素,检查其文本内容是否符合URL格式。
- 用
ET.iterparse()或ET.fromstring()加载XML - 遍历所有元素,检查
elem.text是否非空且以http://或https://开头 - 可配合
re.match(r'^https?://', text.strip())做简单校验
使用XPath从属性中提取URL(推荐lxml)
当URL藏在属性里(如href、src、url),XPath表达式更精准高效。lxml支持完整XPath语法,比ElementTree更灵活。
- 安装:
pip install lxml - 常用XPath:
//*[@href] | //*[@src] | //*[@url]匹配含这些属性的任意元素 - 再用
elem.get('href')等获取属性值,并过滤掉空值或非URL字符串
兼顾文本+属性,避免重复和无效链接
真实XML可能混合多种URL位置,还可能存在注释、CDATA、相对路径或空值。提取时建议统一去重、清洗和验证。
立即学习“Python免费学习笔记(深入)”;
- 用
set()自动去重 - 对每个候选字符串调用
str.strip(),跳过空值和纯空白 - 用
urllib.parse.urlparse()判断是否为合法URL(scheme存在且为http/https) - 若需处理相对URL,可用
urllib.parse.urljoin(base_url, rel_url)补全
一个简洁可用的示例代码
以下用lxml实现“文本+常见属性”双路提取,带基础校验:
from lxml import etree from urllib.parse import urlparsedef extract_urls_from_xml(xml_source): tree = etree.parse(xml_source) if hasattr(xml_source, 'read') else etree.fromstring(xml_source) urls = set()
# 提取属性中的URL for attr in ['href', 'src', 'url', 'xlink:href']: for elem in tree.xpath(f'//*[@{attr}]'): val = elem.get(attr, '').strip() if val and urlparse(val).scheme in ('http', 'https'): urls.add(val) # 提取文本中的URL(仅检查直系文本,避免混入子元素内容) for elem in tree.iter(): if elem.text and elem.text.strip(): text = elem.text.strip() if text.startswith(('http://', 'https://')): if urlparse(text).scheme in ('http', 'https'): urls.add(text) return list(urls)使用示例
xml_data = '''
https://example.com/page1"/> ''' print(extract_urls_from_xml(xml_data))https://www.php.cn/link/99efe6e00320edb6fac7ab90e845bb3e; https://cdn.example.com/logo.png"/>










