如下图,是一个简易的网络python爬虫。进行数据采集。
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def scrape_info(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
time.sleep(1)
soup = BeautifulSoup(response.text, 'html.parser')
# 定位到包含学校信息的表格
table = soup.find('table', class_='score_table')
data = []
for row in table.find_all('tr'):
cols = row.find_all('td')
if len(cols) >= 7:
university = cols[0].text.strip()
province = cols[1].text.strip()
project = cols[2].text.strip()
category = cols[3].text.strip()
subject = cols[4].text.strip()
website = cols[6].find('a')['href']
data.append([university, province, project, category, subject, website])
return data
# 采集第一个网址的数据
url1 = 'http://college.gaokao.com/schlist/a1/'
data1 = scrape_info(url1)
# 采集第二个网址的数据
url2 = 'http://college.gaokao.com/schlist/'
data2 = scrape_info(url2)
# 合并两个数据列表
data = data1 + data2
# 创建 pandas DataFrame 对象
df = pd.DataFrame(data, columns=['University', 'Province', 'Project', 'Category', 'Subject', 'Website'])
# 将 DataFrame 对象保存为 CSV 文件
df.to_csv('university_info.csv', index=False)
# 将 DataFrame 对象保存为 Excel 文件
df.to_excel('university_info.xlsx', index=False)
运行出现如下问题:
Traceback (most recent call last):
File "C:\Users\86138\Desktop\作业1.py", line 33, in <module>
data1 = scrape_info(url1)
File "C:\Users\86138\Desktop\作业1.py", line 18, in scrape_info
for row in table.find_all('tr'):
AttributeError: 'NoneType' object has no attribute 'find_all'
求详细解答方法
for row in table.find_all('tr'):
这里看看是不是table根本没找到
table = soup.find('table', class_='score_table')
这里并没有获取到对应数据
所以建议先把table print出来
print(table)
然后看看打印出了啥。
错误发生的原因就是table = soup.find('table', class_='score_table')这一行没有正确定位到元素,导致table这个对象为None了,所以你下面的代码使用一个None对象去获取数据就会报你这个错误了。
我帮你检查过了,你要爬取的网页上没有class属性为score_table的table,所以你这样写是错误的。
解决方法就是,先明确你要解析什么数据,然后在网页上按F12,查看网页源码,找到你要解析的数据在源码中是什么样的格式,然后再修改代码进行解析。