我正在尝试在父div的div结构内获取一些信息。
我正在Windows 10计算机上使用Eclipse + Python 3.7,Selenium WebDriver和Firefox驱动程序。
我试图浏览的HTML是:
[some HTML]
<div id="slider-propostas">
<!---->
<div class="item" ng-repeat="modalidade in ctrl.escolha.ListaModalidades | filter: query as total" modalidade="modalidade" inscrever="ctrl.escolhaModalidade" turno-changed="ctrl.turnoChanged">
<div class="col-md-4 min-padding">
<div class="panel">
<span ng-hide="ctrl.turno.DescontoPercentual === 0" class="tag-desconto desconto-30">-50%</span>
<div class="panel-heading">
<p>Presencial</p>
<!---->
<span ng-if="ctrl.modalidade.CodModalidade === 'P'" class="" style="">Maior convivência no mundo universitário, com uma pequena carga horária online de até 20%.</span>
<!---->
<!---->
<!---->
<br>
<br>
<div class="form-group">
<select class="form-control ng-pristine ng-untouched ng-valid ng-not-empty" ng-model="ctrl.turno" ng-init="ctrl.turno = ctrl.turno || ctrl.modalidade.turnos[0]" ng-change="ctrl.turnoChanged()(ctrl.turno)" ng-options="turno as turno.NomeTurno for turno in ctrl.modalidade.turnos | orderBy: 'CodTurno' track by turno.CodTurno" bs-validation="" style="">
<option label="NOITE" value="3" selected="selected">NOITE</option>
</select>
</div>
</div>
<div class="panel-body">
<p class="valor-old" ng-hide="ctrl.turno.DescontoPercentual === 0">
<span>De: R$ 1.099,84</span> Por:</p>
<p class="valor-new">
<span>R$</span> 549,92</p>
<p class="formas-pagamento" ng-show="ctrl.modalidade.CodModalidade === 'P' && !ctrl.turno.SemPAR">
<button type="button" class="btn" data-toggle="modal" data-target="#modalParcelamento">Veja formas de parcelamento <span>+</span>
</button>
</p>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-primary btn-block" ng-click="ctrl.inscreverClicked()" plugin-scroll-to=".formulario">Inscreva-se!</button>
</div>
</div>
</div>
</div>
<!---->
<div class="item" ng-repeat="modalidade in ctrl.escolha.ListaModalidades | filter: query as total" modalidade="modalidade" inscrever="ctrl.escolhaModalidade" turno-changed="ctrl.turnoChanged">
<div class="col-md-4 min-padding">
<div class="panel">
<span ng-hide="ctrl.turno.DescontoPercentual === 0" class="tag-desconto desconto-30">-50%</span>
<div class="panel-heading">
<p>A distância</p>
<!---->
<!---->
<span ng-if="ctrl.modalidade.CodModalidade === 'D'" class="" style="">Flexibilidade para estudar onde e quando quiser, com aulas 100% online.<i class="hidden-xs hidden-sm">
<br> </i>
</span>
<!---->
<!---->
<br>
<br>
<div class="form-group">
<select class="form-control ng-pristine ng-untouched ng-valid ng-not-empty" ng-model="ctrl.turno" ng-init="ctrl.turno = ctrl.turno || ctrl.modalidade.turnos[0]" ng-change="ctrl.turnoChanged()(ctrl.turno)" ng-options="turno as turno.NomeTurno for turno in ctrl.modalidade.turnos | orderBy: 'CodTurno' track by turno.CodTurno" bs-validation="" style="">
<option label="VIRTUAL" value="9" selected="selected">VIRTUAL</option>
</select>
</div>
</div>
<div class="panel-body">
<p class="valor-old" ng-hide="ctrl.turno.DescontoPercentual === 0">
<span>De: R$ 442,71</span> Por:</p>
<p class="valor-new">
<span>R$</span> 221,36</p>
<p class="formas-pagamento ng-hide" ng-show="ctrl.modalidade.CodModalidade === 'P' && !ctrl.turno.SemPAR" style="">
<button type="button" class="btn" data-toggle="modal" data-target="#modalParcelamento">Veja formas de parcelamento <span>+</span>
</button>
</p>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-primary btn-block" ng-click="ctrl.inscreverClicked()" plugin-scroll-to=".formulario">Inscreva-se!</button>
</div>
</div>
</div>
</div>
<!---->
<div class="item" ng-repeat="modalidade in ctrl.escolha.ListaModalidades | filter: query as total" modalidade="modalidade" inscrever="ctrl.escolhaModalidade" turno-changed="ctrl.turnoChanged">
<div class="col-md-4 min-padding">
<div class="panel">
<span ng-hide="ctrl.turno.DescontoPercentual === 0" class="tag-desconto desconto-30">-50%</span>
<div class="panel-heading">
<p>Flex</p>
<!---->
<!---->
<!---->
<span ng-if="ctrl.modalidade.CodModalidade === 'S'" class="" style="">Flexibilidade que une conteúdo até 100% online à aulas ou experiências práticas presenciais.</span>
<!---->
<br>
<br>
<div class="form-group">
<select class="form-control ng-pristine ng-untouched ng-valid ng-not-empty" ng-model="ctrl.turno" ng-init="ctrl.turno = ctrl.turno || ctrl.modalidade.turnos[0]" ng-change="ctrl.turnoChanged()(ctrl.turno)" ng-options="turno as turno.NomeTurno for turno in ctrl.modalidade.turnos | orderBy: 'CodTurno' track by turno.CodTurno" bs-validation="" style="">
<option label="NOITE" value="3" selected="selected">NOITE</option>
</select>
</div>
</div>
<div class="panel-body">
<p class="valor-old" ng-hide="ctrl.turno.DescontoPercentual === 0">
<span>De: R$ 642,71</span> Por:</p>
<p class="valor-new">
<span>R$</span> 321,36</p>
<p class="formas-pagamento ng-hide" ng-show="ctrl.modalidade.CodModalidade === 'P' && !ctrl.turno.SemPAR" style="">
<button type="button" class="btn" data-toggle="modal" data-target="#modalParcelamento">Veja formas de parcelamento <span>+</span>
</button>
</p>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-primary btn-block" ng-click="ctrl.inscreverClicked()" plugin-scroll-to=".formulario">Inscreva-se!</button>
</div>
</div>
</div>
</div>
<!---->
</div>
[more HTML]
Python代码是:
[some code]
WebDriverWait(browser, 10).until(ec.presence_of_element_located((By.XPATH, '//div[@id="slider-propostas"]')))
slider_propostas = browser.find_element_by_xpath('//div[@id="slider-propostas"]')
panel_headings = slider_propostas.find_elements_by_xpath('//div[@class="panel-heading"]')
for panel_heading in panel_headings:
try:
modalidade = panel_heading.find_element_by_tag_name('p').text
drop_list_turnos = panel_heading.find_element_by_xpath('//select[contains(@class, "form-control ng-pristine ng-untouched")]')
turnos = [x.text for x in drop_list_turnos.find_elements_by_tag_name('option')] #.get_attribute('innerHTML')]
turnos = list(dict.fromkeys(turnos))
except:
turnos = []
for turno in turnos:
drop_list_turnos.click()
drop_list_turnos.send_keys(turno + Keys.RETURN)
panel_body = WebDriverWait(browser, 10).until(ec.presence_of_element_located((By.XPATH, '//div[@class="panel-body"]')))
panel_body.location_once_scrolled_into_view
preco_de = panel_body.find_element_by_xpath('//p[@class="valor-old"]').text
preco_por = panel_body.find_element_by_xpath('//p[@class="valor-new"]').text
我正确地获得了slider_propostas
,但是当我尝试在panel_headings
中获得panel_headings = slider_propostas.find_elements_by_xpath('//div[@class="panel-heading"]')
时,尽管父div(slider-propostas
)只有3,但是它返回了4个项目。 / p>
外部for
循环的第一遍工作正常:我获得了modalidade
,preco_de
和preco_por
的正确值(“ Presencial”,“ De:R $ 1.099,84 Por:”和“ R $ 549,92”)。
在第二遍中,当我尝试获取panel_headings
中的第二个元素时,它返回modalidade
的正确值(“ Adistância”),但返回{{1}的相同值}和preco_de
,就像上一个遍历一样(分别为“ De:R $ 1.099,84 Por:”和“ R $ 549,92”)。
我只是看不出代码为什么是这样的:(1)为preco_por
而不是3获得4个项目,并且(2)不移至下一个panel_headings
。
有人可以帮助我吗?
谢谢。