Как разобрать логи чата Gmail со страницы? - PullRequest
3 голосов
/ 30 июня 2010

Каков наилучший способ анализа журналов чата Gmail со страницы, на которой он отображается?Насколько я знаю, это все еще единственный способ получить доступ к серверным журналам чата Gmail (через Gmail на рабочем столе или через мобильную Gmail).

При просмотре сгенерированного источника, где происходит разговор, разметкавыглядит как вложенные div и span (и div в других местах на странице имеют рандомизированные двухсимвольные идентификаторы и классы без шаблона).Вот отрывок из строки, которая имеет временную метку слева:

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

Но не каждая строка имеет временную метку, поэтому те, у кого ее нет, ставят неразрывные пробелы на свое место:

Должен ли я использовать 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.

1 Ответ

1 голос
/ 04 февраля 2011

Должен ли я использовать XPath? Есть что-то эффективнее?

Я бы использовал Ruby с библиотекой Nokogiri, это дает вам гораздо больше гибкости, чем просто 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>
...