【问题标题】:Failing to parse 1 MB XML File with BS4无法使用 BS4 解析 1 MB XML 文件
【发布时间】:2017-12-09 16:40:51
【问题描述】:

我有两张世界的 SVG 地图,下载 here。我的目标是在 python 中对这些地图进行一些编辑,通过 BeautifulSoup4 使用它们。这与低分辨率文件 (132.5 Kb) 完美配合。但是,当我尝试将 BS4 解析器(使用 lxml)与高分辨率文件 (1.2 Mb) 一起使用时,它会完全失败。

代码是这样的:

    import lxml
    from bs4 import BeautifulSoup as Soup
    with open('worldHigh.svg','r') as f:
        handler = f.read()
        soup = Soup(handler,'xml')
        print(soup.prettify())

当我使用 worldHigh.svg 文件运行它时,唯一打印的内容是

<?xml version="1.0" encoding="utf-8"?>

当我运行等效但将 worldHigh.svg 更改为 worldLow.svg 时,它会正确打印 XML(根据需要)。

两个 SVG 文件在自行打开时都可以正常工作(即,它们显示地图)。但是,当我尝试解析它时,一个失败,另一个成功。我不知道出了什么问题。如果解析器在大尺寸下失败,我会理解,但 1.2 MB 似乎并不大。

【问题讨论】:

  • 试试with open('worldHigh.svg','rb') as f:。如果可行,我稍后会添加解释原因。

标签: python python-3.x svg xml-parsing beautifulsoup


【解决方案1】:

XML 解析器需要未编码字节的原始序列。解析 XML 时使用open(...,'rb')

一个有效而另一个无效的原因是worldHigh.svg在文件开头有一个BOM。

【讨论】:

  • 哦,你这个光荣而了不起的人。它现在确实加载了,并且 prettify() 可以正确打印。但是,SVG 文件不能完全正常工作,现在只要有特殊字符(例如第 61 行,title="Côte d'Ivoire" 或第 70 行,title="Curaçao"),它就会失败。如果我删除了我可以做的特殊字符,它就会起作用——但奇怪的是,它们出现在工作正常的低分辨率地图中。很高兴在这里休息,我非常感谢,但如果你知道有一个快速解决方案,我也会喜欢它。
  • 在我下载的worldHigh.svg 中,我得到了不同的行号。我怀疑你编辑了你的副本。重新下载再试一次。
  • 重新下载,并制作了一个简单的脚本,读取(如上),然后打印到一个新文件。 with open('pyParsedWorldHigh.svg','w+') as f: f.write(soup.prettify()) (包括必要的换行符)。确实行号相差一个,但仍然会导致错误。
  • 这是一个单独的错误,值得提出自己的问题,但解决方案可能是:with open('pyParsedWorldHigh.svg','w', encoding="utf8") as f: f.write(soup.prettify())@RobertRedelmeier
  • 我会检查一下,但绝对不是重要的。再次感谢您的所有帮助,真的很慷慨,深表感谢。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2010-09-25
  • 2021-10-06
  • 2019-08-06
  • 2011-12-24
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
相关资源
最近更新 更多