如何从div poltergeist / capybara中的多个段落中提取文本

时间:2016-08-17 07:53:05

标签: ruby-on-rails ruby web-scraping capybara poltergeist

我正在使用此命令提取p标签

session.all('.entry p')

给出结果

[#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[1]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[2]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[3]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[4]">,
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[5]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[6]">,
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[7]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[8]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[9]">, 
#<Capybara::Element tag="p" path="//HTML[1]/BODY[1]/DIV[3]/DIV[1]/SECTION[1]/DIV[1]/ARTICLE[1]/DIV[3]/P[10]">]

现在我想从p节点中提取所有文本,我知道有合并所有段落文本的循环方法,还有其他方法。水豚提供?

1 个答案:

答案 0 :(得分:1)

#all的结果是Capybara::Result。医生说:

  

结果表示页面上Node :: Element的集合。它是   可能与此集合交互类似于数组,因为   它实现了Enumerable [...]

因此,您可以像使用可枚举的那样与其互动,但它不会提供您要求的任何方法。

您可以执行此操作来检索连接的内容:

session.all('.entry p').map(&:text).join

根据您的标记&#34;网页抓取&#34;我假设您使用水豚进行网络抓取,而不是进行测试。由于水豚的主要目的是测试它没有内置的方法来满足您的要求。

如果您正在实施测试,但您应该做这样的事情(我在这里使用了RSpec):

within('.entry') do
  expect(page).to have_text 'something'
end

或者,如果您真的需要非常具体地了解规范的位置(在大多数情况下这是不必要的),您应该测试它上面的每个元素:

expect(session.all('.entry p')[0]).to have_content 'something'
expect(session.all('.entry p')[1]).to have_content 'something else'

就像最后一个注意事项一样:对于网络抓取,有比水豚更好的选择。