我一直在写糟糕的 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 以获取每个信息 - 这是原始刮板)
我对此进行调试的尝试主要包括尝试模仿正在重写莎士比亚的无限猴子。我常用的方法(在 StackOverflow 中搜索错误消息,复制并粘贴解决方案)失败了。
问题:如何对我的数据进行编码,以便第二个 URL 中的 em-dash 等扩展字符不会破坏我的代码,但仍能在 FQL 查询中工作?
PS我什至想知道我是否在问正确的问题:可能会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)