我可以使用Selenium和Nokogiri根据附近的标签找到元素吗?

时间:2018-05-14 06:04:29

标签: ruby selenium selenium-webdriver web-scraping nokogiri

假设我想从网站上的以下内容中删除“权重”属性:

<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公斤”。但它没有标注,也没有任何标签。但我知道我总是想在“重量:”之后的文字。有没有办法根据它附近或其中的文本选择元素?

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

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>")

这可能吗?

3 个答案:

答案 0 :(得分:1)

您可以编写以下代码

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]

答案 1 :(得分: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

将返回

"6 kg"

答案 2 :(得分:1)

您可以通过纯xpath找到元素:使用contains()函数返回Boolean是第一个找到的第二个参数,并传递给它text()(返回节点的文本)和目标字符串。

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

然后在“重量:”之后得到值。