2010-06-30 3 views
3

Quelle serait la meilleure façon d'analyser les journaux de chat Gmail à partir de la page Web où il est affiché? Pour autant que je sache, c'est toujours le seul moyen d'accéder aux journaux de chat Gmail hébergés sur le serveur (via Gmail de bureau ou Gmail mobile). Lorsque vous regardez la source générée où la conversation a lieu, le balisage ressemble à des divs et span imbriqués (et les divs ailleurs sur la page ont des identifiants aléatoires à deux caractères et des classes sans motif). Voici un extrait d'une ligne qui a un horodatage à gauche:Comment analyser les journaux de chat Gmail à partir de la page Web?

<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> 

Mais pas chaque ligne a un horodatage, de sorte que ceux sans un semblent placer des espaces insécables à sa place:

<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> 

Si J'utilise XPath? Y a-t-il quelque chose de plus efficace?

Edit:

Comme les données seulement, voici ce qu'il ressemble à:

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

Vous avez oublié de mentionner nœuds que vous voulez pour sélectionner? –

+0

Je voudrais saisir les noms, les lignes de conversation et les horodatages. Ainsi, chaque ligne sera éventuellement [heure] [nom] [quelque chose a dit], où le temps est facultatif et le nom est rempli partout où non écrit explicitement. – chimerical

Répondre

1

Dois-je utiliser XPath? Y at-il quelque chose de plus efficace?

J'utiliser Ruby avec la bibliothèque Nokogiri, il vous donne beaucoup plus de flexibilité que de 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 

Retours:

<?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> 
Questions connexes