我正在使用BeautifulSoup4来抓取这个网页,但我得到了Beautiful Soup返回的奇怪的unicode文本。
这是我的代码:
site = "http://en.wikipedia.org/wiki/"+a+"_"+str(b)
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site,headers=hdr)
req.add_header('Accept-enconding', 'gzip') #Header to check for gzip
page = urllib2.urlopen(req)
if page.info().get('Content-Encoding') == 'gzip': #IF checks gzip
data = page.read()
data = StringIO.StringIO(data)
gzipper = gzip.GzipFile(fileobj=data)
html = gzipper.read()
soup = BeautifulSoup(html, fromEncoding='gbk')
else:
soup = BeautifulSoup(page)
section = soup.find('span', id='Events').parent
events = section.find_next('ul').find_all('li')
print soup.originalEncoding
for x in events:
print x
私下里,我希望x用通俗易懂的英语。相反,我得到的是这样的东西:
<li><a href="/wiki/153_BC" title="153 BC">153 BC</a> – <a href="/wiki/Roman_consul" title="Roman consul">Roman consuls</a> begin their year in office.</li>
在这个特定的字符串中只有一个例子,但你已经明白了。
相关:我继续用一些正则表达式和其他字符串剪切方法剪切这个字符串,我应该在剪切之前或之后将其切换为纯文本吗?我想这没关系,但考虑到我无论如何都会服从,我想我会问的。
如果有人知道如何解决这个问题,我将不胜感激。谢谢
编辑:感谢J.F.的提示,我现在在for循环后使用了这个:
for x in events:
x = x.encode('ascii')
x = str(x)
#Find Content
regex2 = re.compile(">[^>]*<")
textList = re.findall(regex2, x)
text = "".join(textList)
text = text.replace(">", "")
text = text.replace("<", "")
contents.append(text)
然而,我仍然得到这样的东西:
2013 – At least 60 people are killed and 200 injured in a stampede after celebrations at Félix Houphouët-Boigny Stadium in Abidjan, Ivory Coast.
编辑:以下是我如何制作excel电子表格(csv)并发送我的列表
rows = zip(days, contents)
with open("events.csv", "wb") as f:
writer = csv.writer(f)
for row in rows:
writer.writerow(row)
因此,csv文件是在程序中创建的,所有内容都是在生成列表后导入的。我只需要在这一点上让它成为可读的文本。
fromEncoding
(为了符合PEP8,已重命名为from_encoding
)告诉解析器如何解释输入中的数据。您(您的浏览器或urlib)从服务器接收到的只是一个字节流。为了理解它,也就是说,为了从这个字节流中构建一个抽象字符序列(这个过程被称为解码),必须知道信息是如何编码的。这条信息是必需的,您必须提供它以确保您的代码正常运行。维基百科告诉你他们是如何编码数据的,它在每个网页的源代码的顶部都有说明,例如
<meta charset="UTF-8" />
因此,从维基百科的网络服务器接收的字节流应该使用UTF-8编解码器进行解释。您应该调用
soup = BeautifulSoup(html, from_encoding='utf-8')
而不是BeautifulSoup(html, fromEncoding='gbk')
,后者试图用一些汉字编解码器解码字节流(我猜你是盲目地从这里复制了那段代码)。
您确实需要确保您理解文本编码的基本概念。实际上,需要在输出中使用unicode,它是字符/符号序列的抽象表示。在这种情况下,不存在所谓的"简明英语"。
没有纯文本这回事。您看到的是使用错误字符编码解释为文本的字节,即字符串的编码与您的终端使用的编码不同,除非错误是由于之前对网页使用了错误的字符编码而导致的。
print x
调用str(x)
,后者为BeautifulSoup对象返回UTF-8编码的字符串。
尝试:
print unicode(x)
或者:
print x.encode('ascii')