如何从 Nokogiri return select 短语

How to return select phrases from Nokogiri

我正在尝试解析 site 的 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 位军官的种族就可以提供给我的军官 class 的种族属性访问器。该网站的 HTML 并没有真正让我进一步详细说明我的知识。

有办法吗?还是我看错问题了?

您的选择器不够具体,因此它每隔 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

我会从:

开始
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是魔术的第一部分。那个特定的 div 和 class 包含您想要的字段,所以只需在整个页面中抓住它们,因为它是最里面的不同标签。

Nokogiri 包含添加 jQuery 的 CSS 扩展的扩展,允许我们使用 CSS 更像 XPath。 XPath 仍然更强大,但有时它在视觉上也很痛苦,所以我主要使用 CSS。 Nokogiri 文档出于同样的原因推荐 CSS。

dt:contains('Race')+dd 然后让 Nokogiri 找到包含“种族”的 dt 标签,并且 + 告诉它获取下一个 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}