stars_span = each.find_all('p', {'class': 'search_star_line'})[0].span.span AttributeError: 'NoneType' object has no attribute 'span' 如何解决该错误
时间: 2024-01-01 13:06:18 浏览: 46
该错误通常发生在使用 Beautiful Soup 解析 HTML 时,当某些元素不存在时,会返回 NoneType 对象,而非对应的元素对象。因此,当你尝试访问一个不存在的元素的属性时,就会引发这个错误。
为了解决这个问题,你需要在访问元素属性之前,先检查该元素是否存在。你可以使用 Python 的条件语句来实现这一点。例如,你可以使用以下代码来检查 `each.find_all('p', {'class': 'search_star_line'})[0]` 是否返回了一个有效的元素对象:
```
stars_span = each.find_all('p', {'class': 'search_star_line'})
if stars_span:
stars_span = stars_span[0].span.span
else:
# 处理元素不存在的情况
```
这样,如果 `each.find_all('p', {'class': 'search_star_line'})[0]` 返回了一个有效的元素对象,那么 `stars_span` 就会被赋值为该元素的 `span.span` 属性,否则你就可以在 else 语句中处理元素不存在的情况。
相关问题
stars = float(each.find_all('p', {'class': 'search_star_line'})[0].span.span.get('style').split(': ')[-1].strip('%;')) / 20 AttributeError: 'NoneType' object has no attribute 'span' 该错误如何解决
这个错误说明在执行 `each.find_all('p', {'class': 'search_star_line'})[0]` 这一段代码时,返回的结果是 `None`,即没有找到对应的标签。
可能的原因有:
1. 没有找到对应的标签,检查一下 `each` 中是否包含了你要找的标签。
2. 在找到对应的标签之后,`span` 标签或者 `style` 属性可能不存在,需要增加判断语句来避免出现 `AttributeError`。
3. 在使用 `find_all` 方法时,如果没有找到符合条件的标签,返回的是一个空列表,因此在使用 `[0]` 索引时会出现 `IndexError`,需要增加判断语句来避免出现这个错误。
你可以通过增加一些判断语句来避免这个错误,例如:
```python
stars_span = each.find_all('p', {'class': 'search_star_line'})[0].span.span
if stars_span:
style = stars_span.get('style')
if style:
stars = float(style.split(': ')[-1].strip('%;')) / 20
else:
stars = 0
else:
stars = 0
```
这样,如果 `span` 标签或者 `style` 属性不存在,就不会执行相应的代码,避免了出现 `AttributeError`。
from pyspark import SparkConf from pyspark.sql import SparkSession import pyspark.sql.functions as f def data_process(raw_data_path): spark = SparkSession.builder.config(conf=SparkConf()).getOrCreate() business = spark.read.json(raw_data_path) split_col = f.split(business['categories'], ',') business = business.withColumn("categories", split_col).filter(business["city"] != "").dropna() business.createOrReplaceTempView("business") b_etl = spark.sql("SELECT business_id, name, city, state, latitude, longitude, stars, review_count, is_open, categories, attributes FROM business").cache() b_etl.createOrReplaceTempView("b_etl") outlier = spark.sql( "SELECT b1.business_id, SQRT(POWER(b1.latitude - b2.avg_lat, 2) + POWER(b1.longitude - b2.avg_long, 2)) \ as dist FROM b_etl b1 INNER JOIN (SELECT state, AVG(latitude) as avg_lat, AVG(longitude) as avg_long \ FROM b_etl GROUP BY state) b2 ON b1.state = b2.state ORDER BY dist DESC") outlier.createOrReplaceTempView("outlier") joined = spark.sql("SELECT b.* FROM b_etl b INNER JOIN outlier o ON b.business_id = o.business_id WHERE o.dist<10") joined.write.parquet("file:///home/hadoop/wangyingmin/yelp-etl/business_etl", mode="overwrite") if __name__ == "__main__": raw_hdfs_path = 'file:///home/hadoop/wangyingmin/yelp_academic_dataset_business.json' print("Start cleaning raw data!") data_process(raw_hdfs_path) print("Successfully done")注释
这是一段使用 PySpark 进行数据清洗和处理的代码。具体来说,代码包含以下步骤:
1. 创建一个 SparkSession 对象,使用 SparkConf 进行配置。
2. 读取原始数据文件,使用 split 函数对 categories 列进行分割,过滤掉 city 列为空或者为 null 的行。
3. 将处理后的数据保存为一个临时表 business。
4. 从 business 表中选择需要的字段,计算每个州内所有商家的平均经纬度,并根据与平均经纬度的距离进行排序,得到异常值。
5. 将异常值与 business 表进行内连接,得到最终的数据集。
6. 将最终数据集保存为 Parquet 格式文件。
代码中还包含了一些注释,对代码的每个步骤进行了简单的说明。