使用Beautiful Soup提取Airtasker许可证号时出现NoneType错误如何解决
错误原因
- 你获取到的页面源码不存在你要定位的
div.sub-text元素,所以pro.find()返回None,调用text属性自然会抛出空对象属性错误,常见有两类原因:- 许可证号属于JS动态渲染内容,你直接用请求工具拿到的是未渲染的初始静态HTML,没有对应元素
- 元素定位规则不准确:
sub-text可能是多元素共用的类名、该元素不是div标签、或者类名是拼接的动态值,静态匹配不到
可行解决方案
方案1:先确认静态页面是否包含目标内容
先打印你请求返回的页面源码,搜索许可证号的实际值:
# 假设你用requests发起请求 import requests from bs4 import BeautifulSoup headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp = requests.get("你的目标页面URL", headers=headers) print(resp.text) # 打印后搜索许可证号文本,能搜到就用静态定位,搜不到就用方案2
如果能搜到,说明是定位规则错误,换精准定位方式即可,比如先定位到许可证号的前置标签,再找相邻元素:
# 示例:先找到包含"许可证号"文本的标签,再找下一个同级的sub-text元素 license_label = pro.find(lambda tag: tag.name == "div" and "许可证号" in tag.text) if license_label: license_num = license_label.find_next_sibling("div", class_="sub-text").text.strip() license_number.append(license_num)
方案2:动态内容用模拟浏览器加载
如果静态源码搜不到目标内容,说明是JS渲染的,用Selenium等工具等待页面加载完成后再提取:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("你的目标页面URL") # 等待sub-text元素加载完成,最多等10秒 try: license_elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.sub-text")) # 或者换更精准的选择器,比如限定父级范围的选择器 ) license_number.append(license_elem.text.strip()) finally: driver.quit()
内容的提问来源于stack exchange,提问作者Meghna Panda
相关产品推荐
相关产品推荐

