Beautifulsoup - передает переменные в soup.find () - PullRequest
0 голосов
/ 13 декабря 2018
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 »»

1 Ответ

0 голосов
/ 15 декабря 2018

Похоже, вы пытаетесь настроить использование итератора для поиска всех вхождений диапазонов, содержащих эту строку.Вы можете сделать это, если хотите, но лучшим решением было бы передать регулярное выражение, подобное следующему:

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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...