Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何从Nokogiri返回选定短语_Html_Ruby_Web Scraping_Command Line Interface_Nokogiri - Fatal编程技术网

Html 如何从Nokogiri返回选定短语

Html 如何从Nokogiri返回选定短语,html,ruby,web-scraping,command-line-interface,nokogiri,Html,Ruby,Web Scraping,Command Line Interface,Nokogiri,我正试图解析从我正在抓取的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 等等 我只需要

我正试图解析从我正在抓取的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并没有真正为我提供一种进一步说明的方法


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

您的选择器不够具体,因此它会拾取每个dd

您希望遍历.list组项,然后遍历到.row,然后遍历到该元素中的最后一个div,然后遍历子.row,然后遍历第一个div,然后遍历dl,然后遍历最后一个dd

需要“nokogiri” 需要“打开uri” doc=Nokogiri::HTMLURI.open'https://openoversight.lucyparsonslabs.com/department/1' doc.searchdiv.col-md-6.col-xs-6 dt:包含'Race'+dd.map&:text =>[西班牙裔白人, 白色 白色 白色 白色 亚洲/太平洋岛民, 亚洲/太平洋岛民, 白色 亚洲/太平洋岛民, 黑色 黑色 白色 白色 亚洲/太平洋岛民, 白色 白色 白人西班牙裔, 白人西班牙裔, 白人西班牙裔, 白人西班牙裔] div.col-md-6.col-xs-6是魔法的第一部分。这个特定的div和类包含您想要的字段,所以只需在整个页面中获取它们,因为它是最内部的独特标记

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}

你解释得很好,而且很有效!我有一种感觉,它不够具体,但不知道如何去做,谢谢!不,不,不。如果页面的布局发生变化,使用一长串选择器更有可能中断。相反,找到具体的路径点,并指向那些。看看我的答案。此外,该选择器看起来像是使用浏览器的CSS路径复制到元素的。永远不要相信浏览器,因为JavaScript可以在页面加载后、呈现之前移动节点,这将导致Nokogiri无法找到所选内容。始终查看原始源代码。欢迎使用SO。在提问时,重要的是将HTML缩减到尽可能小的块,并将其包含在问题中。要求我们检索并搜索一个页面以找到您正在讨论的部分浪费了我们的时间,如果您的页面链接断开,这个问题将毫无意义。请参阅,以及他们的所有链接页面,然后改进您的问题。
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}