【问题标题】:Python selenium to extract elements with xpath and for loopPython selenium 使用 xpath 和 for 循环提取元素
【发布时间】:2021-05-02 15:49:57
【问题描述】:

我正在使用 Python/Selenium 从网站中提取一些文本,以便在 Google 表格中进一步对其进行排序。

我需要为 15 个标题提取文本。该文本位于标签 h5 中的每个标题下。

这是一个标题的摘录:

<tr class="dayHeader">
 <td colspan="7" style="padding:10px 0;">
  <hr>
  <h5>&nbsp;&nbsp;Tuesday - 02 February 2021</h5>
 </td>
</tr>

我所做的如下:

headers = driver.find_elements_by_tag_name('h5')
results = []

for header in headers:
    result = header.text
    results.append(result)

我更喜欢通过这个标签上方的类从 h5 中获取文本,如下所示:

headers = driver.find_element(By.XPATH,"//tr[@class='dayHeader']/h5")

并将其添加到提到的 for 循环中,但我似乎无法让这条线工作。我该怎么做?

【问题讨论】:

  • 如果您只希望tr 元素中的h5 元素具有dayHeader 类,那么您可以使用//tr[@class='dayHeader']/descendant::h5。
  • 您面临的问题是什么?

标签: python for-loop selenium-webdriver web-scraping xpath


【解决方案1】:

试试这个方法:

headers = [h.text for h in driver.find_elements(By.XPATH,"//tr[@class='dayHeader']/td/h5")]

这是一种用于提取元素并将文本值提取到列表的单行代码。

【讨论】:

    【解决方案2】:

    你快到了。 中的 / 表示第一个孩子。但是&lt;h5&gt; 不是//tr[@class='dayHeader'] 的第一个孩子。


    解决方案

    您需要将单个正斜杠(即/)替换为双正斜杠(即//),这将表示后代。所以你的有效代码行将是:

    print([my_elem.text for my_elem in driver.find_elements(By.XPATH, "//tr[@class='dayHeader']//h5")])
    

    理想情况下,您需要为visibility_of_all_elements_located() 诱导WebDriverWait,您可以使用以下Locator Strategy:

    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//tr[@class='dayHeader']//h5")))])
    

    【讨论】:

    • 优秀。感谢您的详细回复,它非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2021-10-16
    • 2018-12-14
    • 2021-01-23
    • 2021-12-05
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多