【问题标题】:Fastest way of getting OpenGraph metatags from HTML?从 HTML 获取 Open Graph 元标记的最快方法?
【发布时间】:2013-02-08 17:16:35
【问题描述】:

Beautiful Soup 效率不够,所以我尝试使用纯lxml。但是,lxml.html.fromstring 有问题 (it suddenly eats 100% RAM after some time),所以我需要以其他方式进行操作(而不是使用 fromstring)。

我可以使用 API 中的任何其他模块吗?我想不通,而且互联网上的例子几乎为零。

这就是我现在正在做的,但正如我所说,我需要替换fromstring

        mySearchTree = fromstring(data)
        metas = {}
        n = -1
        for a in mySearchTree.cssselect('meta'):
            n += 1
            metas[n] = {}
            for b in a.items():
                metas[n][b[0]] = b[1]
        y = 0
        tag = []
        for m in metas:
            if 'property' in metas[m] and 'content' in metas[m]:
                if 'og:' in metas[m]['property']:
                    y += 1
                    tag.append({metas[m]['property'] : metas[m]['content']})

        for x in tag:
            for y in x:
                #print '%s ==> %s' % (y, x[y])
                self.rj[y] = x[y]

任何指针都非常感谢!

【问题讨论】:

  • 看看etree.iterparse。如果使用得当,它会很好地工作。我在 20mb 的 RAM 中解析了一个 10GB 的 XML 文件。
  • 它也适用于 HTML 吗?

标签: python html parsing facebook-opengraph lxml


【解决方案1】:

由于 OpenGraph 标签通常位于 HTML 文档的开头,因此您只能读取和解析输入文件的一部分。我认为HEAD 部分很大的可能性非常小(尽管您的研究可能会导致不同的意见,具体取决于您的样本)。

  1. 设置块大小(例如 1024 字节)。
  2. 逐块读取输入文件(类似于stream.read(1024)),直到缓冲区中存在</head>(或</HEAD>,或<body>等)。决定限制 - 在输入损坏且没有标头左右的情况下最大读取的字节数,因此您可以尽快放弃消耗大量内存。
  3. 使用lxml.html解析器读取你缓存的片段(无效,但没关系,lxml可以处理,不会影响我们的目标)。
  4. 现在,您有lxml DOM 对象和HTML 文件的头部。它是高效创建的,没有过多内存消耗的风险。您可以进行任何搜索、提取等操作。我会使用 xpath,但请随意使用您在问题中上面提供的时髦的 DOM 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2016-10-11
    • 2016-04-30
    • 1970-01-01
    • 2012-01-15
    • 2015-03-02
    相关资源
    最近更新 更多