-3

可能重复:
使用 Python 解析源代码 (Python) 方法从 HTML 文件中提取文本
:Beautiful Soup、lxml、html5lib 的区别?

目前有一个大型网页,其源代码是大约 200,000 行几乎所有(如果不是全部)HTML。更具体地说,它是一个网页,其内容是由换行符分隔的几千块文本(尽管换行符并不具体意味着内容中有分隔)

我的主要目标是从源代码中提取文本,就像我将网页复制/粘贴到文本编辑器中一样。我想使用另一个解析函数,它最初接收复制/粘贴的文本而不是源代码。

为此,我目前正在使用 urllib2,并在 Beautiful Soup 中调用 .get_text()。问题是,Beautiful Soup 在我的代码中留下了大量的空白,并且很难将结果传递给第二个“文本”解析器。我已经对解析 HTML 进行了大量研究,但坦率地说,我不确定如何轻松解决这个问题。此外,我对如何使用 lxml 之类的导入来提取文本有点困惑。

tl; 博士:有没有什么可能的方法来实现一个结果,就像我在网页上做了全选、复制、粘贴一样?

4

2 回答 2

1

听起来您想将 HTML 呈现为文本,而不是提取各种标签的内容。

如果是这种情况,请考虑将其中一个作为Python 代码中的子进程运行:

  • links -html-numbered-links 1 -html-images 1 -dump "file://$@"
  • lynx -force_html -dump "$@"
  • w3m -T text/html -F -dump "$@"
于 2012-06-08T05:01:14.793 回答
0

您是否尝试过查看 HTML 解析器。如果您只想要不带标记符号的 html 页面的内容,则可以使用:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tags = []
        self.attrs = []
    def handle_starttag(self, tag, attrs):
        self.tags.append(tag)
        self.attrs.append(attrs)
    def handle_endtag(self, tag):
        if tag not in self.tags:return
        for x in reversed(self.tags):
            self.tags.pop()
            self.attrs.pop()
            if tag == x:return
    def handle_data(self, data):
        print data

parser = MyHTMLParser()
f = file("temp.html")
parser.feed(f.read())
f.close()

这将解析 html 页面内的数据。<div><h1>This is my webpage</h1><div></div></div>将打印为This is my webpage. 您可以修改任何您想显示不同部分、不同格式等的方法。只需根据自己的喜好更改基本类,我的代码应该让您开始走上正确的道路。

于 2012-06-08T06:05:53.173 回答