【问题标题】:Unicode issue with Python scraperPython刮板的Unicode问题
【发布时间】:2013-04-28 18:48:43
【问题描述】:

我一直在编写糟糕的 perl,但我正在尝试学习编写糟糕的 python。我已经阅读了几天来一直遇到的问题(并且因此对 unicode 有了更多的了解),但我仍然在以下代码中遇到了流氓 em-dash 的问题:

import urllib2

def scrape(url):
# simplified
    data = urllib2.urlopen(url)
    return data.read()

def query_graph_api(url_list):
# query Facebook's Graph API, store data.
    for url in url_list:
        graph_query = graph_query_root + "%22" + url + "%22"
        query_data = scrape(graph_query)
        print query_data #debug console

### START HERE ####

graph_query_root = "https://graph.facebook.com/fql?q=SELECT%20normalized_url,share_count,like_count,comment_count,total_count%20FROM%20link_stat%20WHERE%20url="

url_list = ['http://www.supersavvyme.co.uk',  'http://www.supersavvyme.co.uk/article/how-to-be-happy–laugh-more']

query_graph_api(url_list)

(顺便说一句,这是爬虫的一个非常简化的表示。原版使用网站的sitemap.xml 来构建一个 URL 列表,然后查询 Facebook 的 Graph API 以获取每个 URL 的信息——这里是 the original scraper

我对此进行调试的尝试主要是尝试模仿正在重写莎士比亚的无限猴子。我常用的方法(在 StackOverflow 中搜索错误消息,复制并粘贴解决方案)失败了。

问题:如何对我的数据进行编码,以便第二个 URL 中的 em-dash 等扩展字符不会破坏我的代码,但仍能在 FQL 查询中工作?

附:我什至想知道我是否在问正确的问题:urllib.urlencode 可以在这里帮助我吗(当然这会使graph_query_root 更容易和更漂亮地创建...

---8

我从 ScraperWiki 上的实际爬虫得到的回溯如下:

http://www.supersavvyme.co.uk/article/how-to-be-happy–laugh-more
Line 80 - query_graph_api(urls)
Line 53 - query_data = scrape(graph_query) -- query_graph_api((urls=['http://www.supersavvyme.co.uk', 'http://...more
Line 21 - data = urllib2.urlopen(unicode(url)) -- scrape((url=u'https://graph.facebook.com/fql?q=SELECT%20url,...more
/usr/lib/python2.7/urllib2.py:126 -- urlopen((url=u'https://graph.facebook.com/fql?q=SELECT%20url,no...more
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 177: ordinal not in range(128)

【问题讨论】:

  • 你能在你的...问题中包含一个精确的问题吗?
  • 你能发布回溯吗?

标签: python unicode urllib2 scraperwiki


【解决方案1】:

如果您使用的是 Python 3.x,您所要做的就是添加一行并更改另一行:

gq = graph_query.encode('utf-8')
query_data = scrape(gq)

如果您使用的是 Python 2.x,请先在模块文件的顶部添加以下行:

# -*- coding: utf-8 -*-(阅读 here 的用途)

然后在传递给 urlopen 之前将所有字符串文字设为 unicode 和编码:

def scrape(url):
# simplified
    data = urllib2.urlopen(url)
    return data.read()

def query_graph_api(url_list):
# query Facebook's Graph API, store data.
    for url in url_list:
        graph_query = graph_query_root + u"%22" + url + u"%22"
        gq = graph_query.encode('utf-8')
        query_data = scrape(gq)
        print query_data #debug console

### START HERE ####

graph_query_root = u"https://graph.facebook.com/fql?q=SELECT%20normalized_url,share_count,like_count,comment_count,total_count%20FROM%20link_stat%20WHERE%20url="

url_list = [u'http://www.supersavvyme.co.uk', u'http://www.supersavvyme.co.uk/article/how-to-be-happy–laugh-more']

query_graph_api(url_list)

从代码来看,您使用的是 3.x,这对于处理此类事情确实更好。但是你仍然需要在必要时进行编码。在 2.x 中,最好的建议是按照 3.x 的默认设置:在整个代码中使用 unicode,并且仅在调用字节时进行编码。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2017-11-12
    • 2013-03-21
    • 2015-07-07
    相关资源
    最近更新 更多