3

我正在尝试在 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>

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

我尝试过使用 BeautifulSoup,但它不喜欢<!DOCTYPE>第一行中的 ,并且还希望所有内容都被包裹在一个根标签上,比如<everything></everything>. 虽然我可以在将其传递给 BeautifulSoup 之前手动进行这些更改,但感觉有点太 hacky。

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

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

4

1 回答 1

5

您可以尝试使用'html.parser'as 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>]
于 2015-07-29T08:06:23.117 回答