无效的Schema,Django中未找到连接适配器错误
我正在尝试使用http://robobrowser.readthedocs.org/en/latest/readme.html,这是一个基于Beautiful Soup和Requests库的新Python库。目前,我用它打开一系列网页,并把得到的响应保存到一个列表中,以便后续处理。在我的调试工具中,这个列表看起来是这样的:
pages = [<Response [200]>, <Response [200]> ....]
我通过让robobrowser对象循环访问一些页面并保存响应来生成这个列表:
while pageRight:
browser.follow_link(pageright[0])
browser
page = browser.response
pages.append(page)
pageRight= browser.select(".pageright")
上面的部分似乎运行得很好,但是当我在我的Django索引文件中尝试:
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)
时,我遇到了错误:
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 '
我哪里做错了呢?
2 个回答
这似乎是Robobrowser中的一个错误。它可能在寻找类似于 <a href="...">链接名称</a>
的东西,然后只取了 "..."
里面的部分。根据相关的标准(特别是3986号RFC),这个部分可以是 //example.com/path/to/resource
、http://example.com/path/to/resource
,或者仅仅是 /path/to/resource
。你看到的情况是,它找到了一个只有路径部分的 /index/
,然后就认为可以直接使用这个路径。其实,Robobrowser应该做的(就像普通的浏览器那样)是根据3986号RFC的第5节来确定完整的URI。幸运的是,很快就会有一个库可以帮助它们做到这一点。
看起来 pages
是一个包含多个响应对象的列表,而你在每个响应的 content
属性上调用了 browser.open
。但是,open
方法需要的是一个网址,而不是响应的内容。如果你想打开 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")