BeautifulSoup меняется> на> - PullRequest
       22

BeautifulSoup меняется> на>

4 голосов
/ 03 июня 2019

Мне нужно отредактировать некоторые существующие HTML-файлы, используя BeautifulSoup. Проблема возникает, когда DOCTYPE включает элемент ATTLIST.

Вот минимальный пример.

from bs4 import BeautifulSoup

doc = """
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
    <meta content="CA43667" name="dc:identifier"/>
  </head>
</html>
"""

soup = BeautifulSoup(doc, features='html.parser')
print(soup.prettify())

Выход

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>
]&gt;
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
  <meta content="CA43667" name="dc:identifier"/>
 </head>
</html>

Как видно, последнее '>' DOCTYPE превращается в сущность. С

print(soup.prettify(formatter=None))

Я получаю

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>
]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type">
  <meta content="CA43667" name="dc:identifier">
 </head>
</html>

Теперь с DOCTYPE все в порядке, но конечные косые черты в элементах «meta» исчезают, и документ не будет проверяться в нашей системе. Другие параметры форматирования также не работают.

Есть какое-нибудь решение для этого?

1 Ответ

0 голосов
/ 03 июня 2019

Вы используете последнюю версию BeautifulSoup? Я думаю, вам просто нужно обновить BeautifulSoup. Или это может быть странная установка BeautifulSoup. Попробуйте это в командной строке:

pip uninstall beautifulsoup4
pip install beautifulsoup4

Как и когда я запускаю это:

from bs4 import BeautifulSoup

doc = """
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
    <meta content="CA43667" name="dc:identifier"/>
  </head>
</html>
"""

soup = BeautifulSoup(doc, features='html.parser')
print(soup.prettify(formatter=None))

Это вывод:

<?xml version='1.0' encoding='UTF-8'?>                                                                                                                                             
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                                                                                                                     
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"                                                                                                                          
[<!ATTLIST span bodyref CDATA #IMPLIED>                                                                                                                                            
]>                                                                                                                                                                                 
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">                                                                                                                          
 <head>                                                                                                                                                                            
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>                                                                                                 
  <meta content="CA43667" name="dc:identifier"/>                                                                                                                                   
 </head>                                                                                                                                                                           
</html>      

То, что я считаю, это то, что вы ищете. Я также протестировал это в онлайн-среде IDE и, похоже, соответствует моему компьютеру. Вот ссылка: https://onlinegdb.com/HyzXahzAE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...