python - 在 Python 中使用 selenium 从 <li> 项中提取文本

标签 python selenium-webdriver xpath css-selectors webdriverwait

我正在尝试获取嵌套 ul-li 结构中/a 标记内的文本。我找到了所有“li”,但无法获取 a 中的文本。

我正在使用 Python 3.7 和 Selenium webdriver 以及 Firefox 驱动程序。

对应的HTML是:

[some HTML]

<ul class="dropdown-menu inner">
<!---->
    <li nya-bs-option="curso in ctrl.cursos group by curso.grupo" class="nya-bs-option first-in-group group-item">
        <span class="dropdown-header">Cursos em Destaque</span>
        <a tabindex="0">Important TEXT 1</a>
    </li>
    <!-- end nyaBsOption: curso in ctrl.cursos group by curso.grupo -->
    <li nya-bs-option="curso in ctrl.cursos group by curso.grupo" class="nya-bs-option group-item">
        <span class="dropdown-header">Cursos em Destaque</span>
        <a tabindex="0">Important TEXT 2</a>
    </li>
    <!-- end nyaBsOption: curso in ctrl.cursos group by curso.grupo -->
    <li nya-bs-option="curso in ctrl.cursos group by curso.grupo" class="nya-bs-option group-item">
        <span class="dropdown-header">Cursos em Destaque</span>
        <a tabindex="0">Important TEXT 3</a>
    </li>
    <!-- end nyaBsOption: curso in ctrl.cursos group by curso.grupo -->
    <li nya-bs-option="curso in ctrl.cursos group by curso.grupo" class="nya-bs-option group-item">
        <span class="dropdown-header">Cursos em Destaque</span>
        <a tabindex="0">Important TEXT4</a>
    </li>
                            [another 100 <li></li> similar blocks]                  .
                                                .
    <li class="no-search-result" placeholder="Curso">
        <span>Unimportant TEXT</span>
    </li>
</ul>

[more HTML]

我尝试过以下代码:

cursos = browser.find_elements_by_xpath('//li[@nya-bs-option="curso in ctrl.cursos group by curso.grupo"]')
nome_curso = [curso.find_element_by_tag_name('a').text for curso in cursos]

我得到了包含正确数量的项目的列表,但所有这些都 = ''。谁能帮我?谢谢。

最佳答案

看来你已经很接近了。提取文本,例如重要文本 1重要文本 2重要文本 3重要文本4等,您必须诱导>WebDriverWait 以获得所需的 visibility_of_all_elements_ located(),您可以使用以下任一 Locator Strategies :

  • 使用 CSS_SELECTORget_attribute() 方法:

    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "ul.dropdown-menu.inner li.nya-bs-option a")))])
    
  • 使用 XPATHtext 属性:

    print([my_elem.text for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//ul[@class='dropdown-menu inner']//li[contains(@class, 'nya-bs-option')]//a")))])
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

You can find a relevant discussion in How to retrieve the title attribute through Selenium using Python?

<小时/>

片尾

根据文档:

关于python - 在 Python 中使用 selenium 从 <li> 项中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873122/

相关文章:

selenium-webdriver - getAttribute ("value") 返回空值,为什么?

python - 即使我正在迭代行, Selenium 也会选择表中的第一行

javascript - XPath 表达式中的变量

python - Python 3.6 中的名称错误

c# - 如何检查页面是否加载了 Selenium

python - 在运行时从 Swift 应用程序调用脚本(某种语言)

java - 如何使用 selenium webdriver 根据表元素选择表记录

xml - apply-template 可以与慕尼黑分组一起使用而不是 for-each 吗?

python - 为什么填充颜色在 python 图像库中会困惑?

python - 在Python中比较两个列表的子列表