我正在尝试从网站上抓取数据,我特定的是在嵌入不同元素的特定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
但是我认为编写这些代码并为每个单独的实例重复一遍。
答案 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
才有效;我不知道页面结构是什么样的。