首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ruby机械化迭代html元素

用ruby机械化迭代html元素
EN

Stack Overflow用户
提问于 2014-08-14 19:18:30
回答 1查看 1.6K关注 0票数 1

即使在我试图做的事情上,我也可能离得很远,但这是我得到的。

我喜欢收集幻想足球投影,并将所有的html元素(对于不同的球员)放在一个数组中,并遍历它们来显示结果。

代码语言:javascript
复制
require 'mechanize'

mechanize = Mechanize.new

dk_qb = mechanize.get('http://www.numberfire.com/nfl/fantasy/fantasy-football-projections/qb')



dk_qb_array = ['#container > div > div > div:nth-child(2) > div.fl.clearfix > h2',
            '#container > div > div > div:nth-child(3) > div.fl.clearfix > h2']

dk_qb_array.each do |name|
 require 'mechanize'
 mechanize = Mechanize.new

 dk_qb = mechanize.get('http://www.numberfire.com/nfl/fantasy/fantasy-football-projections/qb')

 puts "#{dk_qb}.at('#{name}').text.strip"

结束

代码语言:javascript
复制
returns ==> #<Mechanize::Page:0x007f9ed95058f0>.at('#container > div > div > div:nth-child(2) > div.fl.clearfix > h2').text.strip

            #<Mechanize::Page:0x007f9ed91382e0>.at('#container > div > div > div:nth-child(3) > div.fl.clearfix > h2').text.strip

我让它一次只能工作一次,但是任何关于迭代更多元素的建议都会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-14 19:39:19

您不需要在这里再次要求机械化:

代码语言:javascript
复制
dk_qb_array.each do |name|
  require 'mechanize'

无论如何,您应该使用Nokogiri--而不是机械化:

代码语言:javascript
复制
$ gem install nokogiri

然后:

代码语言:javascript
复制
require 'nokogiri'
require 'open-uri'

selectors = [
  '#container > div > div > div:nth-child(2) > div.fl.clearfix > h2',
  '#container > div > div > div:nth-child(3) > div.fl.clearfix > h2',
]
url = 'http://www.numberfire.com/nfl/fantasy/fantasy-football-projections/qb'
doc = Nokogiri::HTML(open(url))

selectors.each do |selector|
  puts selector
  doc.css(selector).each do |matching_tag|
    puts "\t #{matching_tag.text}"
  end
end


--output:--
#container > div > div > div:nth-child(2) > div.fl.clearfix > h2
     Week 1 Fantasy Football QB Projections
#container > div > div > div:nth-child(3) > div.fl.clearfix > h2

从输出中可以看出,您的第二个选择器没有匹配;第一个选择器的单个匹配可能不是您想要的。整个页面上只有一个<h2>,所以寻找第二个是行不通的。

更好的方法是使用id属性直接到达您想要的区域。

代码语言:javascript
复制
"tbody#projection-data > tr"

然后做这样的事情:

代码语言:javascript
复制
doc.css("tbody#projection-data > tr").each do |tr|
  #The <tr> contains the data for one player

  tr.css('td').each do |td|  #Now step through the <td>'s for the given <tr>/player
    puts td.text.strip
  end

  puts '-' * 10  #Marks the end of the data for one <tr>/player

  #Now, loop back up and get the next <tr>/player
end


--output:--
Drew Brees (QB, NO)
ATL
#26
1
1
27.49/40.64
335.01
3.07
0.71
2.84
10.42
0.06
17.4-33.58
25.49
29.33
$0
0
26.25
$0
0
25.54
$0
0
25.54
$0
0
26.25
$0
0
----------
Peyton Manning (QB, DEN)
...
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25315961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档