从网页中删除除文本之外的所有内容的最佳方法是啥?

Posted

技术标签:

【中文标题】从网页中删除除文本之外的所有内容的最佳方法是啥?【英文标题】:Best way to strip out everything but text from a webpage?从网页中删除除文本之外的所有内容的最佳方法是什么? 【发布时间】:2011-02-28 00:07:42 【问题描述】:

我正在寻找一个 html 页面并仅提取该页面上的纯文本。任何人都知道在python中做到这一点的好方法吗?

我想从字面上删除所有内容,只留下文章的文本以及标签之间的其他文本。 JS、css等……没了

谢谢!

【问题讨论】:

【参考方案1】:

这里的第一个答案不会删除页面中的 CSS 或 javascript 标记的正文(未链接)。这可能会更接近:

def stripTags(text):
  scripts = re.compile(r'<script.*?/script>')
  css = re.compile(r'<style.*?/style>')
  tags = re.compile(r'<.*?>')

  text = scripts.sub('', text)
  text = css.sub('', text)
  text = tags.sub('', text)

  return text

【讨论】:

【参考方案2】:

这是我发现的剥离 CSS 和 JavaScript 最干净、最简单的解决方案:

''.join(BeautifulSoup(content).findAll(text=lambda text: 
text.parent.name != "script" and 
text.parent.name != "style"))

https://***.com/a/3002599/1203188Matthew Flaschen

【讨论】:

【参考方案3】:

我也会推荐 BeautifulSoup,但我会建议使用类似 this question 的答案的内容,我将在此处复制给那些不想看那里的人:

soup = BeautifulSoup.BeautifulSoup(html)
texts = soup.findAll(text=True)

def visible(element):
    if element.parent.name in ['style', 'script', '[document]', 'head', 'title']:
        return False
    elif re.match('<!--.*-->', str(element)):
        return False
    return True

visible_texts = filter(visible, texts)

例如,我在此页面上尝试过,效果很好。

【讨论】:

【参考方案4】:

lxml.html 模块值得考虑。但是,删除 CSS 和 JavaScript 需要花费一些时间:

def stripsource(page):
    from lxml import html

    source = html.fromstring(page)
    for item in source.xpath("//style|//script|//comment()"):
        item.getparent().remove(item)

    for line in source.itertext():
        if line.strip():
            yield line

产生的行可以简单地连接,但这可能会丢失重要的 单词边界,如果空格生成周围没有任何空格 标签。

您可能还想仅迭代 &lt;body&gt; 标记,具体取决于您的要求。

【讨论】:

【参考方案5】:

你可以试试相当优秀的Beautiful Soup

f = open("my_source.html","r")
s = f.read()
f.close()
soup = BeautifulSoup.BeautifulSoup(s)
txt = soup.body.getText()

但请注意:您从任何解析尝试中得到的结果都将受到“错误”的影响。糟糕的 HTML、糟糕的解析和一般的意外输出。如果您的源文档众所周知并且呈现良好,那么您应该没问题,或者至少能够解决其中的特质,但如果它只是“在互联网上”发现的一般东西,那么期待各种奇怪和奇妙的异常值。

【讨论】:

我尝试使用美丽的汤,但由于没有 bueno 的坏 html,它有很大比例的时间异常【参考方案6】:

根据here:

def remove_html_tags(data):
     p = re.compile(r'<.*?>')
     return p.sub('', data)

正如他在文章中所说,“需要导入 re 模块才能使用正则表达式。”

【讨论】:

狼会因为这个而得到你。 是的,通常我反对使用正则表达式来解析 HTML,但这似乎是一种足够简单的方法。 但当然它也会剥离代码示例......如果有的话......只是一个想法:) 嗯 - 没有摆脱 javascript,只是 不会像在 yahoo.com 上那样剥离 css、javascript 或嵌入的东西

以上是关于从网页中删除除文本之外的所有内容的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP 中的字符串中删除除字母数字字符之外的所有内容

如何从表中删除除前两个和最后一个之外的所有行?

如何从字符串中删除除字母、数字、空格、感叹号和问号之外的所有内容?

从 Python3.3 中的字符串中删除除字母和空格之外的所有内容

如何从文件名中删除除括号内容之外的所有内容

从 UITableViewCell 中删除除 imageView 之外的所有子视图