Python, Beautiful Soup: ® - как конвертировать в правильную форму - PullRequest
3 голосов
/ 06 января 2012

Я очищаю веб-страницу, содержащую HTML, который выглядит следующим образом в браузере

<td>LGG&reg; MAX multispecies probiotic consisting of four bacterial trains</td>
<td>LGG® MAX helps to reduce gastro-intestinal discomfort</td>

Принимая только LGG®, в первом случае он равен LGG&reg; Во втором случае записывается ®как ® в исходном коде.

Я использую Python 2.7, mechanize и BeautifulSoup.

Моя сложность заключается в том, что &reg; поднимается с помощью механизации, переносится и в конечном счетераспечатан или записан в файл.

Есть много других специальных символов.Некоторые из них «конвертируются» на выходе, а ® преобразуются в путаницу.

Веб-страница объявляется как UTF-8, и единственная ссылка, которую я делаю на кодирование, - это когда я открываю свой файл out.Я объявил UTF-8.Если я не пишу в файл бомбы о других персонажах.

Я работаю в Windows 7. Другие детали:

>>> sys.getdefaultencoding()
'ascii'
>>> sys.stdout.encoding
'cp850'
>>> locale.getdefaultlocale()
('en_GB', 'cp1252')
>>>

Может кто-нибудь дать мне какие-нибудь советы о том, как лучше всегообрабатывать специальные символы?Или они должны называться сущностями HTML?Должно быть, это довольно распространенная проблема, но я не смог найти каких-либо простых объяснений в Интернете.

ОБНОВЛЕНИЕ: я добился здесь некоторого прогресса.Основной алгоритм:

  1. Читать веб-страницу в механизме
  2. Использовать красивый суп, чтобы делать то, что ... когда я это записываю, я понятия не имею, для чего предназначен этот этап предварительной обработки,точно.
  3. Используйте красивый суп для извлечения информации из таблицы, которая упорядочена иначе, чем для обработки специальных символов.
  4. Запишите информацию в файл, разделенный |для учета пунктуации в длинных записях ячеек и для возможности импорта в Excel и т. д.

Прогресс находится на этапе 3. Я использовал некоторые регулярные выражения и htmlentityrefs для изменения записи ячейки кода по записи в ячейке.,См. это сообщение в блоге .

Оставшаяся трудность: код, записанный в файл (и выведенный на экран), все еще неверен, но, похоже, проблема заключается в правильном указании кодировки.Проблема кажется меньше, по крайней мере.

1 Ответ

2 голосов
/ 14 января 2012

Для ответа на вопрос из заголовка:

# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup

html = u"""
<td>LGG&reg; MAX multispecies probiotic consisting of four bacterial trains</td>
<td>LGG® MAX helps to reduce gastro-intestinal discomfort</td>
"""

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)
print(''.join(soup('td', text=True)))

Вывод

LGG® MAX multispecies probiotic consisting of four bacterial trains
LGG® MAX helps to reduce gastro-intestinal discomfort
...