如何解决 AttributeError: 'NoneType' 对象没有属性 'find'

时间:2021-06-30 05:35:14

标签: python python-3.x web-scraping beautifulsoup

我发现了这段邪恶的代码,我将尝试将其用于从 Spotify 中抓取歌曲数据的项目 - 唯一的问题是这段代码已损坏,可以使用一点点爱。关于为什么我收到错误“AttributeError: 'NoneType' object has no attribute 'find'' for line 36 的任何想法?这是我的代码;

from bs4 import BeautifulSoup
import pandas as pd
import requests
from time import sleep
from datetime import date, timedelta

#create empty arrays for data we're collecting
dates=[]
url_list=[]
final = []

#map site

url = "https://spotifycharts.com/regional/au/weekly"
start_date= date(2016, 12, 29)
end_date= date(2020, 12, 24)

delta= end_date-start_date

for i in range(delta.days+1):
    day = start_date+timedelta(days=i)
    day_string= day.strftime("%Y-%m-%d")
    dates.append(day_string)

def add_url():
    for date in dates:
        c_string = url+date
        url_list.append(c_string)

add_url()

#function for going through each row in each url and finding relevant song info

def song_scrape(x):
    pg = x
    for tr in songs.find("tbody").findAll("tr"):
        artist= tr.find("td", {"class": "chart-table-track"}).find("span").text
        artist= artist.replace("by ","").strip()
  
        title= tr.find("td", {"class": "chart-table-track"}).find("strong").text
 
        songid= tr.find("td", {"class": "chart-table-image"}).find("a").get("href")
        songid= songid.split("track/")[1]
    
        url_date= x.split("daily/")[1]
        
        final.append([title, artist, songid, url_date])
    
#loop through urls to create array of all of our song info

for u in url_list:
    read_pg= requests.get(u)
    sleep(2)
    soup= BeautifulSoup(read_pg.text, "html.parser")
    songs= soup.find("table", {"class":"chart-table"})
    song_scrape(u)
 
#convert to data frame with pandas for easier data manipulation

final_df = pd.DataFrame(final, columns= ["Title", "Artist", "Song ID", "Chart Date"])

#write to csv

with open('spmooddata.csv', 'w') as f:
        final_df.to_csv(f, header= True, index=False)

1 个答案:

答案 0 :(得分:0)

函数 song_scrape 使用外部 songs 参数,在某些情况下为 None,例如无效的 url,或任何不包含正在搜索的特定表格的页面(类图表表格的表格)。
例如,您有一个带有 page-not-found 结果的 url (https://spotifycharts.com/regional/au/weekly2016-12-29),因此搜索表的行返回 None。确实没有 find 属性...
事实上,所有你的网址都是无效的!所以你真正需要做的是修复你的网址列表。


让我们更深入:
spotify 似乎改变了 url 格式,现在使用“从-日期--日期”结构。如果您修复了代码的 url 构建部分,那么这就是让事情重回正轨的第一步。所以对于初学者 -


start_date = date(2021, 1, 8)
end_date = date(2021, 6, 30)

num_of_dates = (end_date - start_date).days // 7

for i in range(num_of_dates):
    start_day = start_date + timedelta(days=i * 7)
    start_day_string = start_day.strftime("%Y-%m-%d")
    end_day = start_date + timedelta(days=(i + 1) * 7)
    end_day_string = end_day.strftime("%Y-%m-%d")
    dates.append('--'.join([start_day_string, end_day_string]))

...给出有效的网址!

但在这一点上,似乎安装了一些安全措施,因为不是加载实际页面,而是指向验证码页面。但这是一个完全不同的问题:-)


注意:在抓取网页之前,值得查看robots.txt文件。
在这种情况下,文件 https://spotifycharts.com/robots.txt 显示 -

<块引用>

用户代理:*
禁止:

因此,抓取 Spotify 应该没有问题。要克服验证码,请尝试查看 python-anticaptch package