用Python将HTML转换为文本
我正在尝试用Python把一个HTML块转换成文本。
输入:
<div class="body"><p><strong></strong></p>
<p><strong></strong>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa</p>
<p>Consectetuer adipiscing elit. <a href="http://example.com/" target="_blank" class="source">Some Link</a> Aenean commodo ligula eget dolor. Aenean massa</p>
<p>Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa</p>
<p>Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa</p></div>
想要的输出:
这是一些示例文本,内容是Lorem ipsum dolor sit amet,接下来是一些关于教育的内容。Aenean commodo ligula让人感到愉快。Aenean massa
这是关于教育的内容。还有一些链接,Aenean commodo ligula让人感到愉快。Aenean massa
Aenean massa。Lorem ipsum dolor sit amet,接下来是一些关于教育的内容。Aenean commodo ligula让人感到愉快。Aenean massa
Lorem ipsum dolor sit amet,接下来是一些关于教育的内容。Aenean commodo ligula让人感到愉快。Aenean massa
这是关于教育的内容。Aenean commodo ligula让人感到愉快。Aenean massa
我尝试使用了html2text
模块,但效果不太好:
#!/usr/bin/env python
import urllib2
import html2text
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://example.com/page.html').read())
txt = soup.find('div', {'class' : 'body'})
print(html2text.html2text(txt))
这个txt
对象生成了上面的HTML块。我想把它转换成文本并在屏幕上打印出来。
18 个回答
10
主要的问题是如何保持一些基本的格式。这里是我自己的一个简单方法,可以保持换行和项目符号。我相信这不是解决你所有需求的办法,但可以作为一个起点:
from bs4 import BeautifulSoup
def parse_html(html):
elem = BeautifulSoup(html, features="html.parser")
text = ''
for e in elem.descendants:
if isinstance(e, str):
text += e.strip()
elif e.name in ['br', 'p', 'h1', 'h2', 'h3', 'h4','tr', 'th']:
text += '\n'
elif e.name == 'li':
text += '\n- '
return text
上面的代码为 'br', 'p', 'h1', 'h2', 'h3', 'h4', 'tr', 'th'
这些元素添加了换行,并且在 li
元素前面加上 -
也会换行。
41
可以使用Python自带的html.parser
来实现这个功能:
from html.parser import HTMLParser
class HTMLFilter(HTMLParser):
text = ""
def handle_data(self, data):
self.text += data
f = HTMLFilter()
f.feed(data)
print(f.text)
142
soup.get_text()
会输出你想要的内容:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
print(soup.get_text())
输出结果:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa
Consectetuer adipiscing elit. Some Link Aenean commodo ligula eget dolor. Aenean massa
Aenean massa.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa
Consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa
如果想保留换行符:
print(soup.get_text('\n'))
为了和你的例子完全一样,你可以把一个换行符替换成两个换行符:
soup.get_text().replace('\n','\n\n')