0

我正在尝试http://robobrowser.readthedocs.org/en/latest/readme.html,这是一个基于美丽汤和请求库的新 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")

上述部分似乎工作正常,但是当我尝试时:

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 '

我究竟做错了什么?

4

2 回答 2

3

它看起来像是pages一个 Response 对象的列表,并且您正在调用每个响应browser.opencontent属性。但是该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")
于 2014-07-27T23:18:01.183 回答
2

这是 Robobrowser 中的一个错误(似乎)。它可能正在寻找<a href="...">Link Name</a>并仅获取"..."零件中的内容。根据相关的 RFC(特别是 3986),这可以是//example.com/path/to/resourceorhttp://example.com/path/to/resource或 just /path/to/resource。您所看到的是它只找到了带有路径段的东西,/index/并假设它可以使用它。robobrowser 应该做的(这就是浏览器所做的)是根据 RFC 3986 的第 5 节确定完整的 URI 是什么。对他们来说幸运的是,很快就会有一个库能够为他们做这件事。

于 2014-07-26T14:35:58.233 回答