无效的Schema,Django中未找到连接适配器错误

0 投票
2 回答
6382 浏览
提问于 2025-04-18 14:18

我正在尝试使用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 个回答

2

这似乎是Robobrowser中的一个错误。它可能在寻找类似于 <a href="...">链接名称</a> 的东西,然后只取了 "..." 里面的部分。根据相关的标准(特别是3986号RFC),这个部分可以是 //example.com/path/to/resourcehttp://example.com/path/to/resource,或者仅仅是 /path/to/resource。你看到的情况是,它找到了一个只有路径部分的 /index/,然后就认为可以直接使用这个路径。其实,Robobrowser应该做的(就像普通的浏览器那样)是根据3986号RFC的第5节来确定完整的URI。幸运的是,很快就会有一个库可以帮助它们做到这一点。

3

看起来 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")

撰写回答