Удалите конкретный дублированный элемент со страницы

#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 с кодом, как я сделал выше, чтобы избежать пометки вашего вопроса как неполного