Ruby nokogiri选择多个元素

时间:2016-08-08 00:07:13

标签: css ruby

大家,这可能有一个我忽略的简单答案(我还在学习)。

我正在尝试从网站上抓取数据,我特定的是在嵌入不同元素的特定p元素之后,这就是嵌套元素的样子。

#ctl00_body_divSearchResult > div:nth-child(5) > div.expandable-box-content.expanded > p:nth-child(2)

#ctl00_body_divSearchResult > div:nth-child(16) > div.expandable-box-content.expanded > p:nth-child(2)

#ctl00_body_divSearchResult > div:nth-child(27) > div.expandable-box-content.expanded > p:nth-child(2)

#ctl00_body_divSearchResult > div:nth-child(38) > div.expandable-box-content.expanded > p:nth-child(2)

#ctl00_body_divSearchResult > div:nth-child(49) > div.expandable-box-content.expanded > p:nth-child(2)

以下是来自同一页面的五个例子,第一个div:nth-​​child有不同的数字,但其余部分是一致的。我追求个人p:nth-​​child(2)元素。

使用此代码我可以获得单个p元素

numbers= agent.get(urlanzctr).css('#ctl00_body_divSearchResult > div:nth-child(5) > div.expandable-box-content > p:nth-child(2)').text

但是我认为编写这些代码并为每个单独的实例重复一遍。

1 个答案:

答案 0 :(得分:1)

您的agent.get(url).css(selector)方法是正确的返回数组。

看看你的选择者,他们就是所有这些结构:

#ctl00_body_divSearchResult >
div:nth-child(N) >
div.expandable-box-content.expanded >
p:nth-child(2)

唯一的变量是N中的div:nth-child

您拥有值5, 16, 27, 38, 49

11x + 5

所以你可以做这样的事情

def make_selector(n)
  "#ctl00_body_divSearchResult > "         +
  "div:nth-child(#{n}) > "                 +
  "div.expandable-box-content.expanded > " +
  "p:nth-child(2)"
end

def get_matches(n)
  agent.get(url).css(make_selector(n))
end

starting_idx = 5
current_matches = get_matches(starting_idx)
all_matches = []

until current_matches.empty?
  all_matches.concat(current_matches)
  current_matches = get_matches(starting_idx + 11)
end

puts all_matches.length

您也可以跳过中间选择器

即。也许只有.expandable-box-content.exampled > p才有效;我不知道页面结构是什么样的。