问题
我正在尝试创建一个 ruby 脚本,该脚本在给定 标识符 时输出 Apple 设备的生成名称。
例如:
ruby device_name.rb "iPad3,4"
应该输出:
iPad(第 4 代)
我需要执行此操作的数据位于此 wiki 页面上: 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 开始,然后标识符继续奇数,直到没有更多的 child 。
如果标识符与输入到 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
关于ios - 使用 ruby 通过 Nokogiri 的 css 方法抓取 Apple 设备标识符和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579095/