使用 Python Django 正确抓取和显示日语字符 BeautifulSoup 和 Curl

Correctly Scraping and Displaying Japanese Characters using Python Django BeautifulSoup and Curl

提问人:Ryan Rogers 提问时间:9/13/2012 最后编辑:Ryan Rogers 更新时间:9/13/2012 访问量:2669

问:

我正在尝试使用 python、curl 和 BeautifulSoup 抓取日语页面。然后,我将文本保存到使用 utf-8 编码的 MySQL 数据库中,并使用 Django 显示结果数据。

下面是一个示例 URL:

https://www.cisco.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.showJob&RID=930026&CurrentPage=180

我有一个函数用于将 HTML 提取为字符串:

def get_html(url):
    c = Curl()
    storage = StringIO()
    c.setopt(c.URL, str(url))
    cookie_file = 'cookie.txt'
    c.setopt(c.COOKIEFILE, cookie_file)
    c.setopt(c.COOKIEJAR, cookie_file)
    c.setopt(c.WRITEFUNCTION, storage.write)
    c.perform()
    c.close()
    return storage.getvalue()

然后我把它传递给 BeautifulSoup:

html = get_html(str(scheduled_import.url))
soup = BeautifulSoup(html)

然后对其进行解析并将其保存到数据库中。然后,我使用 Django 将数据输出到 json。这是我正在使用的视图:

def get_jobs(request):
    jobs = Job.objects.all().only(*fields)
    joblist = []
    for job in jobs:
        job_dict = {}
        for field in fields:
            job_dict[field] = getattr(job, field)
        joblist.append(job_dict)
    return HttpResponse(dumps(joblist), mimetype='application/javascript')

生成的页面显示字节码,例如:

xe3\x82\xb7\xe3\x83\xa3\xe3\x83\xaa\xe3\x82\xb9\xe3\x83\x88\xe8

\x81\xb7\xe5\x8b\x99\xe5\x86\x85\xe5\xae\xb9
\xe3\x82\xb7\xe3\x82\xb9\xe3\x82\xb3\xe3\x82\xb7\xe3\x82\xb9\xe3\x83\x86\xe3\x83\xa0\xe3\x82\xba\xe3\x81\xae\xe3\x82\xb3\xe3\x83\xa9\xe3\x83\x9c\xe3\xe3\xa9\xe3\x83\x9c\xe3\ x83\xac\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe4\xba\x8b\xe6\xa5\xad\xe9\x83\xa8\xe3\x81\xa7\xe3\x81\xaf\xe3\x80\x81\xe4\xba\xba\xe3\x82\x92\xe4\xb8\xad\xe5\xbf\x83\xe3\x81\xa8\xe3\x81\x97\xe3\x81\x9f\xe3\x82\xb3\xe3\x83\x9f\xe3\x83\xa5\xe3\x83\x8b\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\xe3\x81\xab\xe3\x82\x88\xe3\x82\x8a\xe3\

而不是日语。

我一整天都在研究,并将我的数据库转换为 utf-8,尝试从 iso-8859-1 解码文本并编码为 utf-8。

基本上,我不知道自己在做什么,并希望我能得到任何帮助或建议,这样我就可以避免再花一天时间试图解决这个问题。

蟒蛇 django utf-8 beautifulsoup iso-8859-1

评论

0赞 Ignacio Vazquez-Abrams 9/13/2012
你忘了告诉 Beautiful Soup 编码。从响应标头中获取它。
0赞 Ryan Rogers 9/13/2012
我相信 BeautifulSoup 会根据页面的 meta 标签自动设置编码,根据这个 crummy.com/software/BeautifulSoup/bs3/documentation.html“<META> 标签可以指定文档的编码”和 soup.originalEncoding 输出 'iso-8859-1'
0赞 Ignacio Vazquez-Abrams 9/13/2012
您假设该页面具有要读取的 META 标记。
0赞 Ryan Rogers 9/14/2012
在这种情况下,它应该提到
0赞 dqshll 3/29/2023
你解决了这个问题吗?我用 bs4 解码日语单词也有同样的麻烦

答:

0赞 Torsten Engelbrecht 9/13/2012 #1

您发布的示例在某种程度上是字符串的 ascii 表示形式。您需要将其转换为python unicode字符串。通常,您可以使用字符串编码和解码来完成这项工作。如果您不确定哪一种是正确的方法,只需在 python 控制台中进行试验即可。

尝试获取 python unicode 字符串。这应该正确显示在 Django 模板中,可以保存到数据库等。举个例子,你也可以试着看看它正在输出日语字符。my_new_string = my_string.decode('utf-8')print my_new_string

评论

0赞 Ryan Rogers 9/13/2012
这没有任何运气。当我在控制台中打印时,我可以让原始 HTML 字符串显示日语字符,我能做的最好的事情就是使用 Beautifulsoup 输出获得时髦的字符,例如“ã&&euro;?ã&fnof;?ã' ̧ã'·ã&fnof;§ã&fnof;³ã&欧元;&lsquo;<br />ã&欧元;&欧元;ã&fnof;»人äº&lsaquo;äº&lsaquo;å&lsaquo;&交易;æ&lsaquo;&螺旋;Å1/2”<br /><br />ã&欧元;?æ&permil;&欧元;å±&#x17E;é&fnof; ̈署å??”