Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2013 11:22:58

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

Добрый день.
Я только учусь писать на Python и у меня возник следующий вопрос: на данный момент я пишу код для парсинга сайта rp5.ru Суть данного кода заключается в том что бы скачивать информацию о погоде.
Но у меня абсолютно не получается, если вы поможете мне разобраться буду очень благодарен. Вот код:

import lxml.html
import io
from urllib import request
import requests
from urllib.parse import urljoin
from lxml.html import fromstring
url = "http://rp5.ru/%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80%D0%B5,_%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D1%80%D0%B0%D0%B9"
http_proxy = "http://R_VG:Zd213HYr@10.5.45.250:3128"
proxyDict = { 
             
              "http" : http_proxy
              
            }
 
r = requests.get(url,  proxies=proxyDict)
html= fromstring(r.content)
temp= html.xpath("//div[@class='t_0']/a/text()")[0]

И вот такую ошибку он мне выдает :

Traceback (most recent call last):
  File "C:/Python32/xd", line 18, in <module>
    html= fromstring(r.content)
  File "C:\Python32\lib\site-packages\lxml\html\__init__.py", line 630, in fromstring
    if start.startswith('<html') or start.startswith('<!doctype'):
TypeError: expected an object with the buffer interface

Офлайн

#2 Сен. 3, 2013 12:50:48

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Парсинг сайта

Что это вообще такое???

import lxml.html
import io
from urllib import request
import requests
from urllib.parse import urljoin
from lxml.html import fromstring

Строка 1 - Вы импортируете модуль lxml.html
Строка 6 - вы опять импортируете модуль и добавляете в пространство имен fromstring.
Зачем двойной импорт? Если Вы импортировали уже этот модуль, то можете просто вызвать:

html= lxml.html.fromstring(r.content)

Либо, если Вам не нужны остальные функции (т.е. методы lxml.html), то тогда сразу

from lxml.html import fromstring

Без первой строки.

Далее.

Зачем дважды импортировать urllib. Можно один раз.
Автоматом отпадет необходимость в Строке 5.

Теперь urljoin можно будет вызвать опять через явное указание

res = urllib.parse.urljoin....

Короче. В итоге список импортов превращается в

import lxml.html
import io
import urllib
import requests

Еще есть вопрос про рациональность одновременного использования urllib и requests…

P.S. Есть документация по lxml. Если надо, пишите. Кстати, статья на русском Ссылочка.
P.S.S. По urllib хорошо написано у Бизли Д. “Python. Подробный справочник”.

Рекомендую это все предварительно прочитать :)



Отредактировано 4kpt (Сен. 3, 2013 12:54:37)

Офлайн

#3 Сен. 3, 2013 13:22:59

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

4kpt
Спасибо большое за ссылке, обязательно почитаю.
У меня самая большая беда, в том что у меня подключение идет через прокси сервер, и я не совсем понимаю правильно ли я с ним работаю, почитав литературу в интернете не очень получилось разобраться, вы не подскажете нет ли у меня в этом ошибки?

Офлайн

#4 Сен. 3, 2013 15:36:51

myarik
Зарегистрирован: 2012-11-20
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

Посмотрите в сторону библиотеки Grab.

Офлайн

#5 Сен. 3, 2013 15:38:14

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Парсинг сайта

from grab import Grab
g = Grab()
g.setup(proxy='http://R_VG:Zd213HYr@10.5.45.250:3128')
g.go('http://rp5.ru/%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80%D0%B5,_%D0%9A%D1%80%D0%B0%D1%81%D0%BD%D0%BE%D0%B4%D0%B0%D1%80%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D1%80%D0%B0%D0%B9')
print g.doc.select('//span[@class="t_0"]').text()

Отредактировано lorien (Сен. 3, 2013 15:38:26)

Офлайн

#6 Сен. 3, 2013 16:50:36

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

Спасибо большое, но при выполнении этого скрипта, в строке print g.doc.select('//span').text()
подсвечивает g красным, и пишет invalid syntax.
Из-за чего это может быть?

Офлайн

#7 Сен. 3, 2013 16:52:13

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Парсинг сайта

Какой питон?



Офлайн

#8 Сен. 3, 2013 16:54:34

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

3.2

Офлайн

#9 Сен. 3, 2013 16:55:46

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Парсинг сайта

print(g.doc.select('//span[@class="t_0"]').text())



Офлайн

#10 Сен. 3, 2013 16:58:32

Stepe
Зарегистрирован: 2013-09-03
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта

Теперь все еще веселее Выдает следующую ошибку…

Traceback (most recent call last):
  File "C:/Python32/Lib/45", line 1, in <module>
    from grab import Grab
ImportError: No module named grab
Traceback (most recent call last):
** IDLE Internal Exception: 
  File "idlelib\run.py", line 98, in main
    ret = method(*args, **kwargs)
  File "idlelib\run.py", line 306, in runcode
    jit = self.rpchandler.console.getvar("<<toggle-jit-stack-viewer>>")
  File "idlelib\rpc.py", line 558, in __getattr__
    raise AttributeError(name)
AttributeError: getvar

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version