BeautifulSoup 4 разрешает внешние объекты DTD? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть документ TEI, содержащий символы, закодированные как &stern_1;, которые отображаются в отдельном файле Zeichen.dtd (определение типа документа).Файл Zeichen.dtd содержит следующее:

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

Я использую 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 "&#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, !

Есть идеи?

1 Ответ

0 голосов
/ 04 декабря 2018

Наконец-то нашел рабочее решение моей собственной проблемы:

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, когда вам нужно пройтись по дереву.

...