正确分离Array中的String元素

时间:2016-06-24 12:27:43

标签: ruby split nokogiri

我正在尝试使用Nokogiri解析HTML页面以获取一些公司名称。

names = []
names << Nokogiri::HTML(mypage).css(".name a").text

我的结果是:

["MikeGetsLeadsUruBlondeLaunch LIVERynoRyderBoyer ProductionsStrangerxCerealLume CubeKatapyMacaulay Outdoor PromotionsFlixit ABMedia MosaicLiftCast.TVcool.mediaPeekKLIKseeStreamingo SolutionsPvgnaalughaUser"]

但我想得到的是:

["MikeGetsLeads", "Uru", "Blonde", "Launch LIVE", RynoRyderBoyer Productions", "Stranger", "xCereal", "Lume Cube", "Katapy", "Macaulay Outdoor Promotions", "Flixit AB", "Media Mosaic", "LiftCast.TV", "cool.media", "Peek", "KLIKsee", "Streamingo Solutions", "Pvgna", "alugha", "User"]

我尝试使用.split,但它也没有给我正确的结果。在此页面上,每个名称都属于<div>,因此它在HTML结构中明显分开。

HTML结构如下所示

<div class='name'>
<a href="https://angel.co/mikegetsleads-2" class="startup-link" data-id="1217822" data-type="Startup">MikeGetsLeads</a>
</div>

2 个答案:

答案 0 :(得分:0)

require 'rubygems'
require 'nokogiri'
require 'pp'

names = []
mypage = File.open("myhtml.html", "r")
Nokogiri::HTML(mypage).css(".name a").each do |item|
 names << item.text
end

pp names

返回:

["MikeGetsLeads", "MikeGetsLeads2", "MikeGetsLeads3"]

答案 1 :(得分:0)

问题是,您将text与NodeSet一起使用,而不是与单个节点一起使用。使用NodeSet,所有文本都连接成一个String。根据{{​​1}} AKA NodeSet.inner_text documentation

  

获取所有包含的Node对象的内部文本

,实际代码为:

text

Node.content AKA def inner_text collect(&:inner_text).join('') end text

  

返回此节点的内容

默想:

inner_text

相反,您需要在各个节点上使用require 'nokogiri' doc = Nokogiri::HTML(<<EOT) <div> <p>foo</p> <p>bar</p> </div> EOT doc.css('p').class # => Nokogiri::XML::NodeSet doc.css('p').text # => "foobar"

text

上一行可以简化为:

doc.css('p').map{ |n| n.class } # => [Nokogiri::XML::Element, Nokogiri::XML::Element]
doc.css('p').map{ |n| n.text } # => ["foo", "bar"]

参见&#34; How to avoid joining all text from Nodes when scraping&#34;还