小能豆

Beautifulsoup - 在 soup.find() 中传递变量

py

result = soup.find('span', {'id': 'dlROA_ctl35_lblROALINE'}).get_text()

我想通过使用变量使其动态化来做与上述相同的事情。我正在使用以下代码,但它不起作用:

i = 135
idstring = 'dlROA_ct'+str(i)+'_lblROALINE'
dict1 = {'id': idstring}
result = soup.find('span', dict1).get_text()

我收到错误:“AttributeError:’NoneType’ 对象没有属性 ‘get_text’”


阅读 19

收藏
2025-01-14

共1个答案

小能豆

你的代码的逻辑是正确的,但你收到 AttributeError 的原因是 soup.find 返回了 None,表明它没有找到与指定条件匹配的 <span> 元素。这里有几个可能的原因和解决办法:


可能原因和解决方法

  1. ID 不存在于 HTML 中
  2. 确保在你的 HTML 页面中确实存在一个 id 值为 dlROA_ct135_lblROALINE<span> 元素。如果 HTML 中没有此元素,soup.find 会返回 None
  3. 验证:打印生成的 idstring 和整个 HTML 文档的一部分,确保 id 是否正确并且元素是否存在。
    py print(idstring) print(soup.prettify()) # 或者只打印相关部分的 HTML

  4. HTML 内容未正确加载

  5. 确保 soup 是用有效的 HTML 初始化的。例如,如果 HTML 是动态加载的,你需要使用像 Selenium 或 Playwright 这样的工具来加载完整的页面。
  6. 解决方法:打印 soup.prettify(),查看 HTML 内容是否完整。

  7. ID 的格式问题

  8. 如果 HTML 使用的 id 格式不完全符合预期,生成的 idstring 可能与实际 id 不匹配。例如,可能有额外的空格或不同的拼写。
  9. 验证:检查 idstring 和实际 HTML 内容的 id 是否完全一致。
    py print(f"Generated ID: {idstring}")

  10. .find 找不到匹配的元素

  11. 如果 soup.find 确实找不到任何匹配的 <span>,你可以先检查返回值是否为 None,以避免 AttributeError
    py result_element = soup.find('span', {'id': idstring}) if result_element is None: print(f"No element found for id: {idstring}") else: result = result_element.get_text() print(result)

调试后优化代码

如果你已经确认 HTML 是正确的,并且 id 符合格式,但仍然无法找到匹配的 <span>,可能需要进一步处理 HTML 或动态 ID。例如:

动态生成 ID 并验证

i = 135
idstring = f'dlROA_ct{i}_lblROALINE'  # 使用 f-string 更简洁
dict1 = {'id': idstring}
result_element = soup.find('span', dict1)
if result_element:
    result = result_element.get_text()
    print(result)
else:
    print(f"Element with id {idstring} not found.")

确认 HTML 的部分存在目标 ID

if 'dlROA_ct135_lblROALINE' in soup.prettify():
    print("ID is present in the HTML.")
else:
    print("ID not found in the HTML.")

如果 HTML 是动态加载的

考虑使用工具如 Selenium 来获取完整的页面内容:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()  # 或其他 WebDriver
driver.get('https://example.com')  # 替换为实际 URL
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

# 继续使用你的代码

总结

  • 确认 idstring 的格式是否正确,与实际 HTML 一致。
  • 确保 HTML 加载完成并包含目标元素。
  • 检查 soup.find 返回的值是否为 None,以避免直接调用 .get_text()
  • 如果问题仍未解决,可以打印相关的 HTML 和变量,逐步调试。
2025-01-14