我正在使用此命令提取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节点中提取所有文本,我知道有合并所有段落文本的循环方法,还有其他方法。水豚提供?
答案 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'
就像最后一个注意事项一样:对于网络抓取,有比水豚更好的选择。