LINUX.ORG.RU

Там post-запрос, с параметрами search, submit и type. Тебе надо сделать такое же через urllib2, например.

И причём тут lxml вообще?

anonymous
()

Сначала выучить модуль urllib2, чтобы сделать сам запрос, потом уже парсить его с помощью lxml. Советую по этому поводу также выучить XPath и использовать его при парсинге.

Divius ★★
()

всем спасибо

Andaril
() автор топика
Ответ на: комментарий от Andaril

>чтобы сделать поиской запрос и получить страницу с результатами

Делаешь urllib2.urlopen(), передавая ему data, которую ты создал через urllib.urlencode(). Данные - те самые search и type, посмотреть подробнее можно в firebug. В твоём случае search - твой запрос, а type - где искать.

Далее ты делаешь .read() и получаешь кучу html-я, в котором лежат результаты. Натравливаешь на эти данные регэксп, либо парсер (тот же lxml) и выдёргиваешь нужные ссылки.

anonymous
()
Ответ на: комментарий от Andaril

Вот тебе пример -
values = {тут словарь пост данных}
data = urllib.urlencode(values)
result = load_url(url, data)

вот load_url заготовка -
http://p.py6.ru/view/111/

pi11 ★★★★★
()

Я так и не понял что мне делать... Вот строка поисковика:

<input class=«inp_search» type=«text» value=«» name=«search»>

вот обработанные данные:

params = urllib.parse.urlencode({'Пелевин': 0})

осталось только:

f = urllib.request.urlopen(...)

но я не понемаю что туда пихать

Andaril
() автор топика
Ответ на: комментарий от Andaril
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/urllib/request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.2/urllib/request.py", line 364, in open
    req = meth(req)
  File "/usr/lib/python3.2/urllib/request.py", line 1063, in do_request_
    raise TypeError("POST data should be bytes"
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str.
Andaril
() автор топика
Ответ на: комментарий от Andaril

>но я не понемаю что туда пихать

Там всё написано:

http://docs.python.org/library/urllib.html

И, да, раз ты не читаешь документацию и не хочешь думать, то я предлагаю тебе заплатить мне 5$ и получить готовый скрипт, выдающий список ссылок по запросу. За 7$ ты получишь скрипт для питона 2 и 3. За 10$ будут два скрипта + два часа Enterprise-grade E-Mail support по теме этого скрипта.

Предоплата, самовывоз^W

anonymous
()
Ответ на: комментарий от anonymous

Просто очень тяжело читать документацию когда незнаешь что искать. Это некий POST запрос.

#!/usr/bin/python
import urllib.request
import urllib.parse
params = urllib.parse.urlencode({"search" : "Пелевин"})
params = params.encode('utf-8')
f = urllib.request.urlopen("http://tululu.ru/search/", params)
print(f.read().decode('utf-8'))
Traceback (most recent call last):
  File "./lol.py", line 11, in <module>
    print(f.read().decode('utf-8'))
UnicodeDecodeError: 'utf8' codec can't decode byte 0xcf in position 189: invalid continuation byte
Andaril
() автор топика
Ответ на: комментарий от Andaril
#!/usr/bin/python
import urllib.request
import urllib.parse

#params = urllib.parse.urlencode({'Пелевин' : 0 })
params = urllib.parse.urlencode({'search' : 'Пелевин'})
params = params.encode('utf-8')
f = urllib.request.urlopen("http://tululu.ru/search/", params)
print(f.read().decode('windows-1251'))

ошибка

Traceback (most recent call last):
  File "./lol.py", line 8, in <module>
    f = urllib.request.urlopen("http://tululu.ru/search/", params)
  File "/usr/lib/python3.2/urllib/request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.2/urllib/request.py", line 372, in open
    response = meth(req, response)
  File "/usr/lib/python3.2/urllib/request.py", line 484, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.2/urllib/request.py", line 410, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.2/urllib/request.py", line 344, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.2/urllib/request.py", line 492, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 500: Internal Server Error
Andaril
() автор топика
Ответ на: комментарий от Andaril

params = params.encode('utf-8')

s/utf-8/windows-1251

ураааа

Andaril
() автор топика
#!/usr/bin/python
import urllib.request
import urllib.parse
import lxml.html
#params = urllib.parse.urlencode({'Пелевин' : 0 })
params = urllib.parse.urlencode({'value' : 'Пелевин'})
params = params.encode('windows-1251')
f = urllib.request.urlopen("http://tululu.ru/search/", params)
doc = f.read().decode('windows-1251')
print(doc)
html = lxml.html.document_fromstring(doc)
print(html)
for topic in html.cssselect('p.ph3 a'):
    print(topic.text)

вообщем я так и не понял как задать params. Все «работает» но поиского запроса не происходит.

Andaril
() автор топика
Ответ на: комментарий от Andaril

У тебя тяжелый случай, чтобы объяснить либо придется готовый вариант дать, или начать объяснения с основ - протокол http, html формы и т.п.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

я читал как формы работают... нельзя просто скрипт чуть чуть подправить? =) Я просто уже не знаю где искать...

