我已经写了一段时间的坏perl,但我正在尝试学习编写坏的python。我已经阅读了几天我已经遇到的问题了(并且因此知道了非常多关于unicode的问题)但是我仍然遇到以下代码中的流氓em-dash的麻烦: / p>
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)
(这是刮刀的简化表示,BTW。原版使用网站的sitemap.xml
来构建网址列表,然后查询Facebook的Graph API以获取每个网址的信息 - 这里是the original scraper )
我试图调试这个主要是试图模仿重写莎士比亚的无限猴子。我通常的方法(搜索错误消息的StackOverflow,复制并粘贴解决方案)失败。
问题:如何对数据进行编码,以便第二个网址中的扩展字符(如em-dash)不会破坏我的代码,但仍可在FQL查询中使用?
P.S。我甚至想知道我是否在问正确的问题:可能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)
答案 0 :(得分: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,并仅在调用字节时进行编码。