【问题标题】:How to retrieve innertext using capybara and poltergeist?如何使用 capybara 和 poltergeist 检索内部文本?
【发布时间】:2014-05-04 21:34:47
【问题描述】:

我有这个简单的 HTML:

<div> Test <span> someting </span></div>

如何只检索 div 的 innertext

使用text 从 div 中检索所有文本:

[1] pry(#<SandBox>)> first(:xpath, '//div').text
=> "Test someting"

在我的 XPath 查询中使用 text() 会导致以下错误:

[2] pry(#<SandBox>)> first(:xpath, '//div/text()')
Capybara::Poltergeist::BrowserError: There was an error inside the PhantomJS portion of Poltergeist. This is probably a bug, so please report it. 
TypeError: 'null' is not an object (evaluating 'window.getComputedStyle(element).display')

但是,使用与 Nokogiri 相同的 XPath 是可行的:

[3] pry(#<SandBox>)> Nokogiri::HTML(page.html).xpath('//div/text()').text
=> " Test "

有没有办法只使用水豚而不求助于Nokogiri?

【问题讨论】:

  • 正如错误消息报告的那样,这很可能是一个错误。您应该将此报告给开发人员。确实没有办法使用text(),如果这不起作用,我会认为这是一个主要错误。因此,您要么等待修复,要么使用其他解决方案,例如 Nokogiri
  • 我也搜过了,目前似乎没有办法获取内部HTML。我想我们将不得不等待更新或提出拉取请求。我认为至少有一个其他 Capybara 驱动程序支持 innerHTML 方法。

标签: ruby xpath capybara nokogiri poltergeist


【解决方案1】:

您始终可以使用 Nokogiri 和 open-uri。

require 'nokogiri'
require 'open-uri'

2.2.0 :021 > html = Nokogiri::HTML::DocumentFragment.parse('<div> Test <span> someting     </span></div>').child

 => #<Nokogiri::XML::Element:0x44a7082 name="div" children=[#<Nokogiri::XML::Text:0x44a63ee " Test ">, #<Nokogiri::XML::Element:0x44a62e0 name="span" children=[#<Nokogiri::XML::Text:0x44a3f04 " someting ">]>]> 

然后你可以根据你想要抓取的内容对其进行操作。所以对于标签内的文字:

2.2.0 :072 > html.children.first

 => #<Nokogiri::XML::Text:0x45ea37c " Test "> 

2.2.0 :073 > html.children.first.text

=> " Test " 

2.2.0 :215 > html.children.first.content

 => " Test "

祝你好运!

【讨论】:

  • 我应该提一下,您在 :021 上使用 #child 的原因是您正在使用 Nokogiri::XML::Element。 Element 类继承自 Node 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2015-08-30
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多