Проверьте, есть ли ::after на очищенном веб-сайте

#python #html #selenium #web-scraping #beautifulsoup

#python #HTML #селен #очистка веб-страниц #beautifulsoup

Вопрос:

У меня есть веб-сайт со следующим html, который описывает флажок:

 html = 
<div class="checkbox checkbox-success checkbox-block">
    <input type="checkbox" data-false-value="'0'" data-true-value="'1'" 
    id="cover42" data-change="calculateOfferThree()" data- 
    model="result.formuladb.Wrapper.cover42_protection.value">
    <label for="cover42" class="form-labels ng-binding"> 
    ::before 
    "Cover 42 protection" 
    ::after
    </label>
</div>
  

Когда флажок установлен, я получаю ‘::after’ в моем html, если он снят, его там нет. К сожалению, это, кажется, единственное, что меняется.
Теперь я хочу выяснить, установлен ли флажок или нет.
Я думаю, что самый простой способ — получить все внутри и проверить, есть ли в нем ‘::after’.

Итак, я попытался:

 from bs4 import BeautifulSoup
import selenium

# I open the website with the html mentioned above via selenium webbrowser
page_content = driver.page_source
soup = (page_content, 'html.parser')
  

Но когда я смотрю на суп, ‘::after’ и ‘::before’ там нет…
У кого-нибудь есть идея, как я могу узнать, отмечен ли флажок или нет?

Редактировать: Ok ::after/::before уже отсутствует в строке выше:

page_content = driver.page_source

Это означает, что ответы пока не помогают (по крайней мере, не на первом шаге)

Ответ №1:

Просто получите текст внутри div тега и проверьте, содержит ли текст ::after . Вот как вы это делаете:

 from bs4 import BeautifulSoup

html = """
<div class="checkbox checkbox-success checkbox-block">
    <input type="checkbox" data-false-value="'0'" data-true-value="'1'" 
    id="cover42" data-change="calculateOfferThree()" data- 
    model="result.formuladb.Wrapper.cover42_protection.value">
    <label for="cover42" class="form-labels ng-binding"> 
    ::before 
    "Cover 42 protection" 
    ::after
    </label>
</div>
"""
soup = BeautifulSoup(html,'html5lib')

div = soup.find('div', class_ = "checkbox checkbox-success checkbox-block")

txt = div.text.replace(" ","").strip()

if "::after" in txt:
    print("Checked")
  

Вывод:

 Checked
  

Ответ №2:

Если вы не хотите иметь ::after , и ::before вы можете выполнить проверку, например:

 # no class selectors you can add it because this is the only div shown
myDiv = soup.find("div")
checked = False
for x in ["::after","::before"]:
  if x in myDiv.text.strip():
    checked = True
  

Получить checked переменную