【问题标题】:How to parse Gmail chat logs from webpage?如何从网页解析 Gmail 聊天记录?
【发布时间】:2010-06-30 17:39:09
【问题描述】:

从显示它的网页解析 Gmail 聊天日志的最佳方法是什么?据我所知,这仍然是访问服务器托管的 Gmail 聊天日志的唯一方法(通过桌面版 Gmail 或移动版 Gmail)。

查看发生对话的生成源时,标记看起来像嵌套的 div 和 span(页面上其他地方的 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.

【问题讨论】:

  • 您忘了说要选择哪些节点?
  • 我想要获取姓名、对话行和时间戳。所以每一行都可能是 [time] [name] [something said],其中 time 是可选的,并且 name 在没有明确写入的地方填写。

标签: html xpath gmail chat logging


【解决方案1】:

我应该使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多