from mechanize import Browser
br = Browser()
br.open('http://somewebpage')
html = br.response().readlines()
for line in html:
print line
当在HTML文件中打印一行时,我试图找到一种方法,只显示每个HTML元素的内容,而不是格式本身。如果它发现'<a href="等等。例如">some text</a>',它只会打印'some text', '<b>hello</b>'打印'hello',等等。该怎么做呢?
我已经成功地在Python 3.1中使用了Eloff的答案[非常感谢!]。
我升级到Python 3.2.3,并遇到了错误。
解决方案,这里提供感谢响应器Thomas K,是插入super().__init__()到以下代码:
def __init__(self):
self.reset()
self.fed = []
... 为了让它看起来像这样:
def __init__(self):
super().__init__()
self.reset()
self.fed = []
... 它适用于Python 3.2.3。
再次感谢Thomas K的修复和Eloff提供的原始代码!
你可以使用BeautifulSoup get_text()特性。
from bs4 import BeautifulSoup
html_str = '''
<td><a href="http://www.fakewebsite.example">Please can you strip me?</a>
<br/><a href="http://www.fakewebsite.example">I am waiting....</a>
</td>
'''
soup = BeautifulSoup(html_str)
print(soup.get_text())
#or via attribute of Soup Object: print(soup.text)
建议显式地指定解析器,例如BeautifulSoup(html_str, features="html.parser"),以便输出可重现。
使用HTML-Parser的解决方案都是可破坏的,如果它们只运行一次:
html_to_text('<<b>script>alert("hacked")<</b>/script>
结果:
<script>alert("hacked")</script>
你想要阻止什么。如果你使用HTML-Parser,计数标签直到0被替换:
from HTMLParser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.fed = []
self.containstags = False
def handle_starttag(self, tag, attrs):
self.containstags = True
def handle_data(self, d):
self.fed.append(d)
def has_tags(self):
return self.containstags
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
must_filtered = True
while ( must_filtered ):
s = MLStripper()
s.feed(html)
html = s.get_data()
must_filtered = s.has_tags()
return html
使用BeautifulSoup, html2text或来自@Eloff的代码,大多数时候,它仍然是一些html元素,javascript代码…
所以你可以使用这些库的组合并删除markdown格式(Python 3):
import re
import html2text
from bs4 import BeautifulSoup
def html2Text(html):
def removeMarkdown(text):
for current in ["^[ #*]{2,30}", "^[ ]{0,30}\d\\\.", "^[ ]{0,30}\d\."]:
markdown = re.compile(current, flags=re.MULTILINE)
text = markdown.sub(" ", text)
return text
def removeAngular(text):
angular = re.compile("[{][|].{2,40}[|][}]|[{][*].{2,40}[*][}]|[{][{].{2,40}[}][}]|\[\[.{2,40}\]\]")
text = angular.sub(" ", text)
return text
h = html2text.HTML2Text()
h.images_to_alt = True
h.ignore_links = True
h.ignore_emphasis = False
h.skip_internal_links = True
text = h.handle(html)
soup = BeautifulSoup(text, "html.parser")
text = soup.text
text = removeAngular(text)
text = removeMarkdown(text)
return text
这对我来说很有效,但当然还可以增强……