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

lxml无法解析有效URI求助:XSLT引入外部样式表失败

问题:lxml无法解析XSLT中引用的LOC URI(浏览器可访问)

我尝试运行包含以下代码的XSLT:

<xsl:include href="http://www.loc.gov/marcxml/xslt/MARC21slimUtils.xsl"/>

但抛出错误:

lxml.etree.XSLTParseError: Cannot resolve URI https://www.loc.gov/marcxml/xslt/MARC21slimUtils.xsl

这个URI在浏览器里能正常访问,但lxml为啥解析不了?


可能的原因

  • 自动重定向未被处理:你写的href是http协议,但错误里显示的是https,说明服务器会把HTTP请求重定向到HTTPS。浏览器会自动跟进重定向,但lxml的默认XML解析器不会自动处理这种跳转,导致无法获取目标资源。
  • 请求头被拦截:部分服务器会校验请求的User-Agent字段,lxml默认的请求头不属于浏览器标识,可能被服务器拒绝访问或无法触发正确跳转。
  • lxml外部资源加载限制:lxml对XSLT中的外部URI加载有默认限制,不会主动处理复杂的HTTP逻辑(比如重定向、自定义请求头)。

解决办法

  1. 本地文件替代(最可靠)
    直接把MARC21slimUtils.xsl下载到本地项目目录,修改XSLT中的引用路径为本地文件:
<xsl:include href="./MARC21slimUtils.xsl"/>

彻底规避网络依赖,也不会有重定向或请求头的问题。

  1. 自定义URI解析器处理HTTP请求
    如果必须从网络加载,可以给lxml自定义一个URI解析器,用requests库处理重定向和请求头:
import lxml.etree as ET
import requests

def resolve_uri(uri, context):
    # 模拟浏览器请求头,处理重定向
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}
    response = requests.get(uri, headers=headers)
    response.raise_for_status()
    # 返回解析后的XML文档
    return ET.fromstring(response.content)

# 注册自定义解析器
parser = ET.XMLParser()
parser.resolvers.add(resolve_uri)

# 加载并运行XSLT
xslt_doc = ET.parse("你的XSLT文件路径.xsl", parser=parser)
xslt = ET.XSLT(xslt_doc)

这个方法会模拟浏览器请求,自动处理重定向,同时带上合法的User-Agent,避免被服务器拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:18:19