#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
переменную