[英]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
有一些事情使您的代碼無法正常工作。
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")
find_element_by_*
返回第一個匹配的元素。
這意味着您對tbody.find_element_by_xpath(".//tr")
調用將返回<tbody>
的第一個<tr>
元素。
相反,您似乎想要第三個:
tr = tbody.find_element_by_xpath(".//tr[3]")
注意:XPath是1索引的。
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.