Получить тип контента со страницы HTML с BeautifulSoup - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь получить кодировку символов для страниц, которые я очищаю, но в некоторых случаях это не удается. Вот что я делаю:

resp = urllib2.urlopen(request)
self.COOKIE_JAR.extract_cookies(resp, request)
content = resp.read()
encodeType= resp.headers.getparam('charset')
resp.close()

Это моя первая попытка. Но если кодировка возвращается как None, я делаю это:

soup = BeautifulSoup(html)
if encodeType == None:
    try:
        encodeType = soup.findAll('meta', {'http-equiv':lambda v:v.lower()=='content-type'})
    except AttributeError, e:
        print e
        try:
            encodeType = soup.findAll('meta', {'charset':lambda v:v.lower() != None})
        except AttributeError, e:
            print e
            if encodeType == '':
                encodeType = 'iso-8859-1'

На странице, которую я тестирую, это есть в шапке: <meta charset="ISO-8859-1">

Я ожидал бы, что первый оператор try вернет пустую строку, но я получаю эту ошибку в обоих операторах try (вот почему 2-й оператор сейчас вложен):

Объект 'NoneType' не имеет атрибута 'lower'

Что не так с оператором второй попытки? Я предполагаю, что 1-й также неверен, поскольку он выдает ошибку, а не просто возвращается пустым.

ИЛИ еще лучше Есть ли более элегантный способ просто удалить любую специальную кодировку со страницы? Мой конечный результат, которого я пытаюсь достичь, заключается в том, что меня не волнует ни один из специально закодированных символов. Я хочу удалить закодированные символы и сохранить необработанный текст. Могу ли я пропустить все вышеперечисленное и сказать BeautifulSoup, чтобы просто удалить все, что закодировано?

Ответы [ 2 ]

1 голос
/ 25 марта 2011

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

for word in doc.lower().split(): 
        try:
            word = str(word)
            word = self.handlePunctuation(word)
            if word == False:
                continue
        except UnicodeEncodeError, e:
            #word couldn't be converted to string; most likely encoding garbage we can toss anyways
            continue 
0 голосов
/ 24 марта 2011

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

  1. Определить из самой HTML-страницы через метатеги (например, <meta http-equiv="Content-Type" content="text/html; charset=utf-8">)
  2. Определение кодировки через заголовки HTTP (например, Content-Type: text/html; charset=ISO-8859-1)
  3. Наконец, если приведенное выше ничего не дает, вы можете сделать что-то вроде использования алгоритма для определения кодировки символов страницы, используяраспределение байтов внутри него (обратите внимание, что не гарантируется найти правильную кодировку).Проверьте библиотеку chardet для этой опции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...