Ruby 如何查找元素';忽略内部元素文本时,在Capybara中删除文本
在下面的HTML示例中,我试图获取外部Ruby 如何查找元素';忽略内部元素文本时,在Capybara中删除文本,ruby,selenium,xpath,capybara,nokogiri,Ruby,Selenium,Xpath,Capybara,Nokogiri,在下面的HTML示例中,我试图获取外部span.price元素中的$16.95文本,并从内部span.sale元素中排除该文本 <div class="price"> <span class="sale"> <span class="sale-text">"Low price!"</span> "$16.95" </sp
span.price
元素中的$16.95文本,并从内部span.sale
元素中排除该文本
<div class="price">
<span class="sale">
<span class="sale-text">"Low price!"</span>
"$16.95"
</span>
</div>
但是,水豚会导航而不是删除节点。我知道像price.text这样的东西会从所有子元素中获取文本,所以我尝试使用xpath来更具体p.find(:xpath,//span[@class='sale'],:match=>:first)。text
。但是,这也会从内部元素获取文本
最后,我尝试在所有跨度中循环,看看是否可以分离结果,但我得到了一个模糊的错误
p.find(:css, 'span').each { |result| puts result.text }
Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "span"
我使用的是Capybara/Selenium,因为这是用于身份验证复杂的web抓取项目。使用Capybara没有单一的语句方式,因为DOM的innerText概念并不真正支持您想要做的事情。假设p
是“.price”元素,您可以通过以下两种方式获得所需:
因为知道要忽略的节点,所以只需从整个文本中减去该文本即可
p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
抓取innerHTML字符串并用Nokogiri或Capybara.string(它只是在Capybara DSL中包装Nokogiri元素)解析该字符串
对于Capybara,没有单一的语句方式可以做到这一点,因为DOMs的innerText概念并不真正支持您想要做的事情。假设p
是“.price”元素,您可以通过以下两种方式获得所需:
因为知道要忽略的节点,所以只需从整个文本中减去该文本即可
p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
抓取innerHTML字符串并用Nokogiri或Capybara.string(它只是在Capybara DSL中包装Nokogiri元素)解析该字符串
很感谢你的回答,但我最后只是用水豚草删除html,然后用Nokogiri处理。我需要浏览许多结果页面,加上解析速度慢的Capybara节点和奇怪的JS效果,脚本通常会抛出StaleElementReferenceError。感谢您的回答,但我最终只是用Capybara抓取html并用Nokogiri处理。我需要浏览许多结果页面,解析速度慢的Capybara节点和奇怪的JS效果使脚本通常抛出StaleElementReferenceError。
doc = Capybara.string(p['innerHTML'])
nokogiri_fragment = doc.native
#do whatever you want with the nokogiri fragment