【问题标题】:Split Twitter RSS string using Python使用 Python 拆分 Twitter RSS 字符串
【发布时间】:2009-08-30 17:38:25
【问题描述】:

我正在尝试使用 Python 解析 Twitter RSS 提要并将信息放入 sqlite 数据库中。这是一个例子:

MiamiPete: today's "Last Call" is now up http://bit.ly/MGDzu #stocks #stockmarket #finance #money

我要做的是为主要内容 (Miami Pete…now up) 创建一列,为 URL (http://bit.ly/MGDzu) 创建一列,为主题标签(股票、股市、金融、货币)创建四个单独的列。我一直在玩弄如何做到这一点。

任何建议将不胜感激!

附:下面是我一直在玩的一些代码——你可以看到我最初尝试创建一个名为“tiny_url”的变量并将其拆分,它似乎确实这样做了,但是这种微弱的尝试并没有接近解决所提到的问题多于。 :)

def store_feed_items(id, items):
    """ Takes a feed_id and a list of items and stored them in the DB """
    for entry in items:
        c.execute('SELECT entry_id from RSSEntries WHERE url=?', (entry.link,))
        tinyurl = entry.summary    ### I added this in
        print tinyurl.split('http') ### I added this in 
        if len(c.fetchall()) == 0:
            c.execute('INSERT INTO RSSEntries (id, url, title, content, tinyurl, date, tiny) VALUES (?,?,?,?,?,?,?)', (id, entry.link, entry.title, entry.summary, tinyurl, strftime("%Y-%m-%d %H:%M:%S",entry.updated_parsed), tiny ))

【问题讨论】:

    标签: python string sqlite split bit.ly


    【解决方案1】:

    您的数据驱动设计似乎存在相当大的缺陷。除非您的所有条目都有文本部分、一个 url 和最多 4 个标签,否则它不会起作用。

    您还需要将保存到 db 与解析分开。使用正则表达式(甚至字符串方法)可以轻松完成解析:

    >>> s = your_string
    >>> s.split()
    ['MiamiPete:', "today's", '"Last', 'Call"', 'is', 'now', 'up', 'http://bit.ly/MGDzu', '#stocks', '#stockmarket', '#finance', '#money']
    >>> url = [i for i in s.split() if i.startswith('http://')]
    >>> url
    ['http://bit.ly/MGDzu']
    >>> tags = [i for i in s.split() if i.startswith('#')]
    >>> tags
    ['#stocks', '#stockmarket', '#finance', '#money']
    >>> ' '.join(i for i in s.split() if i not in url+tags)
    'MiamiPete: today\'s "Last Call" is now up'
    

    不过,单表数据库设计可能不得不放弃。

    【讨论】:

    • 感谢 SilentGhost!我非常感谢详细的回复。如您所知,我刚刚开始学习python。如果您不介意,我还有几个后续问题(请参阅下面的附加帖子)。
    • 好的,我已经阅读了第一和第二范式——好东西!我认为这个特定项目的关键教训是我想要一个包含“entry_id”列的表(与我的核心数据表中的 rss entry_id 相同)和“hashtags”的第二列。这样,如果有多个主题标签,每个 entry_id 将有多行。看起来对吗?
    • 听起来很对,别忘了你的网址,它们与主题标签没有什么不同,所以需要自己的表格。
    • 关于url,即使每个rss条目中最多有1个url也是如此吗?
    • 好吧,如果你可以依赖这样的假设并准备好处理后果,那么当然,空字符串或任何其他默认值都可以。
    【解决方案2】:

    此外,您可以使用正则表达式解析字符串:

    >>> s = (u'MiamiPete: today\'s "Last Call" is now up http://bit.ly/MGDzu '
             '#stocks #stockmarket #finance #money')
    >>> re.match(r'(.*) (http://[^ ]+)', s).groups()
    (u'MiamiPete: today\'s "Last Call" is now up', u'http://bit.ly/MGDzu')
    >>> re.findall(r'(#\w+)', s)
    [u'#stocks', u'#stockmarket', u'#finance', u'#money']
    

    【讨论】:

    • 谢谢!我从未使用过正则表达式,但它们确实看起来很有希望。现在可能是个好时机。 :)
    【解决方案3】:

    Twitter 有一个 API,您可以在这里更方便地使用,http://apiwiki.twitter.com/Twitter-API-Documentation

    您可以获取 JSON 或 XML 格式的结果,并使用众多 Python 库之一来解析结果。

    或者,如果您必须使用 RSS,则可以使用 Python 提要解析器,例如 http://www.feedparser.org/

    【讨论】:

    • 感谢您的回复,杰森。我也是 API 的新手,所以我希望能更多地了解它们。
    【解决方案4】:

    我强烈推荐使用 Twitter API。实际上有两个 API,一个用于主推特服务器,一个用于搜索服务器。它们用于不同的事情。

    您可以在 svn 上找到示例代码 pytwitter。添加 simplejson,您可以在几分钟内完成非常强大的事情。

    祝你好运

    【讨论】:

    • 谢谢,特里克。我去看看!
    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多