Почему данные «жанра» не записываются в файл .csv в моем коде

#python #python-3.x #csv #web-scraping #beautifulsoup

#python #python-3.x #csv #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь изучить веб-очистку с помощью beautifulsoup, и я реализовал этот код. Но в файл csv записываются только названия фильмов, но не жанр, хотя оба они были извлечены.

URL: http://www.imdb.com/search/title?sort=num_votes ,descamp;start=1amp;title_type=характеристикаamp;год= 1950, 2012

 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 строкой, посмотрите на мой ответ.