#python #python-3.x #csv #web-scraping #beautifulsoup
#python #python-3.x #csv #очистка веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь изучить веб-очистку с помощью beautifulsoup, и я реализовал этот код. Но в файл csv записываются только названия фильмов, но не жанр, хотя оба они были извлечены.
f = csv.writer(open('movie-names.csv', 'w'))
f.writerow(['Title', 'Genre'])
pages = []
genre;
for i in range(1,2):
url = 'http://www.imdb.com/search/title?sort=num_votes,descamp;start=1amp;title_type=featureamp;year=1950,2012'
pages.append(url)
for item in pages:
page = requests.get(item)
soup = BeautifulSoup(page.text, 'html.parser')
movie_titles = soup.find_all(class_ = 'lister-item-content')
for movie_title in movie_titles:
title = movie_title.find('a').contents[0]
genre = movie_title.find_all(class_ = 'genre')[0].get_text()
print(genre)
f.writerow([title, genre])
Комментарии:
1.
genre;
В начале вашего кода опечатка?
Ответ №1:
Использовать pandas
его намного проще для экспорта данных CSV
.
from bs4 import BeautifulSoup
import requests
import pandas as pd
pages = []
for i in range(1,2):
url = 'http://www.imdb.com/search/title?sort=num_votes,descamp;start=1amp;title_type=featureamp;year=1950,2012'
pages.append(url)
Movie_title=[]
Movie_genre=[]
for item in pages:
page = requests.get(item)
soup = BeautifulSoup(page.text, 'html.parser')
movie_titles = soup.select('.lister-item-content')
for movie_title in movie_titles:
title = movie_title.select_one('a').text
Movie_title.append(title)
genre = movie_title.select_one('.genre').text.replace('n','')
Movie_genre.append(genre)
df = pd.DataFrame({"Movie_title":Movie_title,"Movie_genre":Movie_genre})
df.to_csv("movie-names.csv",index=False)
Вывод:
Комментарии:
1. Большое спасибо!! Это работает, но все еще не могу понять, почему другая реализация не сработала для меня. Возможно, разница в версиях?
Ответ №2:
Это должно сработать:
import requests
from bs4 import BeautifulSoup
import csv
with open("movie-names.csv", "w") as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Genre'])
pages = []
genre = []
for i in range(1,2):
url = 'http://www.imdb.com/search/title?sort=num_votes,descamp;start=1amp;title_type=featureamp;year=1950,2012'
pages.append(url)
for item in pages:
page = requests.get(item)
soup = BeautifulSoup(page.text, 'html.parser')
movie_titles = soup.find_all(class_ = 'lister-item-content')
for movie_title in movie_titles:
title = movie_title.find('a').contents[0]
genre = movie_title.find_all(class_ = 'genre')[0].get_text()
print(title, genre)
writer.writerow([title, genre])
Это выдержка из содержимого в файле .csv, который я получаю при запуске кода:
Title Genre
The Shawshank Redemption Drama
The Dark Knight Action, Crime, Drama
Inception Action, Adventure, Sci-Fi
Fight Club Drama
Pulp Fiction Crime, Drama
Forrest Gump Drama, Romance
Обратите внимание, что этот цикл for:
for i in range(1,2):
url = 'http://www.imdb.com/search/title?sort=num_votes,descamp;start=1amp;title_type=featureamp;year=1950,2012'
pages.append(url)
будет бесполезно, так как в этом случае добавьте только один URL. В общем случае, где 2
есть n
, он добавляет одни и те же URL n-1
-адреса. Это ваше намерение?
Комментарии:
1. К сожалению, нет. Проблема по-прежнему сохраняется : (
2. Я получаю csv с двумя столбцами и 51 строкой, посмотрите на мой ответ.