Получение HTML с помощью Pycurl

Я пытался получить страницу HTML с помощью pycurl, поэтому я могу проанализировать ее для получения соответствующей информации, используя str.split и некоторые циклы for. Я знаю, что Pycurl извлекает HTML, поскольку он печатает его на терминале, однако, если я попытаюсь сделать что-то вроде

html = str(c.perform())  

Переменная будет просто содержать строку, которая говорит «Нет».

Как я могу использовать pycurl для получения html или перенаправить все, что он отправляет на консоль, чтобы его можно было использовать как строку, как описано выше?

Большое спасибо всем, у кого есть какие-либо предложения!


person Sinthet    schedule 02.07.2011    source источник


Ответы (2)


это отправит запрос и сохранит/распечатает тело ответа:

from StringIO import StringIO    
import pycurl

url = 'http://www.google.com/'

storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.WRITEFUNCTION, storage.write)
c.perform()
c.close()
content = storage.getvalue()
print content

если вы хотите сохранить заголовки ответа, используйте:

c.setopt(c.HEADERFUNCTION, storage.write)
person Corey Goldberg    schedule 02.07.2011
comment
Большой! Это именно то, что я искал. Хотя одна строчка неверна. Должно быть указано storage = StringIO.StringIO(). В противном случае возникает ошибка. В любом случае спасибо за помощь!! - person Sinthet; 02.07.2011
comment
я думаю, что это правильно, как есть. обратите внимание, что я делаю «из StrongIO импортировать StringIO» - person Corey Goldberg; 02.07.2011
comment
Ах, может быть, это так. Я проверил свой источник и только что импортировал всю библиотеку. Извините за путаницу! - person Sinthet; 02.07.2011
comment
Есть ли шанс, что вы могли бы обновить это для Python3? Похоже, что Python3 устарел от StringIO в пользу io.StringIO, который не совсем работает, как указано выше. - person Dustin Kirkland; 03.02.2013
comment
Для Python 3 вместо этого используйте io.BytesIO, но тогда .getvalue() вернет bytes, поэтому вы должны превратить их в строку с .decode("utf-8") - person Adam; 16.04.2014

Метод Perform() выполняет выборку html и записывает результат в указанную вами функцию. Вам нужно предоставить буфер для размещения html и функцию записи. Обычно это можно сделать с помощью объекта StringIO следующим образом:

import pycurl
import StringIO

c = pycurl.Curl()
c.setopt(pycurl.URL, "http://www.google.com/")

b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.perform()
html = b.getvalue()

Вы также можете использовать файл, временный файл или что-то еще, что может хранить данные.

person MakeSomething    schedule 02.07.2011