Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何查找元素';忽略内部元素文本时,在Capybara中删除文本_Ruby_Selenium_Xpath_Capybara_Nokogiri - Fatal编程技术网

Ruby 如何查找元素';忽略内部元素文本时,在Capybara中删除文本

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

在下面的HTML示例中,我试图获取外部
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