PYTHON - 无法使用Selenium查找Xpath

时间:2018-02-12 17:44:17

标签: python xpath

我一直在努力解决这个问题。 我尝试了各种为以下突出显示的HTML找到xpath 我试图抓住突出显示的强标记下列出的美元价值。 enter image description here

以下是我上次尝试的内容:

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打印出价格。 它可能与HTML有关,这是一个在继续执行时执行的java脚本。

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

让它发挥作用

有一些事情可以阻止你的代码工作。

  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")的致电将返回<tr>中的第一个<tbody>元素。

    相反,看起来你想要第三个:

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

    注意:XPath是1索引的。

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

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

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

    strong.text
    
  4. 清理它

    但即使代码正常工作,也可以采取更多措施来改进它。

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

      除非有一些需要解决的含糊之处,否则您可以完全忽略<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