1

BeautifulSoup 和我没有认识到br.response().read(). 我已经导入 BeautifulSoup

#snippet:
# Select the first (index zero) form
br.select_form(nr=0)
br.form.set_all_readonly(False)
br['__EVENTTARGET'] = list_of_dates[0]
br['__EVENTARGUMENT'] = 'calMain'
br['__VIEWSTATE'] = viewstate
br['__EVENTVALIDATION'] = eventvalidation

response = br.submit()
print br.response().read() #*#this prints the html I'm expecting*

soup = BeautifulSoup(br.response().read()) #*#but this throws 
#TypeError: 'module' object is not callable.  
#Yet if I call soup = BeautifulSoup("http://page.com"), it's cool.*

selecttable = soup.find('table',{'id':"tblItems"})
#/snippet

... 等等

所以我觉得我有错误的“对象”,但是,BeautifulSoup 想要什么样的“对象”?

4

4 回答 4

7

利用

from BeautifulSoup import BeautifulSoup

代替

import BeautifulSoup

否则我认为你做的是对的!

于 2012-06-09T20:08:07.977 回答
1

你写了:

response = br.submit()
print br.response().read() #*#this prints the html I'm expecting*

soup = BeautifulSoup(br.response().read())

你为什么不试试:

response = br.submit()
soup = BeautifulSoup(response.read())

我怀疑这与您正在调用的事实.read()有关br.response(),在我使用 mechanize 的历史中,我总是保存response()到一个变量并.read()从那里调用。我不知道它会起作用,也不能完全解释为什么print br.response().read()起作用,但试一试。

或者,BeautifulSoup 的 HTML 解析器可能不喜欢提供它的机械化。您可以尝试使用不同的解析器

于 2012-06-09T21:15:43.993 回答
0

您是否尝试过只读取一次对象然后保存结果。

例如:

raw = br.response().read()

soup = BeautifulSoup(raw)

使用文件对象,您可以读取它们一次,然后必须重新打开它们才能再次读取。看起来您正在阅读它们两次。您应该做的另一件事是在阅读前后打印 br.response 的类型签名。

为了更容易调试,请尝试打印类型签名:

print type(response) # see the type of response from above
raw = br.response().read()
print type(raw)
print type(br.response().read()) # see what happens the second time :P

此外,如果您也发布堆栈跟踪也会有所帮助。

于 2012-06-09T21:19:47.673 回答
0

只需确认您的导入是这样的:

from BeautifulSoup import BeautifulSoup

或 BeautifulSoup4

from bs4 import BeautifulSoup
于 2012-06-09T20:08:47.913 回答