如何从 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}
我正在尝试解析 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}