Невозможно проанализировать кодированный XML ISO-8859-15 с помощью bs4 - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующий XML-документ, сохраненный с помощью Notepad ++ в кодировке ISO-8859-15:

<?xml version="1.0" encoding="ISO-8859-15"?>
<someTag>
</someTag>

Я пытаюсь разобрать этот файл с помощью bs4, но каким-то образом (даже при указании кодировки везде, о котором я могу думать) я получаю пустой результат:

filepath = 'iso-8859-15_example.xml'
with open(filepath, encoding="iso-8859-15") as f:
    soup = BeautifulSoup(f, 'xml', from_encoding="iso-8859-15")
print(soup)
# --> "<?xml version="1.0" encoding="utf-8"?>", otherwise empty

Удаление подсказок кодирования в коде Python не помогает. Но странно то, что работает, удаляя первую строку XML-файла, который является оператором <?xml ... ?> (я думаю, что он называется прологом).

Что я здесь не так делаю? Я думал, что пролог поможет bs4 «сделать правильную вещь» и выбрать правильную кодировку. Есть ли альтернатива удалению пролога / мессинга с кодировкой XML-файла?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Объединяя ответ Андрея и ответы, приведенные в дублирующем вопросе , я вижу, что указание необработанного режима в вызове open решает мою проблему:

from bs4 import BeautifulSoup
from bs4.diagnose import diagnose
with open('iso-8859-15_example.xml', 'rb') as f:
    diagnose(f)

Это приводит к выводу

Diagnostic running on Beautiful Soup 4.7.1
Python version 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)]
I noticed that html5lib is not installed. Installing it may help.
Found lxml version 4.3.4.0
Trying to parse your markup with html.parser
Here's what html.parser did with the markup:
<?xml version="1.0" encoding="ISO-8859-15"?>
<sometag>
</sometag>
--------------------------------------------------------------------------------
Trying to parse your markup with lxml
Here's what lxml did with the markup:
<?xml version="1.0" encoding="ISO-8859-15"?>
<html>
 <body>
  <sometag>
  </sometag>
 </body>
</html>
--------------------------------------------------------------------------------
Trying to parse your markup with lxml-xml
Here's what lxml-xml did with the markup:
<?xml version="1.0" encoding="utf-8"?>
<someTag>
</someTag>
--------------------------------------------------------------------------------

и показывает, что lxml в режиме xml работает хорошо.

0 голосов
/ 09 июля 2019

В этом случае я бы порекомендовал запустить функцию BeautifulSoup diagnose():

from bs4 import BeautifulSoup

from bs4.diagnose import diagnose

with open('iso-8859-15_example.xml', encoding="iso-8859-15") as f:
    diagnose(f.read())

На моей машине это печатает:

Diagnostic running on Beautiful Soup 4.7.1
Python version 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
Found lxml version 4.3.3.0
Found html5lib version 1.0.1

Trying to parse your markup with html.parser
Here's what html.parser did with the markup:
<?xml version="1.0" encoding="ISO-8859-15"?>
<sometag>
</sometag>
--------------------------------------------------------------------------------
Trying to parse your markup with html5lib
Here's what html5lib did with the markup:
<!--?xml version="1.0" encoding="ISO-8859-15"?-->
<html>
 <head>
 </head>
 <body>
  <sometag>
  </sometag>
 </body>
</html>
--------------------------------------------------------------------------------
Trying to parse your markup with lxml
Here's what lxml did with the markup:
<?xml version="1.0" encoding="ISO-8859-15"?>
<html>
 <body>
  <sometag>
  </sometag>
 </body>
</html>
--------------------------------------------------------------------------------
Trying to parse your markup with lxml-xml
Here's what lxml-xml did with the markup:
<?xml version="1.0" encoding="utf-8"?>

--------------------------------------------------------------------------------

В этом случае я бы выбрал html.parser, как это будет делать правильно.

Так что, когда вы делаете:

soup = BeautifulSoup(f.read(), 'html.parser')
print(soup)

Он печатает:

<?xml version="1.0" encoding="ISO-8859-15"?>
<sometag>
</sometag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...