【问题标题】:Does BeautifulSoup 4 resolve external DTD entities?BeautifulSoup 4 是否解析外部 DTD 实体?
【发布时间】:2018-11-27 11:46:30
【问题描述】:

我有一个 TEI 文档,其中包含编码为 &stern_1; 的字符,这些字符映射到单独的 Zeichen.dtd(文档类型定义)文件中。文件Zeichen.dtd 包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY stern_1 "&#10035;" >

我使用BeautifulSoup4lxml-xml 作为解析器。

例子:

dtd_str = '<!DOCTYPE Zeichen SYSTEM "Zeichen.dtd">'
xml_str = "<p>Hello, &stern_1;!</p>"
from bs4 import BeautifulSoup
soup = BeautifulSoup(dtd_str+xml_str, 'lxml-xml')
print(soup.find('p').get_text())

上面的代码打印了这个:

 Hello, !

而不是这个:

 Hello, ✳!

我也尝试了内联 DTD,结果相同:

dtd_str = """
<!DOCTYPE html [
    <!ENTITY stern_1 "&#10035;">
]>
"""
xml_str = "<p>Hello, &stern_1;!</p>"

from bs4 import BeautifulSoup
soup = BeautifulSoup(xml_str, 'lxml-xml')
print(soup.find('p').get_text())

输出:

Hello, !

有什么想法吗?

【问题讨论】:

  • 您似乎从未将 doctype 和 p-tag 字符串放在一起。你总是只查找 xml 字符串,所以我想自定义字符永远不会加载。
  • 是的,它应该是BeautifulSoup(dtd_str+xml_str, 'lxml-xml'),但这并没有改变任何东西——问题仍然存在
  • 谢谢,我更正了。

标签: python-3.x beautifulsoup lxml dtd tei


【解决方案1】:

终于找到了解决我自己问题的方法:

dtd_str = """
<!DOCTYPE html [
    <!ENTITY stern_1 "&#10035;">
]>
"""
xml_str = "<p>Hello, &stern_1;!</p>"
from lxml import etree
tree = etree.fromstring(dtd_str + xml_str)

from bs4 import BeautifulSoup
soup = BeautifulSoup(etree.tostring(tree, encoding='unicode'), "lxml-xml")
print(soup.find('p').get_text())

将打印这个:

Hello, ✳!

这正是我想要的。 lxml 库可以正确处理 dtd 文件,而 BeautifulSoup 在您需要遍历树时具有更好、更直观的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2015-10-13
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多