BeautifulSoup 4 是否解析外部 DTD 实体?
Does BeautifulSoup 4 resolve external DTD entities?
我有一个 TEI 文档,其中包含编码为 &stern_1;
的字符,这些字符映射到单独的 Zeichen.dtd
(文档类型定义)文件中。文件 Zeichen.dtd
包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY stern_1 "✳" >
我正在使用 BeautifulSoup4
和 lxml-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 "✳">
]>
"""
xml_str = "<p>Hello, &stern_1;!</p>"
from bs4 import BeautifulSoup
soup = BeautifulSoup(xml_str, 'lxml-xml')
print(soup.find('p').get_text())
输出:
Hello, !
有什么想法吗?
终于找到了解决我自己问题的有效方法:
dtd_str = """
<!DOCTYPE html [
<!ENTITY stern_1 "✳">
]>
"""
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。
我有一个 TEI 文档,其中包含编码为 &stern_1;
的字符,这些字符映射到单独的 Zeichen.dtd
(文档类型定义)文件中。文件 Zeichen.dtd
包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY stern_1 "✳" >
我正在使用 BeautifulSoup4
和 lxml-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 "✳">
]>
"""
xml_str = "<p>Hello, &stern_1;!</p>"
from bs4 import BeautifulSoup
soup = BeautifulSoup(xml_str, 'lxml-xml')
print(soup.find('p').get_text())
输出:
Hello, !
有什么想法吗?
终于找到了解决我自己问题的有效方法:
dtd_str = """
<!DOCTYPE html [
<!ENTITY stern_1 "✳">
]>
"""
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。