Найти - Пользователи
Полная версия: Парсинг HTML
Начало » Python для новичков » Парсинг HTML
1 2
PryGuy
Добрый день!

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

Я практикуюсь и пишу прогу, которая бы получала запрос оригинального (англоязычного) названия фильма, искала бы его в базе 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?

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

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

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

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

P.S. А написанный мной парсер будет очень специфический, ибо будет вытаскивать инфу только с этого сайта. ;)
pioner
“Проверял уже, не возвращает он в нормальной кодировке” -
сегодня не возвращает, завтра будет возвращать.
Изменится верстка - парсер надо будет перенастраивать т.п.

Сам кинопоиск где инфу берет?
PryGuy
pioner
“Проверял уже, не возвращает он в нормальной кодировке” -
сегодня не возвращает, завтра будет возвращать.
Изменится верстка - парсер надо будет перенастраивать т.п.
“Ничто не вечно под солнцем” :)
А к чему мне привязываться в коде, где искомое слово, и, тем более, сами теги могут повторяться по нескольку раз, как не к форматированию? Не понял комментария.
pioner
Сам кинопоиск где инфу берет?
Может это база самого кинопоиска? *неуверенно*
PryGuy
Решил искать своими силами. Сейчас скрипт выглядит вот так:
#!/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 поиск с неполным совпадением?). По поводу второй строки проблема, т.к. вторая строка может быть от другого фильма. В идеале хотелось бы выполнять поиск вверх по тексту от найденного места (строки) до первого совпадения. Возможно это?
PryGuy
Посетила мысль: при помощи очень хорошего модуля htmldata можно превратить страничку в массив, там отыскать searchstring, а русское название будет скажем searchstring - 2. Завтра попробую.
cutwater
может быть стоит посмотреть на более “умные” средства для работы с html, например html5lib ?
PryGuy
Обязательно! Спасибо за совет!!! :)
Александр Кошелев
Да, html5lb с lxml древо-построителем. Потом через xpath любые данные можно легко со странички намайнить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB