使用Python + Selenium导航<div>结构子代的问题

时间:2019-09-13 19:48:42

标签: html python-3.x selenium-webdriver

我正在尝试在父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' &amp;&amp; !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>&nbsp;</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' &amp;&amp; !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' &amp;&amp; !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循环的第一遍工作正常:我获得了modalidadepreco_depreco_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

有人可以帮助我吗?

谢谢。

0 个答案:

没有答案