Как вернуть избранные фразы из Нокогири - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь проанализировать строку, выводимую с HTML сайта Я парсю.

Я использую:

 officer.race = doc.css("dd").map {|r| r.text.strip}

Но это выводит все атрибуты офицеров на первой странице:

Rank POLICE OFFICER Race White Hispanic Gender F Number of Photos 0 Rank POLICE OFFICER Race White Gender M Number of Photos 0

и т. Д.

Мне просто нужна гонка всех 20 офицеров на первой странице, чтобы передать их Аксессор атрибута расы моего класса Офицер. HTML на сайте действительно не дает мне возможности уточнить, насколько мне известно.

Есть ли способ сделать это? Или я неправильно смотрю на проблему?

Ответы [ 2 ]

0 голосов
/ 17 июля 2020

Я бы начал с:

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}
0 голосов
/ 11 июля 2020

В вашем селекторе недостаточно c, поэтому он набирает каждые dd.

.list-group-item > div.row > div:last-child > .row > div:first-child > dl > dd:last-child

Вы хотите пройти через .list-group-item, затем до .row, затем до последний div внутри этого элемента, затем дочерний .row, затем первый div, затем dl, затем последний dd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...