我一直在努力解决这个问题。 我尝试了各种为以下突出显示的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打印出价格。 它可能与HTML有关,这是一个在继续执行时执行的java脚本。
答案 0 :(得分:1)
查看html的结构,您可以使用此xpath表达式:
//div[@id="gdsfarequote"]/center/table/tbody/tr[14]/td[2]/strong
答案 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")
find_element_by_*
返回第一个匹配元素。
这表示您对tbody.find_element_by_xpath(".//tr")
的致电将返回<tr>
中的第一个<tbody>
元素。
相反,看起来你想要第三个:
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
<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