Я делаю скребок для рецензий киноэксперта. И я сделал этот код с помощью Jupiter Notebook. И я хочу поскрести эту часть. имя эксперта по фильмам

Я старался

soup.find('div', 'reporter_line')

А также

soup.find('dl','p_review')

Но это не работает.

AttributeError: у объекта 'NoneType' нет атрибута 'find_all'

Как я могу исправить этот код для очистки этого текста?

from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import urljoin
import pandas as pd
import requests
import re

#url_base = 'https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=25917&type=after&page=1'
base_url = 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=' #movie title
pages =['158191','47384','52745','91391','179482','38466','141259','182205','56447',
        '86023','88426','66025','130903','120157','132998','97693','121051','158112',
        '93728','99752','37247','37838','105249','61698','73476','49480','34210',
        '74893','113312','122133','35937','114139','134772','88253','37919','45914',
        '144314','75413','171755','37262','35938','116532','68435','154449',
        '41585','47701','34570','145162','157297','179461','42809','104467','144578','66002',
        '142625','137952','86888','64950','180402','164151','134895','52545','130966','129050',
        '79557','50932','164173','70276','44456','129051','74522','122984','37929',
        '124025','167697','85579','38452','146459','45232','76016','123519','46532','163533',
        '146544','174903','63537','25917','108225','164102','136686','93028','63061',
        '54411','161984','106522','53158','179158','88295','52548','52498','109906','39379',
        '48227','130786','177374','69270','34324','124041','38888','34197','73344',
        '125805','118922','81891','35939','31606','67769','130720','136007','34190','99724',
        '120165','62727','48742','98149','142803','39715','30791','36019','159805']

df = pd.DataFrame()
for n in pages:
    # Create url
    url = base_url + n
    res = requests.get(url)
    soup = BeautifulSoup(res.text, "html.parser")
    title = soup.find('h3', 'h_movie')
    for a in title.find_all('a'):
                    #print(a.text)
                    title=a.text
    rname = soup.find('div','reporter_line')
    for a in rname.find_all(('a')['href']):
                    #print(a.text)
                    rname=a.text
    rreview = soup.find('p','tx_report')   
    data = {'title':[title],'rname':[rname], 'rreview':[rreview]}

df.to_csv('./reviewr.csv', sep=',', encoding='utf-8-sig')
1
fairy starlight 29 Окт 2019 в 09:40
Если я правильно помню красивый суп найди, используйте следующие параметры find('dl', attrs={'class': 'p_review'}) docs
 – 
Linh Nguyen
29 Окт 2019 в 09:55
1
title или rname равны None, поэтому вы получаете 'AttributeError: объект' NoneType 'не имеет атрибута' find_all ''. Перед вызовом find_all убедитесь, что rname / title не равны None
 – 
balderman
29 Окт 2019 в 10:13
Я пытался, как вы предлагали, но это не сработало. Ошибок нет, но не было сохранено rname в csv файле.
 – 
fairy starlight
29 Окт 2019 в 10:50
Я попытался открыть URL-адреса, но нет dl или элемента с классом p_review или reporter_line.
 – 
Sers
29 Окт 2019 в 11:24

1 ответ

Title или rname имеют значение None, и поэтому вы получаете объект 'AttributeError: объект' NoneType 'не имеет атрибута' find_all '. Попробуйте это, чтобы вытащить 'reporter_line'

soup.find('div', {'class' : 'reporter_line'})

Если тег заголовка (h3) также имеет «h_movie» в качестве класса, то

soup.find('div', {'class' : 'h_movie'})

Или, если h_movie - это id, используйте:

soup.find(id='h_movie')

Надеюсь, это работает :)

0
Pythaconda 29 Окт 2019 в 11:42
Title = soup.find ('div', {'class': 'reporter_line'})
 – 
fairy starlight
1 Ноя 2019 в 05:26