Andaril
() автор топика
Ответ на: комментарий от Andaril

Ну поставь firebug и посмотри какие параметры передаются, или форму посмотри (имена полей).

Вот ты пишешь -
params = urllib.parse.urlencode({'value' : 'Пелевин'})

Там нет поля value, есть поле search. И есть поле тип.
Т.е. можно например так -
params = urllib.parse.urlencode({'search' : 'Пелевин', 'type':'1",})

pi11 ★★★★★
()
Ответ на: комментарий от pi11

врубился... но всеравно ничего не выходит...

#!/usr/bin/python
import urllib.request
import urllib.parse
import lxml.html
#params = urllib.parse.urlencode({'Пелевин' : 0 })
#params = urllib.parse.urlencode({'value' : 'Пелевин'}))
params = urllib.parse.urlencode({"search" : "Пелевин", "type":"1"})
params = params.encode('windows-1251')
f = urllib.request.urlopen("http://tululu.ru/search/", params)
doc = f.read().decode('windows-1251')
print(doc)
html = lxml.html.document_fromstring(doc)
print(html)

for topic in html.cssselect('p.ph3 a'):
    print(topic.text)

вот выхлоп, и нефига...

Andaril
() автор топика
Ответ на: комментарий от Andaril

Ну это уже надо конкрентно смотреть что не работает, может какая нить защита стоит от скриптов, но скорее всего где-нибудь ошибка, подозреваю что в кодировке.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

content=«text/html;charset=windows-1251»

хотя при возврате, запрос прверащается в Пелевин

Andaril
() автор топика
Ответ на: комментарий от Andaril

Нет, это не так. Поиск происходит, не может он вставить символы и возвратить страницу. Где-то ошибка в кодировке, или еще где-то, но мне ее искать не хочется.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

но по идее если я отправляю название на английском то проблемы быть не должно со стартовой страници, то он должен перейти на страницу поиска. Этого не происходит, а текст на английском следовательно не должно быть проблем.

Andaril
() автор топика
Ответ на: комментарий от Andaril

Да он никуда не должен переходить, ты отправляешь запрос на определенную страницу (/search/) и она и должна возвращаться. Как ты там со стартовой пробовал мне не понятно.

pi11 ★★★★★
()
Ответ на: комментарий от Andaril

/search/ это не страница поиска, страница результата.

Andaril
() автор топика
Ответ на: комментарий от pi11

вообщем я был прав в том смысле что он не переходит.

params = urllib.parse.urlencode({«search» : «Alma», «type»:1, «submit» : 1})

выдал результат

Andaril
() автор топика
Ответ на: комментарий от Andaril

>вообщем я был прав в том смысле что он не переходит.

никто никуда и не должен был переходить. ты запрашиваешь страницу, она и должна возвращаться (если там нет редиректа).

Запрос на страницу /search/ же отправлял?

pi11 ★★★★★
()
Ответ на: комментарий от Andaril

Не мучайся и иди спать.

#!/usr/bin/python
import urllib.request
import urllib.parse
import lxml.html

URL = 'http://tululu.ru/search/'
ENCODING = 'windows-1251'

params = urllib.parse.urlencode({
        'search' : 'Пушкин'.encode(ENCODING),
        'type' : 1,
        'submit' : ' искать '.encode(ENCODING)
        })

f = urllib.request.urlopen(URL, bytes(params, encoding=ENCODING))

doc = f.read().decode(ENCODING)
html = lxml.html.document_fromstring(doc)
for a in html.cssselect('p.ph3 a'):
    print('{}, {}'.format(a.text,
                          urllib.parse.urljoin(URL, a.attrib['href'])))
$ python /tmp/test.py
Пушкин Валентин Александрович, http://tululu.ru/a14038/
Пушкин В Г, http://tululu.ru/a14037/
Пушкин Александр Сергеевич, http://tululu.ru/a14036/
anonymous
()
Ответ на: комментарий от anonymous

уже отмучался ^^

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
import urllib.parse
import lxml.html
params = urllib.parse.urlencode({"search" : input().encode('cp1251'), "type":1, "submit" : 1})
params = params.encode('windows-1251')
f = urllib.request.urlopen("http://tululu.ru/search/", params)
doc = f.read().decode('windows-1251')
html = lxml.html.document_fromstring(doc)

for topic in html.cssselect('p.ph3 a'):
    print(topic.text)
Andaril
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.