2016-06-24 2 views
0

일부 회사 이름을 얻기 위해 Nokogiri를 사용하여 HTML 페이지를 구문 분석하려고합니다.배열의 문자열 요소가 올바르게 구분됩니다.

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

하지만 내가 좀하고 싶습니다 것은 :

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

내 결과는 내가 .split를 사용하려고

["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"] 

그러나 그것은 나에게 올바른 결과를 제공하지 않습니다하지도 않습니다 . 이 페이지에서 각 이름은 <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> 
+0

내가 분석 할 HTML이 어떻게 보이는지 확인할 수 있습니까? 질문에 붙여 넣을 수 있습니까? – maicher

+0

Nokogiri 스 니펫의 결과에 따라 원하는 배열을 생성 할 수없는 것으로 보입니다. 아마도 당신이이 데이터를 어디서 얻고 있는지에 관한 좀 더 자세한 정보가 도움이 될 것입니다. – Sinstein

+0

의견을 보내 주셔서 감사합니다. – Eric

답변

0

문제는 당신이없는 개별 노드로하는 노드 집합으로 text를 사용하고 있습니다. NodeSet을 사용하면 모든 텍스트가 단일 문자열로 연결됩니다. NodeSet.inner_text AKA textdocumentation 당 :

개체를 모두 포함 된 노드의 내부 텍스트를 얻고 실제 코드는 다음과 같습니다

def inner_text 
    collect(&:inner_text).join('') 
end 

text AKA Node.content 반면, 또는 inner_text

반환이에이 노드

묵상을위한 내용 : 이전 라인으로 단순화 할 수

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

대신

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(&:text) # => ["foo", "bar"] 

"How to avoid joining all text from Nodes when scraping"도 참조하십시오.

+0

고마워, 나는 그것을 지금 이해한다! – Eric

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"] 
+0

너무 좋아, 고마워요 @ rwaffen, 그것도 작동합니다! 미안 해요. 루비를 배우고 있어요. 그래서 멍청한 데요. – Eric

+1

아마도'names = Nokogiri :: HTML (mypage) .css (".name a"). map (& : text)' –

+0

@Eric 당신은 사과하지 않아야합니다. Nokogiri가 NodeSet 객체에서'text'라고 부르는 상황이 조금 반 직관적입니다. –