【问题标题】:Finding an element by partial href (Python Selenium)通过部分 href 查找元素(Python Selenium)
【发布时间】:2024-04-24 17:40:02
【问题描述】:

我正在尝试从具有不同 xpath 但非常可预测的跨网络数据库中多个页面的 href 方案的元素访问文本。以下是一些示例:

<a href="/mathscinet/search/mscdoc.html?code=65J22,(35R30,47A52,65J20,65R30,90C30)">
65J22 (35R30 47A52 65J20 65R30 90C30) </a>

在本例中,我想提取“65J22 (35R30 47A52 65J20 65R30 90C30)”

<a href="/mathscinet/search/mscdoc.html?code=05C80,(05C15)">
05C80 (05C15) </a>

在本例中,我想提取“05C80 (05C15)”。由于我所需元素的 xpath 在页面之间发生变化,我的网络爬虫无法直接通过 xpath 进行搜索,因此我正在寻找一种更迂回的方法。

我的主要想法是利用每个 href 都包含“/mathscinet/search/mscdoc.html?code=”这一事实。 Selenium 无法直接搜索hrefs,但我正在考虑做类似C# implementation 的事情:

Driver.Instance.FindElement(By.XPath("//a[contains(@href, 'long')]"))

要将其移植到 python,我能想到的唯一类似方法是使用 in operator,但我不确定当所有内容都嵌套在 find_element_by_xpath 中时语法将如何工作。我如何将所有这些想法结合在一起以获得我想要的文本?

driver.find_element_by_xpath("//a['/mathscinet/search/mscdoc.html?code=' in @href]").text

【问题讨论】:

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


    【解决方案1】:

    如果我正确理解您想要定位所有具有相同部分 href 的元素。你可以使用这个:

    elements = driver.find_elements_by_xpath("//a[contains(@href, '/mathscinet/search/mscdoc.html')]")
    for element in elements:
        print(element.text)
    

    或者如果你想定位一个元素:

    driver.find_element_by_xpath("//a[contains(@href, '/mathscinet/search/mscdoc.html')]").text
    

    这将给出所有已定位元素的列表。

    【讨论】:

      【解决方案2】:

      根据您分享的 HTML,@AndreiSuvorkov 的回答可能会满足您当前的要求。也许您可以通过以下方式获得更细化并构建优化的 xpath

      • 而不是使用contains 使用starts-with
      • 包括@href属性的?code=部分
      • 您的有效代码块将是:

        all_elements = driver.find_elements_by_xpath("//a[starts-with(@href,'/mathscinet/search/mscdoc.html?code=')]")
        for elem in all_elements:
            print(elem.get_attribute("innerHTML"))
        

      【讨论】: