InvalidSchema Не найдены адаптеры подключения для , ошибка в django

Я экспериментирую с 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 '

Что я делаю не так?


person user1592380    schedule 22.07.2014    source источник
comment
Пожалуйста, покажите полную трассировку   -  person Alasdair    schedule 22.07.2014
comment
Как вы формируете запросы? Возможно, вам придется включить протокол в запросы. http://www.google.com   -  person karthikr    schedule 22.07.2014
comment
Я внес некоторые изменения. - Билл   -  person user1592380    schedule 22.07.2014


Ответы (2)


Похоже, что 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")
person jm.carp    schedule 27.07.2014
comment
Спасибо за объяснение - person user1592380; 28.07.2014

Это баг в Робобраузере (похоже). Вероятно, он ищет <a href="...">Link Name</a> и просто берет то, что находится в части "...". На основании соответствующих RFC (в частности, 3986) это может быть либо //example.com/path/to/resource, либо http://example.com/path/to/resource, либо просто /path/to/resource. Вы видите, что он нашел что-то с сегментом пути только /index/ и предполагает, что может просто использовать его. Что robobrowser должен делать (что и делают браузеры), так это определять, какой полный URI основан на Разделе 5 RFC 3986. К счастью для них, очень скоро появится библиотека, которая будет способна делать это для них.

person Ian Stapleton Cordasco    schedule 26.07.2014
comment
Спасибо, а какая библиотека? - person user1592380; 26.07.2014
comment
Он не закончен, но библиотека имеет неоригинальное название rfc3986. Это на PyPI. - person Ian Stapleton Cordasco; 26.07.2014
comment
Спасибо, поищу. - person user1592380; 27.07.2014