Разбор различных файлов Юникода с помощью BeautifulSoup

У меня есть эта конкретная HTML-страница с кодеком

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

Теперь, когда я пытаюсь проанализировать этот конкретный файл, используя BeautifulSoup, он всегда возвращает объект NULL. Я могу преобразовать это используя:

page = codecs.open('file_name', 'r', 'cp1251')
soup = BeautifulSoup(page.read())

Теперь работает нормально. Но в моей коллекции есть страницы, состоящие из кодировок UTF-8 и windows-1251. Итак, я хотел знать, какова процедура определения кодировки конкретной HTML-страницы, и соответственно преобразовать ее, если она в формате windows-1251?

Я нашел это:

soup.originalEncoding

Но для этого мне нужно загрузить его в "суп". Но там только возвращается "объект без типа". Любая помощь будет высоко оценен.

Я использую Python 2.7

РЕДАКТИРОВАТЬ:

Вот пример того, что я на самом деле пытаюсь сказать:

Это мой код:

from bs4 import BeautifulSoup
import urllib2

page=urllib2.urlopen(Page_link)
soup = BeautifulSoup(page.read())

print soup.html.head.title

страница, имеющая

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

правильно отображает заголовок страницы.

Теперь, если страница имеет

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

тогда вывод

AttributeError: у объекта 'NoneType' нет атрибута 'head'

Теперь я могу это исправить, используя библиотеку кодеков, как указано выше. Я пытаюсь выяснить, как определить кодировку, чтобы можно было ее применить.

Это два сайта, которые пытаются сканировать и собирать определенную информацию:

http://www.orderapx.com/ и http://www.prpoakland.com/

1 ответ

Решение

Вы загружаете свои страницы из Интернета; искать заголовок типа контента с charset параметр, чтобы увидеть, если веб-сервер уже сказал вам о кодировке:

charset = page.headers.getparam('charset')
soup = BeautifulSoup(page.read(), from_encoding=charset)

Если такого параметра нет, charset установлен в None и BeautifulSoup вернется к угадыванию.

Вы также можете попробовать разные парсеры; если HTML-код искажен, различные парсеры будут восстанавливать HTML-код разными способами, возможно, позволяя BeautifulSoup лучше определять кодировку.

Другие вопросы по тегам