BeautifulSoup возвращает разнесенный текст после разбора - PullRequest
0 голосов
/ 28 февраля 2019

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

enter image description here

Простой код, который я использовал:

path = 'alerts/myfile.htm'
file = open(os.path.abspath(path))
parser = BeautifulSoup(file,'html.parser')
file.close()

Эта вещь сводит меня с ума.У тебя когда-нибудь была такая же проблема?Спасибо

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Похоже, что оригинальный файл находится в UTF-16.

По какой-либо причине BeautifulSoup(..., from_encoding='utf-16le') не понимает эту ситуацию, но вы можете обойти эту проблему, прочитав и расшифровав файл вручную перед передачей его в BS.

Ниже приведена расшифровка.где я создаю HTML-файл UTF-16LE, выгружаю его содержимое, пытаюсь передать его непосредственно в BS4 и, наконец, использую обходной путь, описанный выше.

$ echo '<html><div>hello</div></html>' | iconv -f utf-8 -t utf-16le > y.html
$ file y.html
$ xxd y.html
00000000: 3c00 6800 7400 6d00 6c00 3e00 3c00 6400  <.h.t.m.l.>.<.d.
00000010: 6900 7600 3e00 6800 6500 6c00 6c00 6f00  i.v.>.h.e.l.l.o.
00000020: 3c00 2f00 6400 6900 7600 3e00 3c00 2f00  <./.d.i.v.>.<./.
00000030: 6800 7400 6d00 6c00 3e00 0a00            h.t.m.l.>...
$ python
>>> import bs4
>>> s = bs4.BeautifulSoup(open('y.html'))
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> s = bs4.BeautifulSoup(open('y.html'), from_encoding='utf-16le')
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> s = bs4.BeautifulSoup(open('y.html'), 'html.parser', from_encoding='utf-16le')
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> d = open('y.html', 'rb').read().decode('utf-16le')
>>> d
'<html><div>hello</div></html>\n'
>>> s = bs4.BeautifulSoup(d)
>>> s
<html><div>hello</div></html>
>>>
0 голосов
/ 28 февраля 2019

Я думаю, что решил это: мой файл был в кодировке UCL-2.То, что я сделал, было:

 path = 'alerts/myfile.htm'
file = open(os.path.abspath(path),'rb')
parser = BeautifulSoup(file.read().decode('utf-8'),'html.parser')
file.close()
parser.find('table', attrs = {'class':'MsoNormalTable'})

Вот теперь вывод:

enter image description here

0 голосов
/ 28 февраля 2019

Мне кажется, что проблема связана с кодировкой исходного файла.

При загрузке документа BeautifulSoup преобразует его в UTF-8, используя подбиблиотеку под названием Unicode Dammit .

Возможно, ваш файл был сохранен в другой кодировке и произошла какая-то ошибка при преобразовании.

Поскольку у меня нет вашего HTML-кода, я могу предложить вам изучитьявляется ли ваш файл ASCII или Unicode или любой другой кодировкой, а затем проанализируйте файл с помощью:

encoding = <your encoding here> (example "iso-8859-8")
parser = BeautifulSoup(file,'html.parser', from_encoding=encoding)

Другие параметры кодирования можно найти здесь

С уважением

ОБНОВЛЕНИЕ

Попробуйте также:

parser = BeautifulSoup(file,'html.parser', from_encoding='utf-8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...