Поиск информации на сайте без внешнего модуля

Я создаю программу на Python, в которой вы ищете телешоу/фильм, и на IMDb она дает вам:

Название, год, рейтинг, возрастной рейтинг и синопсис фильма.

Я хочу использовать никаких внешних модулей, только те, которые поставляются с Python 3.4.

Я знаю, что мне придется использовать urllib, но я не знаю, куда идти дальше.

Как бы я это сделал?


person rtharper    schedule 29.03.2014    source источник
comment
Почему произвольные ограничения? Что вы уже пробовали сами? Что вы знаете о парсинге HTML, возможно, вы смотрели, предлагает ли IMDb API?   -  person Martijn Pieters    schedule 29.03.2014
comment
Предоставляет ли IMDB API? перечислены несколько вариантов, где все, что вам нужно сделать, это импортировать модуль json для обработки возвращаемых данных.   -  person Martijn Pieters    schedule 29.03.2014
comment
Я использовал это и прошу пользователя ввести название фильма. Затем я делаю url = urllib.request.urlopen("http://www.omdbapi.com/?t="+title+"&r=XML"), как мне извлечь оттуда информацию?   -  person rtharper    schedule 29.03.2014


Ответы (2)


Это пример, взятый отсюда:

import json
from urllib.parse import quote
from urllib.request import urlopen

def search(title):
    API_URL = "http://www.omdbapi.com/?r=json&s=%s"
    title = title.encode("utf-8")
    url = API_URL % quote(title)
    data = urlopen(url).read().decode("utf-8")
    data = json.loads(data)
    if data.get("Response") == "False":
        print(data.get("Error", "Unknown error"))

    return data.get("Search", [])

Затем вы можете сделать:

>>> search("Idiocracy")
[{'Year': '2006', 'imdbID': 'tt0387808', 'Title': 'Idiocracy'}]
person elyase    schedule 29.03.2014
comment
Вау, спасибо. Когда я пытаюсь заставить пользователя ввести название фильма, я делаю search(movieTitle), информация не загружается. Есть ли способ сделать это? Кроме того, есть ли способ загрузить рейтинг и т. д.? - person rtharper; 29.03.2014
comment
он не загружает информацию?? Какая информация? вы получаете ошибку? - person elyase; 29.03.2014
comment
Он не распечатывает [{'Year': '2006', 'imdbID': 'tt0387808', 'Title': 'Idiocracy'}], когда я позволяю пользователю вводить название фильма - person rtharper; 29.03.2014
comment
Это говорит о том, что в вашем коде есть проблема с приемом пользовательского ввода. - person khagler; 30.03.2014

Это может быть слишком сложно, но: я смотрю на код веб-страницы. Я смотрю, где находится нужная мне информация, а затем извлекаю информацию.

    import urllib.request

def search(title):
    html = urllib.request.urlopen("http://www.imdb.com/find?q="+title).read().decode("utf-8")
    f=html.find("<td class=\"result_text\"> <a href=\"",0)+34
    openlink=""
    while html[f]!="\"":
        openlink+= html[f]
        f+=1
    html = urllib.request.urlopen("http://www.imdb.com"+openlink).read().decode("utf-8")
    f = html.find("<meta property='og:title' content=\"",0)+35
    titleyear=""
    while html[f] !="\"":
        titleyear+=html[f]
        f+=1

    f = html.find("title=\"Users rated this ",0)+24
    rating = ""
    while html[f] !="/":   
        rating+= html[f]
        f+=1

    f=html.find("<meta name=\"description\" content=\"",0)+34
    shortdescription = ""
    while html[f] !="\"":
        shortdescription+=html[f]
        f+=1
    print (titleyear,rating,shortdescription)
    return (titleyear,rating,shortdescription)
search("friends")

Число, добавляемое к f, должно быть правильным, вы считаете длину строки, которую вы ищете, потому что find() возвращает вам позицию первой буквы в строке.

Выглядит плохо, есть ли другой более простой способ сделать это?

person Adam    schedule 29.03.2014