我可以使用 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:"后的值即可。
假设我想从网站上的以下内容中抓取 "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:"后的值即可。