BeautifulSoup findall с атрибутом класса - ошибка кодирования Unicode - PullRequest
6 голосов
/ 21 апреля 2011

Я использую BeautifulSoup для извлечения новостей (только заголовки) из Hacker News и до сих пор так много -

import urllib2
from BeautifulSoup import BeautifulSoup

HN_url = "http://news.ycombinator.com"

def get_page():
    page_html = urllib2.urlopen(HN_url) 
    return page_html

def get_stories(content):
    soup = BeautifulSoup(content)
    titles_html =[]

    for td in soup.findAll("td", { "class":"title" }):
        titles_html += td.findAll("a")

    return titles_html

print get_stories(get_page()

)

Однако, когда я запускаю код, он выдает ошибку-

Traceback (most recent call last):
  File "terminalHN.py", line 19, in <module>
    print get_stories(get_page())
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe2' in position 131: ordinal not in range(128)

Как мне заставить это работать?

Ответы [ 3 ]

6 голосов
/ 21 апреля 2011

Потому что BeautifulSoup внутренне работает со строками Unicode.Печать строк Unicode в консоль заставит Python попытаться преобразовать Unicode в кодировку Python по умолчанию, обычно это asciiВ общем случае это не сработает для сторонних веб-сайтов.Вы можете изучить основы Python и Unicode, прибегая к помощи «python + unicode».Тем временем конвертируйте ваши строки юникода в utf-8, используя

print some_unicode_string.decode('utf-8')
1 голос
/ 21 апреля 2011

Следует отметить, что findAll возвращает список (в данном случае список объектов BeautifulSoup), и вам просто нужны заголовки. Возможно, вы захотите использовать find вместо этого. И вместо того, чтобы распечатывать список объектов BeautifulSoup, вы говорите, что вам нужны заголовки. Следующее работает отлично, например:

import urllib2
from BeautifulSoup import BeautifulSoup

HN_url = "http://news.ycombinator.com"

def get_page():
    page_html = urllib2.urlopen(HN_url) 
    return page_html

def get_stories(content):
    soup = BeautifulSoup(content)
    titles = []

    for td in soup.findAll("td", { "class":"title" }):
        a_element = td.find("a")
        if a_element:
            titles.append(a_element.string)

    return titles

print get_stories(get_page())

Так что теперь get_stories() возвращает список unicode объектов, который распечатывается так, как вы ожидаете.

0 голосов
/ 21 апреля 2011

Работает нормально, сломан вывод.Либо явно кодируйте кодировку вашей консоли, либо найдите другой способ запуска вашего кода (например, изнутри IDLE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...