簡體   English   中英

PYTHON-無法使用硒找到Xpath

[英]PYTHON - Unable To Find Xpath Using Selenium

我已經為此苦了一段時間了。 我已經嘗試過各種方法,以便為以下突出顯示的HTML找到xpath,我試圖抓住突出顯示的Strong標簽下的美元價值。 在此處輸入圖片說明

這是我最后的嘗試如下所示:

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腳本有關。

在此處輸入圖片說明

查看html的結構,可以使用以下xpath表達式:

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

使它工作

有一些事情使您的代碼無法正常工作。

  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#gdsfarequite <div>而不是像<table>這樣含糊不清的東西可能更有意義:

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

但是更好的是, 水豚py在Selenium之上提供了一個不錯的包裝器,使它變得更加簡單和清晰:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM