2012-06-08 126 views
-3

可能重复:
Extracting text from HTML file using Python
Parsing Source Code (Python) Approach: Beautiful Soup, lxml, html5lib difference?从HTML标记中提取文本?

目前有大量网页的源代码〜20万线的几乎所有的(如果不是全部)HTML。更具体地说,它是一个网页,其内容是通过换行符分隔的几千个文本块(虽然换行并不特别意味着内容有分隔)

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

为此,我正在使用urllib2,并在Beautiful Soup中调用.get_text()。问题是,Beautiful Soup在我的代码中留下了大量的空白空间,并且很难将结果传递给第二个“文本”解析器。我已经做了很多关于解析HTML的研究,但坦率地说我不知道​​如何轻松解决这个问题。此外,我对如何使用像lxml这样的导入来提取文本感到困惑。

tl;博士:是否有任何可能的方式来实现结果,就像我在网页上选择全部,复制,粘贴一样?

+2

为了清楚起见,HTML不是源代码。这是标记。 –

+0

如果你有一个解决方案,但唯一的问题是有太多的空白空间,你不能只删除额外的空白空间?试试're.sub(r“\ s +”,“”,text)'。 –

+0

- 大卫感谢您的更正! @GregHewgill这将删除原始网页中存在的节距否?另一个解析函数在函数中使用这些空白作为各种分隔符,所以我不想删除它们。 ): – zhuyxn

回答

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。您可以修改任何想要显示不同部分,不同格式等的方法。只需根据您的喜好更改基本类,我的代码应该让您开始正确的路径。