我可以使用 Selenium 和 Nokogiri 来根据附近的标签定位元素吗?

Can I use Selenium and Nokogiri to locate an element based on a nearby label?

假设我想从网站上的以下内容中抓取 "Weight" 属性:

<div>
  <h2>Details</h2>
  <ul>
    <li><b>Height:</b>6 ft</li>
    <li><b>Weight:</b>6 kg</li>
    <li><b>Age:</b>6</li>
  </ul>
</div>

我只要“6公斤”。但它没有标签,周围也没有任何东西。但我知道我总是想要 "Weight:" 之后的文本。有没有一种方法可以根据元素附近或其中的文本来选择元素?

在伪代码中,它可能是这样的:

require 'selenium-webdriver'
require 'nokogiri'
doc = parsed document
div_of_interest = doc.div where text of h2 == "Details"
element_of_interest = <li> element in div_of_interest with content that contains the string "Weight:"
selected_text = (content in element) minus ("<b>Weight:</b>")

这可能吗?

可以编写如下代码

p driver.find_elements(xpath: "//li").detect{|li| li.text.include?'Weight'}.text[/:(.*)/,1]

输出

"6 kg"

我的建议是使用 WATIR,它是 Ruby Selenium Binding 的包装器,您可以在其中轻松编写以下代码

p b.li(text: /Weight/).text[/:(.*)/,1]

是的。

require 'nokogiri'

Nokogiri::HTML.parse(File.read(path_to_file))    
.css("div > ul > li")
.children # get the 'li' items
.each_slice(2) # pair a 'b' item and the text following it
.find{|b, text| b.text == "Weight:"}
.last # extract the text element
.text

将return

"6 kg"

您可以通过纯 xpath 定位元素:使用 contains() 函数,其中 returns 布尔值是在第一个参数中找到的第二个参数,并传递给它 text()(其中 returns节点的文本)和目标字符串。

xpath_locator = '/div/ul/li[contains(text(), "Weight:")]'
value = driver.find_element(:xpath, xpath_locator).text.partition('Weight:').last

然后直接取"Weight:"后的值即可。