【问题标题】:How to resolve AttributeError: 'NoneType' object has no attribute 'find'如何解决 AttributeError:'NoneType' 对象没有属性 'find'
【发布时间】:2021-06-30 05:35:14
【问题描述】:

我发现了这段邪恶的代码,我将尝试将它用于一个项目,以从 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)

【问题讨论】:

  • 请同时添加堆栈跟踪。

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


【解决方案1】:

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


让我们更深入:
似乎 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

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2019-03-07
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多