#python #html #beautifulsoup
Вопрос:
у меня возникли некоторые проблемы при очистке этого:
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa">
Перед этой строкой я обнаружил, что уже есть 4 одинаковых, но с разными значениями токенов, как я могу очистить 5-й из 6 с помощью beautifulsoup?
К сожалению, я не могу предоставить примеры кода или веб-сайта, так как я работаю над частным проектом, прежде чем отмечать мой вопрос как неполный, пожалуйста, задайте несколько вопросов, тай!
Комментарии:
1. используйте
find_all
(илиfindAll
) метод, он возвращает список, затем просто используйте индекс, также вы можете предоставить меньший образец html с кодом для этого небольшого образца, просто в основном напишите html только для этих 6 или любых других входных тегов и предоставьте код для этого html — документа2. @Matiiss не могли бы вы, пожалуйста, оставить фрагмент? никогда не использовал функцию find_all
3. это то же
.find()
самое, что и за исключением того, что он возвращает список всех найденных совпадающих тегов, а не только первый, просто используйте его так же, как вы используете.find()
, и распечатайте результат, это должен быть список, затем просто используйте индексы
Ответ №1:
Вы можете получить 5-й <input>
тег двумя способами.
- Использование
select_one()
— Выберите 5-й<input>
тегx = soup.select_one('input:nth-of-type(5)')
- Использование
find_all()
атрибутомname
— Возвращает список совпадающих<input>
тегов.y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
Если у вас есть только эти 6
<input>
тегов во всем HTML, используйтеselect_one()
.
Если у вас есть другие
<input>
теги, кроме этих 6, то вам нужно специально выбрать нужные вам входные теги, поэтому вам нужно отфильтровать входные теги с помощью атрибутаname = __RequestVerificationToken
. Воспользуйсяfind_all()
.
Этот код выведет значение 5-го входного тега с помощью select_one()
и find_all()
.
from bs4 import BeautifulSoup
s = '''
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa1">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa2">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa3">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa4">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa6">
'''
soup = BeautifulSoup(s, 'lxml')
# Using select_one()
x = soup.select_one('input:nth-of-type(5)')
print(x)
print(x['value'])
# Using find_all()
y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
print(y)
print(y['value'])
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5
Комментарии:
1. продолжайте получать следующее: Произошло исключение : индекс списка вне диапазона повторяется через 3 секунды…
Ответ №2:
Метод find_all() просматривает потомков тега и извлекает всех потомков, которые соответствуют вашим фильтрам, и возвращает результат в виде списка. вы можете прочитать документацию по прекрасному супу по этой ссылке для получения дополнительной информации.
Чтобы найти 5-й элемент в вашем коде, выполните следующие действия:
from bs4 import BeautifulSoup
html = '''
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa">
<input name="__RequestVerificationToken" type="hidden" value="aba-token-aba">
<input name="__RequestVerificationToken" type="hidden" value="aca-token-aca">
<input name="__RequestVerificationToken" type="hidden" value="ada-token-ada">
<input name="__RequestVerificationToken" type="hidden" value="aea-token-aea">
<input name="__RequestVerificationToken" type="hidden" value="afa-token-afa">
'''
soup = BeautifulSoup(html, "html.parser")
element = soup.find_all("input")
print(element[4])
print(element[4]["value"])
Результат :
<input name="__RequestVerificationToken" type="hidden" value="aea-token-aea"/>
aea-token-aea
Старайтесь всегда предоставлять меньший образец HTML с кодом, как я сделал выше, чтобы избежать пометки вашего вопроса как неполного