2015-02-05 4 views
0

Я хочу получить фильм, год, рейтинг, жанры и время работы пяти фильмов со страницы html, указанной в коде. Они находятся в строках таблицы, называемых результатами.Скремблирование html страницы

from bs4 import BeautifulSoup 
import urllib2 

def read_from_url(url, num_m=5): 
    html_string = urllib2.urlopen(url) 
    soup = BeautifulSoup(html_string) 
    movie_table = soup.find('table', 'results') # table of movie 
    list_movies = [] 
    count = 0 
    for row in movie_table.find_all("tr"): 
     dict_each_movie = {} 
     title = title.encode("ascii", "ignore") # getting title 
     dict_each_movie["title"] = title 
     year = year.encode("ascii","ignore")  # getting year 
     dict_each_movie["year"] = year 
     rank = rank.encode("ascii","ignore")  # getting rank 
     dict_each_movie["rank"] = rank 
     # genres = [] # getting genres of a movie 
     runtime = runtime.encode("ascii","ignore")  # getting rank 
     dict_each_movie["runtime"] = runtime 
     list_movies.append(dict_each_movie) 
     count+=1 
     if count==num_of_m: 
      break 
    return list_movies 

print read_from_url('http://www.imdb.com/search/title?at=0&sort=user_rating&start=1&title_type=feature&year=2005,2015',2) 

Ожидаемый результат:

[{'rating': '10.0', 'genres': ['Comedy', 'Family'], 'title': 'How to Beat a Bully', 'rank': '1', 'year': '2014', 'runtime': '90'},..........] 
+0

Что такое титул в 'title = title.encode (" ascii "," ignore ")'? –

ответ

1

Вы к переменной, которая не была объявлена. Когда интерпретатор видит title.encode("ascii", "ignore"), он ищет переменную title, которая не была объявлена ​​ранее. Python не может знать, что такое title, поэтому вы не можете позвонить encode на нем. То же самое касается года и звания. Вместо этого используйте:

title = 'How to Beat a Bully'.encode('ascii','ignore') 
+0

@ runDosrun, как автоматизировать это? Должен ли я жестко кодировать заголовок, год, время запуска и т. Д.? – Alph

+0

В ответе на вашу ошибку. Чтобы достичь вашей цели, вам придется больше узнать о некоторых основах, которых я боюсь, см., Например, http://www.jayrambhia.com/blog/fetch-movie-details-from-imdb-using-python-with-proxy/ – runDOSrun

+0

@runDosun. Я прочитал документацию о прекрасном супе и ссылку, которую вы указали в комментарии. В примере используется soup.find для получения заголовка. В моем случае заголовок находится в таблице результатов (для каждого фильма) после проверки элемента первого фильма Страницы Forsaken. Есть ли способ получить это название (The Forsaken Pages). – Alph

1

Почему так ???

Сделайте свою жизнь проще с помощью CSS-селекторов.

<table> 
<tr class="my_class"> 
    <td id="id_here"> 

    <a href = "link_here"/>First Link</a> 

    </td> 
    <td id="id_here"> 

    <a href = "link_here"/>Second Link</a> 

    </td> 
</tr> 
</table> 

    for tr in movie_table.select("tr.my_class"): 
      for td in tr.select("td#id_here"): 
       print("Link " + td.select("a")[0]["href"]) 
       print("Text "+ td.select("a")[0].text) 
Смежные вопросы