尽管在meta标签中指定了charset,但是BeautifulSoup + Unicode,Dammit - html乱码

时间:2013-10-24 14:35:24

标签: python utf-8 character-encoding beautifulsoup

我正在尝试解析http://www.olx.pt/carros-cat-378-p-1。通过更改URL中的最后一个数字,我可以遍历页面。该页面在元标记中指定Content-Type中的ISO-8859-1。因此,我在from_encoding参数中告诉BeautifulSoup。

然而,偶尔,当做一个find_all时,我得到一个零长度的结果集。检查汤,我发现一切都会出现乱码。当我得到一个零ResultSet并切换到另一个字符集时,我试图捕获,例如cp1252和latin1。

我认为所有的HTML都会出现乱码并且只是时不时地出现这种情况真的很奇怪。我还认为,当发生这种情况时,我无法弄清楚正在使用哪个字符集,这甚至是非常奇怪的。有没有人知道这里会发生什么?

代码

import mechanize
import cookielib
from bs4 import BeautifulSoup


def getNewBrowser():
    # create browser instance
    b = mechanize.Browser()

    # create a cookiejar for cookies
    jar = cookielib.LWPCookieJar()
    b.set_cookiejar(jar)

    # prevent mechanize from simulating a 403 disallow
    b.set_handle_robots(False)

    # handle some other stuff
    b.set_handle_equiv(True)
    #b.set_handle_gzip(True)
    b.set_handle_redirect(True)
    b.set_handle_referer(True)

    # follows refresh 0 but not hangs on refresh >0
    b.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

    # want debugging messages?
    #br.set_debug_http(True)
    #br.set_debug_redirects(True)
    #br.set_debug_responses(True)

    # User-Agent
    b.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0')]
    return b



def run():
    b = getNewBrowser()
    url = "http://www.olx.pt/carros-cat-378-p-"
    n = 100
    for i in range(1,n):
        urlt = url + str(i)
        b.open(urlt, timeout = 10.0)
        soup = BeautifulSoup(b.response(), from_encoding="ISO-8859-1")
        print "--------------------------------------------------------------------"
        print "page: " + str(i)
        print "--------------------------------------------------------------------"
        print soup


if __name__ == '__main__':
    run()

1 个答案:

答案 0 :(得分:0)

您可以使用replace()将页面内容中声明的编码替换为“utf-8”。这有点hackish,但这对我有用。

在将页面内容传递给BeautifulSoup之前:

page_content.replace('charset="ISO-8859-1"','charset=utf-8')