【问题标题】:Removing invalid characters from XML stream从 XML 流中删除无效字符
【发布时间】:2018-10-18 09:15:03
【问题描述】:

我正在用 Python 中的 SAX 解析 XML 文件。 XML 是通过 urllib.request 从 HTTP 流中读取的。

XML 流似乎包含无效字符。具体来说,当从 UTF-8 解码并将其转储到文件时,看起来我得到了一堆 '8000' 的实例,前后都是换行符。 这会导致 SAX 解析失败。

我的问题有两个:

  1. 如何删除或忽略 urllib.request 数据流中出现的无效字符?
  2. “8000”可能是什么,是否有针对该问题的更具体的解决方法?

[编辑]

我无法共享源数据,但这是字符串和十六进制的前几个字符。第一个字符是有问题的“8000”字符。

字符串:

8000<?xml

十六进制:

38:30:30:30:3c:3f:78:6d:6c:20

“8000”字符串可以搜索替换,但这不是一个好的解决方案,因为数据可能包含相当常见的字符串。

【问题讨论】:

  • 你确定它是 UTF-8 的吗?您能否提供原始数据的链接或提供 hexdump?
  • 好吧,我想不是 1000% 肯定。我将使用 hexdump 更新问题。
  • 那个8000可以是xml字符串长度吗?
  • 我在下面添加了自己的答案。似乎 8000 是出于某种原因通过 HTTPResponse 对象写入的端口号。

标签: xml python-3.x sax


【解决方案1】:

&lt;?xmlXML declaration 的开头。

在一个 XML 文档中最多只能有一个 XML 声明,并且它可能只作为文件中的第一个出现。对于“8000”,它会呈现 XML 文档而不是 well-formed。在尝试将此流解析为 XML 之前,您必须确保存在的 XML 声明不超过一个,并且之前没有任何声明。这必须在字符/字符串/文本级别完成,而不是在 XML 级别。

另见 Error: The processing instruction target matching "[xX][mM][lL]" is not allowed

【讨论】:

    【解决方案2】:

    似乎代码向 XML 解析器提供了来自 urllib.request.urlopen 发送的 HTTPResponse(即 HTTPResponse.fp)的文件解析器对象,而不仅仅是 HTTPResponse。出于某种原因,这导致将端口 (8000) 写入 BufferedReader 的每个缓冲块中。 这似乎是从 Python 2 迁移到 3 引起的问题(也许 HTTPResponse 对象在 Python 2 中的行为不同)。

    通过直接向 XML 解析器提供 HTTPResponse 而不是 response.fp,端口已从字节流中删除,并且不存在进一步的编码问题。

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 1970-01-01
      • 2017-04-08
      • 2011-05-13
      • 1970-01-01
      • 2022-11-14
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多