如何在忽略内部元素文本的情况下在 Capybara 中查找元素的文本
How to find an element's text in Capybara while ignoring inner element text
在下面的 HTML 示例中,我试图获取外部 span.price
元素中的 $16.95 文本,并从内部 span.sale
元素中排除该文本。
<div class="price">
<span class="sale">
<span class="sale-text">"Low price!"</span>
".95"
</span>
</div>
如果我使用 Nokogiri,这不会太困难。
price = doc.css('sale')
price.search('.sale-text').remove
price.text
但是 Capybara 导航而不是移除节点。我知道 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,因为这是一个具有身份验证复杂性的网络抓取项目。
由于 innerText 的 DOM 概念并不真正支持您想要执行的操作,因此没有单一的语句方法可以使用 Capybara 执行此操作。假设 p
是 '.price' 元素,您可以通过以下两种方式获得所需内容:
因为您知道要忽略的节点,只需从整个文本中减去该文本
p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
获取 innerHTML 字符串并使用 Nokogiri 或 Capybara.string(它只是将 Nokogiri 元素包装在 Capybara DSL 中)
doc = Capybara.string(p['innerHTML'])
nokogiri_fragment = doc.native
#do whatever you want with the nokogiri fragment
在下面的 HTML 示例中,我试图获取外部 span.price
元素中的 $16.95 文本,并从内部 span.sale
元素中排除该文本。
<div class="price">
<span class="sale">
<span class="sale-text">"Low price!"</span>
".95"
</span>
</div>
如果我使用 Nokogiri,这不会太困难。
price = doc.css('sale')
price.search('.sale-text').remove
price.text
但是 Capybara 导航而不是移除节点。我知道 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,因为这是一个具有身份验证复杂性的网络抓取项目。
由于 innerText 的 DOM 概念并不真正支持您想要执行的操作,因此没有单一的语句方法可以使用 Capybara 执行此操作。假设 p
是 '.price' 元素,您可以通过以下两种方式获得所需内容:
因为您知道要忽略的节点,只需从整个文本中减去该文本
p.find('span.sale').text.sub(p.find('span.sale-text').text, '')
获取 innerHTML 字符串并使用 Nokogiri 或 Capybara.string(它只是将 Nokogiri 元素包装在 Capybara DSL 中)
doc = Capybara.string(p['innerHTML']) nokogiri_fragment = doc.native #do whatever you want with the nokogiri fragment