【问题标题】:How to return select phrases from Nokogiri如何从 Nokogiri 返回选择的短语
【发布时间】:2020-11-01 09:07:19
【问题描述】:

我正在尝试解析我正在抓取的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 名军官的种族信息即可提供给我的军官类的种族属性访问器。据我所知,该网站的 HTML 并没有真正让我进一步指定。

有没有办法做到这一点?还是我看错了问题?

【问题讨论】:

  • 欢迎来到 SO。询问时,重要的是要将 HTML 减少到尽可能小的块来演示问题,并将其包含在您的问题中。要求我们检索并浏览页面以查找您正在讨论的部分会浪费我们的时间,并且如果您指向页面的链接中断,那么这个问题将毫无意义。请查看“How to Ask”、“Stack Overflow question checklist”和“MCVE”及其所有链接页面,然后改进您的问题。

标签: html ruby web-scraping command-line-interface nokogiri


【解决方案1】:

我会开始:

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 扩展的扩展,让我们可以像使用 XPath 一样使用 CSS。 XPath 仍然更强大,但有时在视觉上也很痛苦,所以我主要使用 CSS。出于同样的原因,Nokogiri 文档推荐使用 CSS。

dt:contains('Race')+dd 然后让 Nokogiri 找到包含“Race”的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}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您解释得非常好,而且效果很好!我感觉它不够具体,但不知道该怎么做,谢谢!
    • 不,不,不。如果页面布局发生变化,使用一长串选择器更有可能中断。相反,找到特定的路点,并指向那些。看我的回答。此外,这个选择器看起来像是使用浏览器的 CSS 路径复制到该元素。永远不要相信浏览器,因为 JavaScript 可以在页面加载后,在呈现之前移动节点,这将导致 Nokogiri 无法找到正在选择的内容。始终查看原始源代码。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多