2010-06-30 4 views
3

표시되는 웹 페이지에서 Gmail 채팅 로그를 구문 분석하는 가장 좋은 방법은 무엇입니까? 내가 아는 한, 이것은 데스크톱 Gmail 또는 모바일 Gmail을 통해 서버 호스팅 Gmail 채팅 로그에 액세스하는 유일한 방법입니다.웹 페이지에서 Gmail 채팅 로그를 구문 분석하는 방법은 무엇입니까?

대화가 이루어지는 생성 된 소스를 보면 마크 업은 중첩 된 div 및 스팬처럼 보입니다 (페이지의 다른 부분에서는 패턴이없는 두 개의 문자 ID 및 클래스가 무작위로 나타납니다). 여기 왼쪽에 타임 스탬프가있는 라인에서 발췌 한 것입니다 :

<div> 
<span style="display:block;float:left;color:#888"> 
2:56 PM&nbsp; 
</span> 

<span style="display:block;padding-left:6em"> 
<span> 

<span style="font-weight:bold">me</span>: i'm trying to think of a good way to parse gmail chat logs 

</span> 
</span> 
</div> 

그러나 타임 스탬프의 모든 라인이없는, 그래서 하나없는 사람은 그 자리에 공백 줄 바꿈 배치 할 것 :

<div> 
<span style="display:block;float:left;color:#888"> 
&nbsp;&nbsp; 
</span> 

<span style="display:block;padding-left:6em"> 

<span> 
and reformat that into something like an xml format 
</span> 

</span> 
</div> 

을해야 하는가 XPath를 사용합니까? 더 효율적인 것이 있습니까?

편집 :

데이터는,이는 모습입니다로서 :

12:43 AM John: Something something something. 
     Something something something. 
     me: Something something something? 
12:44 AM Also, something something something. 
12:47 AM Something something something. 
12:48 AM Something something something 
     with something something something. 
12:49 AM John: Something. 
+0

당신은 당신이 원하는 어떤 노드 언급하는 것을 잊었다 선택 하시겠습니까? –

+0

이름, 대화 줄 및 타임 스탬프를 가져 가고 싶습니다. 그래서 모든 행은 [time] [name] [something said] 일 수 있습니다. 여기서 시간은 선택 사항이며 명시 적으로 작성되지 않은 곳에는 이름이 채워집니다. – chimerical

답변

1

내가 XPath를 사용해야합니까? 가 더 효율적입니까?

나는 노코 기리 라이브러리와 루비를 사용합니다

, 그것은 단지의 XPath/XSLT 것보다 훨씬 더 많은 유연성을 제공 :

#!/usr/bin/ruby 
require 'rubygems' 
require 'nokogiri' 

src = <<EOS 
<div> 
    <span style="display:block;float:left;color:#888"> 
     2:56 PM&nbsp; 
    </span> 
    <span style="display:block;padding-left:6em"> 
     <span> 
      <span style="font-weight:bold">me</span>: i'm trying to think of a good way to parse gmail chat logs 
     </span> 
    </span> 
    <span style="display:block;float:left;color:#888"> 
     &nbsp;&nbsp; 
    </span> 
    <span style="display:block;padding-left:6em"> 
     <span> 
      and reformat that into something like an xml format 
     </span> 
    </span> 
</div> 
EOS 

chatlog = [] 
last_timestamp = nil 
doc = Nokogiri::HTML(src) 

doc.xpath('//div/span').each do |span| 
    style = span.attributes['style'].value 

    if style.include?('color:') 
     last_timestamp = span.content.strip 
    elsif style.include?('padding-left:') 
     chatlog << {:timestamp => last_timestamp, :message => span.content.strip} 
    end 
end 

builder = Nokogiri::XML::Builder.new do |doc| 
    doc.chatlog { 
     chatlog.each do |line| 
      doc.line { 
       doc.time line[:timestamp] 
       doc.message line[:message] 
      } 
     end 
    } 
end 

결과 :

<?xml version="1.0" encoding="UTF-8"?> 
<chatlog> 
    <line> 
    <time>2:56 PM </time> 
    <message>me: i'm trying to think of a good way to parse gmail chat logs</message> 
    </line> 
    <line> 
    <time>  </time> 
    <message>and reformat that into something like an xml format</message> 
    </line> 
</chatlog> 
관련 문제