1

我需要用 python 做一些 HTML 解析。经过一些研究,lxml 似乎是我最好的选择,但我很难找到可以帮助我完成我想做的事情的例子。这就是我听到的原因。我需要为所有可见文本抓取一个页面.. 去掉所有标签和 javascript.. 我需要它给我留下可见的文本。听起来很简单.. 我用 HTMLParser 做到了,但它不能很好地处理 javascript

class HTML2Text(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.output = cStringIO.StringIO()

    def get_text(self):
        return self.output.getvalue()

    def handle_data(self, data):
        self.output.write(data)

def ParseHTML(source):
    p = HTML2Text()
    p.feed(source)
    text = p.get_text()
    return text

任何关于使用 lxml 或更好的方法来做到这一点的想法 HTMLParser .. HTMLParser 将是最好的,因为不需要额外的库 .. 谢谢大家

斯科特 F。

4

5 回答 5

4

我知道没有屏幕抓取库“与 Javascript 配合得很好”——很难预测 JS 可以动态、有条件地改变 HTML DOM 的所有方式。

于 2009-05-02T05:47:06.650 回答
2

scrape.py可以为你做到这一点。

它很简单:

import scrape
s = scrape.Session()
s.go('yoursite.com')
print s.doc.text

跳转到本视频的 2:40 左右,从 scrape.py 的创建者那里获得精彩的概述: pycon.blip.tv/file/3261277

于 2010-04-08T21:02:24.197 回答
0

我知道没有 Python HTML 解析库可以处理正在解析的页面中运行的 javascript。由于 Alex Martelli 等人给出的原因,这还不够“简单”。

对于这个任务,您可能需要考虑到一个更高的层次,而不仅仅是解析 HTML 并查看 Web 应用程序测试框架。

两个可以执行 javascript 并且基于 Python 或可以与 Python 交互:

不幸的是,我不确定这些框架的“单元测试”方向是否真的会让你刮掉可见的文本。

所以唯一的其他解决方案是自己做,比如将python-spidermonkey集成到你的应用程序中。

于 2009-05-02T09:40:04.577 回答
0

BeautifulSoup ( http://www.crummy.com/software/BeautifulSoup/ ) 通常是 Python html 抓取问题的正确答案。

于 2009-05-02T08:33:29.900 回答
0

我认为,您的代码在某种程度上很聪明且非常灵活。

简单地添加 handle_starttag() 和 handle_endtag() 来抑制 <script> 块怎么样?

class HTML2Text(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.output = cStringIO.StringIO()
        self.is_in_script = False
    def get_text(self):
        return self.output.getvalue()
    def handle_data(self, data):
        if not self.is_in_script:
            self.output.write(data)
    def handle_starttag(self, tag, attrs):
        if tag == "script":
            self.is_in_script = True
    def handle_endtag(self, tag):
        if tag == "script":
            self.is_in_script = False

def ParseHTML(source):
    p = HTML2Text()
    p.feed(source)
    text = p.get_text()
    return text
于 2009-09-05T14:47:08.087 回答