假设我想从网站上的以下内容中删除“权重”属性:
<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>")
这可能吗?
答案 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
然后在“重量:”之后得到值。