【问题标题】:Python: Parsing SGMLPython:解析 SGML
【发布时间】:2015-07-29 07:59:14
【问题描述】:

我正在尝试在 Python 中解析一些 SGML,如下所示:

<!DOCTYPE lewis SYSTEM "lewis.dtd">
<TEXT>
    <TITLE>One</TITLE>
    <BODY>Sample One</BODY>
</TEXT>
<TEXT>
    <TITLE>Two</TITLE>
    <BODY>Sample Two</BODY>
</TEXT>

在这里,我只是在寻找&lt;BODY&gt; 标签(即["Sample One", "Sample Two"])内的所有内容。

我尝试过使用 BeautifulSoup,但它不喜欢第一行中的 &lt;!DOCTYPE&gt;,并且还希望将所有内容都包裹在像 &lt;everything&gt;&lt;/everything&gt; 这样的根标签上。虽然我可以在将这些更改传递给 BeautifulSoup 之前手动进行这些更改,但感觉有点太老套了。

我对 SGML 还很陌生,也没有和 BeautifulSoup 结婚,所以我愿意接受任何建议。

(对于那些好奇的人:我的具体用例是 reuters21578 数据集。)

【问题讨论】:

  • 你用什么解析器来处理漂亮的汤?
  • 我正在使用“lxml-xml”,正如其中一个文档中所推荐的那样。
  • 您可以将您的 SGML 转换为 XML 并从中工作,如以下答案所述:stackoverflow.com/a/12534420/407651

标签: python parsing xml-parsing beautifulsoup sgml


【解决方案1】:

您可以尝试使用'html.parser' 代替lxml-xml 作为解析器。 lxml-xml 期望文本是正确的 xml ,但事实并非如此。

示例/演示 -

>>> from bs4 import BeautifulSoup
>>> s = """<!DOCTYPE lewis SYSTEM "lewis.dtd">
... <TEXT>
...     <TITLE>One</TITLE>
...     <BODY>Sample One</BODY>
... </TEXT>
... <TEXT>
...     <TITLE>Two</TITLE>
...     <BODY>Sample Two</BODY>
... </TEXT>"""
>>> soup = BeautifulSoup(s,'html.parser')
>>> soup.find_all('body')
[<body>Sample One</body>, <body>Sample Two</body>]

【讨论】:

  • 谢谢!是使这个有效的 XML 去掉第一行并将所有内容包装在一个虚拟根元素中的唯一方法吗?我对使用 lxml 感兴趣主要是出于性能原因(另外,是否没有标准的 SGML 解析器)?
  • 我不认为 BeautifulSoup 内置了 sgml 解析器,'lxml' 也可能对你有用,即lxml html 解析器(不是 xml 版本)。更多关于支持的解析器 - crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser
  • @jonshao 另外,如果问题为您解决了。并且您对答案感到满意,请记住接受答案(通过单击答案左侧的勾号),这对其他人也有帮助。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2011-06-19
  • 2021-03-06
相关资源
最近更新 更多