Я бы начал с:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(URI.open('https://openoversight.lucyparsonslabs.com/department/1'))
doc.search("div.col-md-6.col-xs-6 dt:contains('Race')+dd").map(&:text)
# => ["White Hispanic",
# "White",
# "White",
# "White",
# "White",
# "Asian/pacific Islander",
# "Asian/pacific Islander",
# "White",
# "Asian/pacific Islander",
# "Black",
# "Black",
# "White",
# "White",
# "Asian/pacific Islander",
# "White",
# "White",
# "White Hispanic",
# "White Hispanic",
# "White Hispanic",
# "White Hispanic"]
div.col-md-6.col-xs-6
это первая часть магов c. Этот конкретный div и класс содержат нужные вам поля, поэтому просто возьмите их по всей странице, поскольку это самый внутренний отдельный тег.
Nokogiri содержит расширения для добавления jQuery расширений CSS, что позволяет нам использовать CSS больше похоже на XPath. XPath по-прежнему более мощный, но временами визуально болезненный, поэтому я использую преимущественно CSS. Документация Nokogiri рекомендует CSS по той же причине.
dt:contains('Race')+dd
затем заставляет Nokogiri найти теги dt
, содержащие «Race», а +
говорит ему захватить следующий dd
тег, который содержит фактический текст.
Конечно, вы, вероятно, захотите немного посчитать:
doc.search("div.col-md-6.col-xs-6 dt:contains('Race')+dd").map(&:text).tally
# => {"White Hispanic"=>5, "White"=>9, "Asian/pacific Islander"=>4, "Black"=>2}