Python 如何使用xpath和selenium在两个h标记之间选择元素

Python 如何使用xpath和selenium在两个h标记之间选择元素,python,selenium-webdriver,xpath,css-selectors,webdriverwait,Python,Selenium Webdriver,Xpath,Css Selectors,Webdriverwait,我正在努力刮这个 但是看到它的元素,我对如何提取位于两个h3标签之间的数据感到困惑。h3标记元素包含国家名称。在下一个h3标签(使用另一个国家名称)之前,有些帖子包含截止日期文本和与该截止日期相关的文件链接。事实上,它们中的每一个都是针对该国发布的商业投标机会 检查元件: 获取数据后,我就是这样将数据存储到数据库中的。 请注意,我们无法预测未来h3元素中可能出现的国家名称和拼写,但我们绝不希望错过网站上新发布的任何机会 有谁能帮助我使用XPath或selenium解决方案吗。非常感谢你的帮

我正在努力刮这个

但是看到它的元素,我对如何提取位于两个h3标签之间的数据感到困惑。h3标记元素包含国家名称。在下一个h3标签(使用另一个国家名称)之前,有些帖子包含截止日期文本和与该截止日期相关的文件链接。事实上,它们中的每一个都是针对该国发布的商业投标机会

检查元件:

获取数据后,我就是这样将数据存储到数据库中的。

请注意,我们无法预测未来h3元素中可能出现的国家名称和拼写,但我们绝不希望错过网站上新发布的任何机会

有谁能帮助我使用XPath或selenium解决方案吗。非常感谢你的帮助。
在过去的几个小时里,我一直在想办法,但没能想出任何好主意。提前感谢您

使用从所有
  • 中提取和打印文本,例如Sahel-Sécuritéet Etat de Droit&Santéet Droits Sexuels et Reproductifs-OKP-SHL-20047(210.78 kB)(法语)等,您可以使用以下任一选项:

    • 使用
      css\u选择器

      driver.get("https://www.nuffic.nl/en/subjects/orange-knowledge-programme/calls-group-training-maximum-24-months-tmt-plus-orange")
      print([my_elem.text for my_elem in driver.find_elements_by_css_selector("h4 +p")])
      
    • 使用
      xpath

      driver.get("https://www.nuffic.nl/en/subjects/orange-knowledge-programme/calls-group-training-maximum-24-months-tmt-plus-orange")
      print([my_elem.text for my_elem in driver.find_elements_by_xpath("//h4//following::p[1]")])
      

    理想情况下,您需要引导所有元素的可见性(),您可以使用以下任一项:

    • 使用
      CSS\u选择器

      driver.get("https://www.nuffic.nl/en/subjects/orange-knowledge-programme/calls-group-training-maximum-24-months-tmt-plus-orange")
      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "h4 +p")))])
      
    • 使用
      XPATH

      driver.get("https://www.nuffic.nl/en/subjects/orange-knowledge-programme/calls-group-training-maximum-24-months-tmt-plus-orange")
      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//h4//following::p[1]")))])
      
    • 控制台输出:

      ['Sahel - Sécurité et Etat de Droit & Santé et Droits Sexuels et Reproductifs - OKP-SHL-20047 (210.78 kB) (in French)', 'Sahel - Santé et Droits Sexuels et Reproductifs - OKP-SHL-20048 (193.91 kB) (in French)', 'Sahel - Sécurité et Etat de Droit - OKP-SHL-20049 (209.17 kB) (in French)', 'Capacity strengthening for Resilience in the Sahel\u200c (365.57 kB)', 'Tunesia - Sécurité, Stabilité et Migration - OKP-TUN-40014 (209.87 kB) (in French)', 'Tunisia - Country Plan of Implementation - Orange Knowledge (423.8 kB)', 'Nigeria - Food and Nutrition Security - OKP-NIG-20050 (211.74 kB)', 'Sub-Sahara Africa - Health - OKP-SSA-50002 (214.27 kB)', 'Health Systems Strengthening through education and training – In Burkina Faso, Burundi, Ethiopia, Mali, Niger (301.71 kB)', 'Benin - Santé et Droits Sexuels et Reproductifs - OKP-BEN-20053 (189.51 kB) (in French)', 'Benin - Country Plan of Implementation - Orange Knowledge (in French)', 'Indonesia - Security and the Rule of Law - OKP-IDN-20055 (204.89 kB)', 'Indonesia - Food and Nutrition Security, Water - OKP-IDN-20056 (202.17 kB)', 'Indonesia - Country Plan of Implementation - Orange Knowledge (613.86 kB)', 'Horn of Africa – Food and Nutrition Security, Security and Rule of Law - OKP-EAR-20058 (236.34 kB)', 'Capacity strengthening for Resilience in the Horn of Africa (252.64 kB)\u200c', 'Thematic call SRHR - OKP-SRHR-40015 (235.72 kB)']
      
    • 注意:您必须添加以下导入:

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

    尝试此代码以获得所需的输出

    container = driver.find_element_by_xpath('//div[h3 and h4]')
    headers = container.find_elements_by_xpath('./h3')
    
    data = []
    
    for index, _header in enumerate(headers):
        header = _header.text
        _deadlines = container.find_elements_by_xpath('./h3[position()={}]/following-sibling::h4[starts-with(., "Deadline") and not(preceding-sibling::h3[position()={}])]'.format(index + 1, index + 2))
        _data = []
        for _deadline in _deadlines:
            link = _deadline.find_element_by_xpath('./following-sibling::p[1]//a').get_attribute('href')
            _data.append({_deadline.text: link})
        data.append([header, _data])
    
    for item in data:
        print(item)
    

    注意:这允许在每个截止日期只获取第一个链接(即使有多个链接)

    如何选择位于两个h3标记之间的所有h4,将HTML Dom代码张贴在屏幕截图上。我们如何调试xpath?您好@MohamedSulaimaanSheriff您是对的,如果有人试图检查,我会提供链接。谢谢你感谢你一直在那里帮助我。但解决方案只获得链接的标题。它错过了每一个的截止日期和href值。你也能帮我吗。假设[[sahel-xxxxxx,1月26日,www.axxxx.pdf][……]]谢谢。但如果有可能获得所有链接,请帮助我解决。@TalibDaryabi我无法找到有效的方法。这个问题可能需要单独的问题,非常感谢