为什么Beautifulsoup在提供机械化响应时会返回NoneTypes?

时间:2012-08-21 04:19:10

标签: python beautifulsoup mechanize

我正在尝试登录Twitter,对最近的推文进行一些搜索。我有以下代码:

import mechanize
from bs4 import BeautifulSoup
import time
import html5lib


twitter = 'https://mobile.twitter.com/session/new'
br = mechanize.Browser()
response1 = br.open(twitter)

br.select_form(nr=0)
br['username'] = 'MYUSERNAME'
br['password'] = 'MYPASSWORD'

br.submit()

req = br.click_link(text='Me[IMG]')
response = br.open(req)
soup = BeautifulSoup(response.read())
soup.prettify() #does nothing at all
soup.head #also does nothing at all

过去几天我一直在多个网站上使用Mechanize + Beautiful汤,并且没有遇到过这个问题。哎呀,即使在Twitter的其他一些页面上,上面的代码也能正常工作。我尝试打印prettify(),但它不起作用。它给了我以下错误:

  

UnicodeEncodeError:'ascii'编解码器无法对字符u'\ xb7'进行编码   位置6972:序数不在范围内(128)

我做了一些google-fu,我发现这与编码有关,所以我将我的代码调整为:

soup.prettify().encode('UTF-8')

这在很大程度上起作用。我的意思是,它至少打印一切。但是这些数据似乎都不像通常那样“在”汤的情况下。例如,我无法访问soup.head,而无法访问soup.bodySoup.find('foo')除了普通的soup.b之外什么都不做。如果我打印soup.head的类型它会返回NoneType,所以我很困惑!

这里发生了什么?

编辑:哇..?为什么这被贬低? :(

1 个答案:

答案 0 :(得分:2)

这是a bug in Beautiful Soup's html5lib tree builder。我已经提交了一个将在下一个版本中修复的修复程序。在此期间,我建议您告诉Beautiful Soup parse the markup using lxml instead of html5lib