【问题标题】:PYTHON - Unable To Find Xpath Using SeleniumPYTHON - 无法使用 Selenium 找到 Xpath
【发布时间】:2018-02-12 17:44:17
【问题描述】:

我已经为此苦苦挣扎了一段时间。 我尝试了各种方法来查找以下突出显示的 HTML 的 xpath 我正在尝试获取突出显示的强标签下列出的美元价值。

这是我最后一次尝试的样子:

try:
     price = browser.find_element_by_xpath(".//table[@role='presentation']")
     price.find_element_by_xpath(".//tbody")
     price.find_element_by_xpath(".//tr")
     price.find_element_by_xpath(".//td[@align='right']")
     price.find_element_by_xpath(".//strong")
     print(price.get_attribute("text"))
except:
     print("Unable to find element text")

我尝试访问表格和所有嵌套元素,但仍然无法访问突出显示的部分。使用 .text 和 get_attribute('text') 也不起作用。

还有其他访问嵌套元素的方法吗? 或者,也许我没有正确使用 XPath。 我也尝试过以下方法:

 price = browser.find_element_by_xpath("/html/body/div[4]")

更新: 这是网站的完整代码。 我在这里使用的网站是 www.concursolutions.com 我正在尝试使用硒自动预订航班。 当您完成预订过程并收到价格时,我无法根据 HTML 打印出价格。 它可能与作为您继续执行的 java 脚本的 HTML 有关。

【问题讨论】:

  • print(price) 在 try 块中的每一行之后查看值是什么。
  • 可以粘贴代码或网址吗?
  • @JacobIRR -- try 语句中每一行之后的 print 语句给了我这个。 selenium.webdriver.remote.webelement.WebElement (session="cb55ef0ef15ae87ad69885661840774b", element="0.5695520939701662-5") 以及更多这样的行。
  • 试试这个表达式得到强元素//div[@id="gdsfarequote"]/center/table/tbody/tr[14]/td[2]/strong
  • @Thefourthbird 使用您提供的线路,我得到以下回复:

标签: python xpath


【解决方案1】:

查看 html 的结构,您可以使用这个 xpath 表达式:

//div[@id="gdsfarequote"]/center/table/tbody/tr[14]/td[2]/strong

【讨论】:

    【解决方案2】:

    让它发挥作用

    有几件事使您的代码无法正常工作。

    1. price.find_element_by_xpath(...) 返回一个新元素。

      每次,您都不会将其保存以用于下一个查询。因此,当您最终向它询问其文本时,您仍然在询问 <table> 元素,而不是 <strong> 元素。

      相反,您需要保存每个找到的元素,以便将其用作下一个查询的范围:

      table = browser.find_element_by_xpath(".//table[@role='presentation']")
      tbody = table.find_element_by_xpath(".//tbody")
      tr = tbody.find_element_by_xpath(".//tr")
      td = tr.find_element_by_xpath(".//td[@align='right']")
      strong = td.find_element_by_xpath(".//strong")
      
    2. find_element_by_* 返回第一个匹配元素。

      这意味着您对tbody.find_element_by_xpath(".//tr") 的调用将返回<tbody> 中的第一个<tr> 元素。

      相反,您似乎想要第三个:

      tr = tbody.find_element_by_xpath(".//tr[3]")
      

      注意:XPath 是 1 索引的。

    3. get_attribute(...) 返回 HTML 元素属性。

      因此,get_attribute("text") 将返回元素上text 属性的值。

      要返回元素的文本内容,请使用element.text

      strong.text
      

    清理它

    但即使代码正常工作,还有更多工作可以改进。

    • 您通常不需要指定每个中间元素。

      除非有一些歧义需要解决,否则您可以完全忽略<tbody><td> 元素:

      table = browser.find_element_by_xpath(".//table[@role='presentation']")
      tr = table.find_element_by_xpath(".//tr[3]")
      strong = tr.find_element_by_xpath(".//strong")
      
    • XPath 可能有点矫枉过正。

      如果您只是通过标签名称查找元素,则可以完全避免使用 XPath:

      strong = tr.find_element_by_tag_name("strong")
      
    • 票价行可能会发生变化。

      您可以使用文本搜索来确定范围,而不是依赖特定位置:

      tr = table.find_element_by_xpath(".//tr[contains(text(), 'Base Fare')]")
      
    • 其他<table>元素可以添加到页面中。

      如果表格有一些标题文本,您可以使用与 <tr> 相同的文本搜索方法。

      在这种情况下,将范围限定为#gdsfarequite <div> 可能比<table> 那样模棱两可的东西更有意义:

      farequote = browser.find_element_by_id("gdsfarequote")
      tr = farequote.find_element_by_xpath(".//tr[contains(text(), 'Base Fare')]")
      

    但更好的是,capybara-py 在 Selenium 之上提供了一个很好的包装器,有助于使其更加简单和清晰:

    fare_quote = page.find("#gdsfarequote")
    base_fare_row = fare_quote.find("tr", text="Base Fare"):
    base_fare = tr.find("strong").text
    

    【讨论】:

    • 伊恩,感谢您的回答,您的回答非常详细且有据可查。它提供了很多对我非常有用的信息。感谢您花时间提供如此详细的答案。您的回答也为我提供了正确的解决方案。谢谢伊恩!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多