Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 14, 2010 14:49:48

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Добрый день!

Это мой первый пост на форуме. :)

Я практикуюсь и пишу прогу, которая бы получала запрос оригинального (англоязычного) названия фильма, искала бы его в базе kinopoisk.ru и выдавала бы русское название фильма как результат.

На данный момент пога выглядит примерно так (извините, есть привычка писать комменты на английском):

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib, urllib2, uu

def kpquery (name):
# Supply search data
data = urllib.urlencode({'first' : 'no', 'kp_query' : name})

request = urllib2.Request('http://www.kinopoisk.ru/index.php?', data)

# Won't work without specifying the 'User-Agent' field here
request.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3')

# Open the link
f = urllib2.urlopen(request)
s = f.read()
f.close()

# Decode from cp1251 to utf-8
return s.decode('cp1251').encode('utf-8')

print kpquery ('Batman')
Куда дальше двигаться - вопрос… Парсить через sgmllib?

Заранее спасибо за ответы!



Отредактировано (Июнь 14, 2010 15:25:47)

Офлайн

#2 Июнь 14, 2010 15:19:09

pioner
От:
Зарегистрирован: 2009-10-21
Сообщения: 146
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Странно - вы пользуетесь urllib2, получили страницу и спрашиваете что дальше делать.
Любая работа над строками, которая даст требуемый результат.

Про существующие библиотеки не подскажу, но есть небольшое замечание -
у вас в заголовке указан юзер агент и язык (английский), но страницу вы переводите из cp1251 не зная и не прочитав еще кодировку страницы. Ответ с сайта может прийти в кодировке указанной в заголовках запроса, в том числе и из заголовка юзер-агента. Все от ресурса зависит (от его разработчиков).

Мнение - библиотеки могут не помоч, т.к. страница сайта может содержать невалидный html (xml).

От вас требуется написать валидатор html (xml) и подарить его сообществу :)
Или откопать готовый (серьёзно).



Отредактировано (Июнь 14, 2010 15:20:24)

Офлайн

#3 Июнь 14, 2010 15:24:26

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Спрашиваю потому что хочу понять как кошерно это делать…

pioner
у вас в заголовке указан юзер агент и язык (английский), но страницу вы переводите из cp1251 не зная и не прочитав еще кодировку страницы. Ответ с сайта может прийти в кодировке указанной в заголовках запроса, в том числе и из заголовка юзер-агента. Все от ресурса зависит (от его разработчиков).
Уже подправил сам (кстати, правильно?), а потом прочитал ваше сообщение. :) Проверял уже, не возвращает он в нормальной кодировке, в отличии от, скажем, яндекса. Вы имеете ввиду ‘Accept-Charset’?

P.S. А написанный мной парсер будет очень специфический, ибо будет вытаскивать инфу только с этого сайта. ;)



Отредактировано (Июнь 14, 2010 15:44:52)

Офлайн

#4 Июнь 14, 2010 16:00:10

pioner
От:
Зарегистрирован: 2009-10-21
Сообщения: 146
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

“Проверял уже, не возвращает он в нормальной кодировке” -
сегодня не возвращает, завтра будет возвращать.
Изменится верстка - парсер надо будет перенастраивать т.п.

Сам кинопоиск где инфу берет?



Офлайн

#5 Июнь 14, 2010 16:36:23

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

pioner
“Проверял уже, не возвращает он в нормальной кодировке” -
сегодня не возвращает, завтра будет возвращать.
Изменится верстка - парсер надо будет перенастраивать т.п.
“Ничто не вечно под солнцем” :)
А к чему мне привязываться в коде, где искомое слово, и, тем более, сами теги могут повторяться по нескольку раз, как не к форматированию? Не понял комментария.
pioner
Сам кинопоиск где инфу берет?
Может это база самого кинопоиска? *неуверенно*



Отредактировано (Июнь 14, 2010 20:08:15)

Офлайн

#6 Июнь 14, 2010 19:22:51

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Решил искать своими силами. Сейчас скрипт выглядит вот так:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib, urllib2, uu

def kpquery (name):
# Supply search data
data = urllib.urlencode({'first' : 'no', 'kp_query' : name})

request = urllib2.Request('http://www.kinopoisk.ru/index.php?', data)

# Won't work without specifying the 'User-Agent' field here
request.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3')

# Open the link
f = urllib2.urlopen(request)
s = f.read()
f.close()

# Decode from cp1251 to utf-8
return s.decode('cp1251').encode('utf-8')

searchstring = 'Robocop'

s = kpquery (searchstring)

import re
m = re.search('<font color="#999999">'+searchstring+'</font>', s, re.IGNORECASE)
#print m.start()
print m.group()

m = re.search('<a class="all" href=".*</a>,&nbsp;', s, re.IGNORECASE)
print m.group()
Мы находим строку, содержащую searchstring, при условии что мы знаем какие теги вокруг неё (интересно, есть в python поиск с неполным совпадением?). По поводу второй строки проблема, т.к. вторая строка может быть от другого фильма. В идеале хотелось бы выполнять поиск вверх по тексту от найденного места (строки) до первого совпадения. Возможно это?



Отредактировано (Июнь 14, 2010 20:32:53)

Офлайн

#7 Июнь 14, 2010 20:46:48

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Посетила мысль: при помощи очень хорошего модуля htmldata можно превратить страничку в массив, там отыскать searchstring, а русское название будет скажем searchstring - 2. Завтра попробую.



Офлайн

#8 Июнь 14, 2010 21:57:52

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Парсинг HTML

может быть стоит посмотреть на более “умные” средства для работы с html, например html5lib ?



Офлайн

#9 Июнь 15, 2010 07:28:30

PryGuy
От:
Зарегистрирован: 2010-06-14
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг HTML

Обязательно! Спасибо за совет!!! :)



Офлайн

#10 Июнь 15, 2010 10:38:31

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Парсинг HTML

Да, html5lb с lxml древо-построителем. Потом через xpath любые данные можно легко со странички намайнить.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version