Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Получение значения аттрибута “name” тэга “input”

#python #парсер #beautiful_soup


Как получить значение атрибута name всех тэгов input ?

То есть если был тэг




то  в массиве должно быть только значение "value".
Я знаю, что для div'a это можно сделать так:

titles = [div['title'] for div in soup.find_all('div', title = True)]


Но если пробую просто заменить все div на input, а title на name, то сталкиваюсь
с проблемой, что input - зарезервированное слово (возможно, проблема не в этом, но
все равно ничего не работает)
    


Ответы

Ответ 1



Попробуйте: input_names = [tag['name'] for tag in soup.select('input[name]')] Проверка: import requests from bs4 import BeautifulSoup rs = requests.get('https://ru.stackoverflow.com/questions/830858/') root = BeautifulSoup(rs.content, 'html.parser') input_names = [tag['name'] for tag in root.select('input[name]')] print(input_names) # ['q', '_id_', 'qualityBanWarningShown', 'referrer', ...

Ответ 2



если пробую просто заменить все div на input, а title на name, то сталкиваюсь с проблемой, что input - зарезервированное слово Этой проблемы точно нет: >>> import bs4 >>> soup = bs4.BeautifulSoup('', 'html.parser') >>> [input['name'] for input in soup.find_all('input')] ['value'] Хотя input и является встроенным именем, поэтому не рекомендуется его использовать для своих целей, чтобы путаницу не вводить, но локально (как в примере с listcomp) читаемость от использования input не уменьшается. Всегда можно другое имя использовать, если хочется: >>> [tag['name'] for tag in soup.find_all('input')] ['value'] Можно вообще без временных имён обойтись: >>> from operator import itemgetter >>> list(map(itemgetter('name'), soup.find_all('input'))) ['value'] Вы вероятно наткнулись на ошибку с использованием name параметра: >>> soup.find_all('input', name=True) # XXX broken Traceback (most recent call last): File "", line 1, in TypeError: find_all() got multiple values for argument 'name' find_all() got multiple values for argument 'name' ошибка из-за того, что name='input' и name=True передаются в find_all() одновременно. Это легко обойти: >>> soup.find_all('input', dict(name=True)) [] или для читаемости: >>> soup.find_all('input', attrs=dict(name=True)) [] Если вы знакомы с CSS selectors, то можно как @gil9red предложил: >>> soup.select('input[name]') []

Комментариев нет:

Отправить комментарий