问题
我正在尝试创建一个 ruby 脚本,该脚本在给定标识符时输出 Apple 设备的生成名称。
例如:ruby device_name.rb "iPad3,4"
应输出:iPad (4th generation)
我需要这样做的数据在这个维基页面上: https://www.theiphonewiki.com/wiki/Models
不幸的是,这些桌子很难刮。
在检查了 chrome 中的元素后,我在第一个表格上取得了一点成功,所以我可以看到 css 结构。
例如,这将在Apple TV表中获取标识符:
doc.css("div#content.mw-body div#bodyContent.mw-body-content div#mw-content-text.mw-content-ltr table.wikitable")[0].children[Y].children[11].text
Y 从 3 开始,然后标识符继续使用奇数,直到没有更多的子数字。
如果标识符与输入到 ARGV[0] 中的标识符匹配,那么我可以通过以下方式询问生成名称:
doc.css("div#content.mw-body div#bodyContent.mw-body-content div#mw-content-text.mw-content-ltr table.wikitable")[0].children[Y].children[1].text
到目前为止一切顺利,对吧?
但是接下来对应于Apple Watch的下一个表格以及之后的所有其他表格让我感到困惑。这将返回整个下一个表。
doc.css("div#content.mw-body div#bodyContent.mw-body-content div#mw-content-text.mw-content-ltr table.wikitable")[1]
但是,只需更改为以下内容即可使用相同的查找
:doc.css("div#content.mw-body div#bodyContent.mw-body-content div#mw-content-text.mw-content-ltr table.wikitable")[0].children[3].children[11].text
显然应该有一个不同的 css 路径,因为有更多的列,但我无法获得相同的一致性或在其他表中找到坚实的模式。
问题
- 如何以编程方式获取所有这些标识符和名称?
- 有没有更好的方法来查找这些标识符?也许通过 API?
有点倒退,不一定漂亮,但是,
url = "http://web.archive.org/web/20170224033625/https://www.theiphonewiki.com/wiki/Models" # couldn't access the site itself
req = HTTParty.get(url)
doc = Nokogiri::HTML(req.response.body)
td = doc.css('td').detect { |td| td.text.index(input) }
model = td.parent.css('td')[0].text.strip