Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2015 00:50:14

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Здравствуйте, возникла нужда вытащить информацию из таблицы справа от карты на этом сайте (http://transport.orgp.spb.ru/Portal/transport/stop/24443 ). Я пытаюсь это сделать, но ни как не получается.
Пробовал таким образом, но не получилось. Буду очень признателен , если поможете.

from urllib.request import urlopen
from urllib.parse import urljoin
from lxml.html import fromstring
URL = 'http://transport.orgp.spb.ru/Portal/transport/stop/24443'
ITEM_PATH = '.display autoheight'
def parse_courses():
    f = urlopen(URL)
    list_html = f.read().decode('utf-8')
    list_doc = fromstring(list_html)
    for elem in list_doc.cssselect(ITEM_PATH):
        print(elem)
        a = elem.cssselect('tr')[0]
        name = a.text
def main():
    parse_courses()
if __name__ == '__main__':
    main()

Отредактировано SmileWithSmile (Май 3, 2015 00:54:25)

Офлайн

#2 Май 3, 2015 17:02:53

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Не работает, потому что там не всё так просто. Там эта таблица отдельно через AJAX запрос подгружается.
Вот такой код будет работать:

import urllib2
import json
from urllib import urlencode
url = 'http://transport.orgp.spb.ru/Portal/transport/stop/24443/arriving'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36'
data = {
    'sEcho':'1',
    'iColumns':'5',
    'sColumns':'index,routeNumber,timeToArrive,parkNumber,wheelchair',
    'iDisplayStart':'0',
    'iDisplayLength':'-1',
    'sNames':'index,routeNumber,timeToArrive,parkNumber,wheelchair'
    }
headers = {'X-Requested-With':'XMLHttpRequest','User-Agent':user_agent}
req = urllib2.Request(url, urlencode(data), headers)
response = urllib2.urlopen(req)
result = json.loads(response.read())
for i, line in enumerate(result['aaData']):
    index, route, time, parknumber, wheelchair = line
    if wheelchair:
        wheelchair = "+"
    else:
        wheelchair = " "
    out = '#: %s | Route: %s | TimeToArrive: %s min | ParkNumber: %s | Wheelchair: %s' % (i, route, time, parknumber, wheelchair)
    print out

Офлайн

#3 Май 3, 2015 21:33:27

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

giveback
Не работает, потому что там не всё так просто. Там эта таблица отдельно через AJAX запрос подгружается.Вот такой код будет работать:
Я правильно понял, что этот код для python 2.x

Офлайн

#4 Май 3, 2015 21:47:37

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Да, писал для 2.х. Вот сделал для 3ей, но не проверял:

import urllib.request, urllib.error
import json
from urllib.parse import urlencode
url = 'http://transport.orgp.spb.ru/Portal/transport/stop/24443/arriving'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36'
data = {
    'sEcho':'1',
    'iColumns':'5',
    'sColumns':'index,routeNumber,timeToArrive,parkNumber,wheelchair',
    'iDisplayStart':'0',
    'iDisplayLength':'-1',
    'sNames':'index,routeNumber,timeToArrive,parkNumber,wheelchair'
    }
headers = {'X-Requested-With':'XMLHttpRequest','User-Agent':user_agent}
req = urllib.request.Request(url, urlencode(data), headers)
response = urllib.request.urlopen(req)
result = json.loads(response.read())
for i, line in enumerate(result['aaData']):
    index, route, time, parknumber, wheelchair = line
    if wheelchair:
        wheelchair = "+"
    else:
        wheelchair = " "
    out = '#: %s | Route: %s | TimeToArrive: %s min | ParkNumber: %s | Wheelchair: %s' % (i, route, time, parknumber, wheelchair)
    print(out)

Отредактировано giveback (Май 3, 2015 22:05:23)

Офлайн

#5 Май 3, 2015 22:17:51

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

giveback
Да, писал для 2.х. Вот сделал для 3ей, но не проверял:
Traceback (most recent call last):
File “C:\Users\EbayUser\Desktop\project\demo.py”, line 16, in <module>
response = urllib.request.urlopen(req)
File “C:\Python34\lib\urllib\request.py”, line 153, in urlopen
return opener.open(url, data, timeout)
File “C:\Python34\lib\urllib\request.py”, line 453, in open
req = meth(req)
File “C:\Python34\lib\urllib\request.py”, line 1166, in do_request_
raise TypeError(msg)
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

Офлайн

#6 Май 3, 2015 22:54:22

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Спасибо огромное, установил старый питон и все заработало, мучался до этого кучу времени, + реп

Офлайн

#7 Май 4, 2015 00:02:23

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Чтобы заработало для 3ей версии похоже нужно вместо

req = urllib.request.Request(url, urlencode(data), headers)

делать вот так

req = urllib.request.Request(url, urlencode(data).encode('utf-8'), headers)

Офлайн

#8 Май 4, 2015 09:44:13

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

giveback
Чтобы заработало для 3ей версии похоже нужно вместо
Traceback (most recent call last):
File “C:\Users\EbayUser\Desktop\project\demo.py”, line 17, in <module>
result = json.loads(response.read())
File “C:\Python34\lib\json\__init__.py”, line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not ‘bytes’

Офлайн

#9 Май 4, 2015 11:53:48

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

А вместо

result = json.loads(response.read())

нужно

result = json.loads(response.read().decode('utf-8'))

Офлайн

#10 Май 4, 2015 18:37:35

SmileWithSmile
Зарегистрирован: 2015-05-03
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

giveback
А вместо
Ты лучший. Знай это

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version