我正在试验http://robobrowser.readthedocs.org/en/latest/readme.html,这是一个基于美丽汤的新蟒蛇图书馆并要求ibraries。我目前正在使用它来打开一系列页面并将响应保存到列表中以供以后解析。我的调试器中的列表如下所示:
pages = [<Response [200]>, <Response [200]> ....]
我通过让robobrowser对象遍历某些页面并保存响应来生成此列表:
while pageRight:
browser.follow_link(pageright[0])
browser
page = browser.response
pages.append(page)
pageRight= browser.select(".pageright")
以上部分似乎工作正常,但是当我尝试时:
ag = "myagent"
browser = RoboBrowser(user_agent=ag)
for page in pages:
browser.open(page.content)
for listing in browser.select('.listingInfo'): #a list
pl = getParsedListing(listing)
listings.append(pl)
在我的django索引文件中,我收到错误:
InvalidSchema at /index/
No connection adapters were found for..
回溯:
Traceback:
File "C:\envs\r1\lib\site-packages\django\core\handlers\base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\envs\r1\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "C:\envs\r1\masslist\ml1\views.py" in index
29. Sites = getSitesInArea(Area)
File "C:\envs\r1\masslist\ml1\views.py" in getSitesInArea
91. browser.open(page.content)
File "C:\envs\r1\lib\site-packages\robobrowser\browser.py" in open
200. verify=verify if verify is not None else self.verify,
File "C:\envs\r1\lib\site-packages\requests\sessions.py" in get
468. return self.request('GET', url, **kwargs)
File "C:\envs\r1\lib\site-packages\requests\sessions.py" in request
456. resp = self.send(prep, **send_kwargs)
File "C:\envs\r1\lib\site-packages\requests\sessions.py" in send
553. adapter = self.get_adapter(url=request.url)
File "C:\envs\r1\lib\site-packages\requests\sessions.py" in get_adapter
608. raise InvalidSchema("No connection adapters were found for '%s'" % url)
Exception Type: InvalidSchema at /index/
Exception Value: No connection adapters were found for '
我做错了什么?
答案 0 :(得分:3)
看起来pages
是一个Response对象列表,您在每个响应的browser.open
属性上调用content
。但open
方法采用的是URL,而不是响应的内容。如果您要打开pages
列表中的每个页面,请尝试以下操作:
for page in pages:
browser.open(page.url)
...
我相信这会有效,但效率会很低,因为这意味着要两次访问列表中的每个页面(一次在while pageRight
循环中,再次在for page in pages
循环中)。为了提高效率,您可以将两个循环合并为一个:
while pageRight:
for listing in browser.select('.listingInfo'):
pl = getParsedListing(listing)
listings.append(pl)
browser.follow_link(pageright[0])
pageRight = browser.select(".pageright")
答案 1 :(得分:2)
这是Robobrowser中的一个错误(似乎)。它可能正在寻找<a href="...">Link Name</a>
并且正在寻找"..."
部分中的内容。根据相关的RFC(特别是3986),这可以是//example.com/path/to/resource
或http://example.com/path/to/resource
,也可以是/path/to/resource
。您所看到的是它发现只有/index/
路径段的内容,并假设它可以使用它。 robobrowser应该做什么(这是 browsers 做的)确定完整的URI是基于RFC 3986的第5部分。幸运的是,它们将很快就会有一个库为他们这样做。