【问题标题】:Beautifulsoup - Pass variables in soup.find()Beautifulsoup - 在 soup.find() 中传递变量
【发布时间】:2018-12-15 08:32:49
【问题描述】:
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' object has no attribute 'get_text'”

【问题讨论】:

  • 不要调用你的变量dict,它会覆盖Python内置的dict
  • 好吧,我把它改成 dict1,它仍然显示同样的错误.. 感谢您指出这一点!
  • 这很可能是因为您的原始字符串有l35,如字母l,而不是整数135的字符串表示形式
  • 啊……我太傻了……谢谢你指出来……!!
  • 你的第一个代码也出错了吗?如果是这样,那是因为汤不包含您要查找的跨度。如果不是,那么您需要将 i 编辑为 35,而不是 135,然后将 l 放回 'dlROA_ct',因此它是 'dlROA_ctl'

标签: python beautifulsoup


【解决方案1】:

您似乎正在尝试设置为使用迭代器来查找包含该字符串的所有跨度的出现。如果您愿意,可以这样做,但更好的解决方案是传入如下正则表达式:

import re

results = soup.find_all('span', {'id': re.compile('dlROA_ctl\d+_lblROALINE')})
for result in results:
    print(result.get_text())

关于正则表达式的快速参考,我推荐https://regex101.com

回答你实际提出的问题:

您收到属性错误的原因不是因为代码没有正确接受您的变量,而是因为您正在转向汤的源代码不包含您指定的标签。

为了避免得到你得到的属性错误,你可以改为执行以下操作:

i = 35
idstring = 'dlROA_ctl'+str(i)+'_lblROALINE'
dict1 = {'id': idstring}
result = soup.find('span', dict1)
if result:
    print(result.get_text())
else:
    print('no result found')

如果您仍然没有找到任何结果,您可能会认为汤不是您认为的那样,并且可能想查看soup.prettify()

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 2015-06-10
    • 1970-01-01
    • 2020-08-10
    • 2013-12-25
    • 2017-05-22
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多