-1

是否有一个库可以将 HTML 解析为 String 对象,可以是 Java、C# 或任何其他编程语言。

这是我的情况:

我有一些来自所见即所得编辑器的文档,其中包含一些基本的 html 标签,例如<p><br>

<p>This &nbsp;</p><font>etc</font><br>
<span> and this, etc.

当导出到其他工具时,它会转换为纯文本,使其不可读。我现在正在做的是:“全选”>“另存为 x.html”>“在浏览器中打开”>“全选”>“粘贴”

我知道这可以通过程序自动化。

有图书馆可以做到这一点吗?也就是说,要“渲染”简单的 HTML?最好是一个字符串,我可以把它放到我的剪贴板中。删除 html 标签是不够的,因为我会得到一个很长的行而没有回车。

4

4 回答 4

1

对于 Python,您可以使用实体 refs 扩展这个出色的功能来做您似乎需要的事情;

from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def handle_entityref(self, name):
        self.fed.append(unichr(name2codepoint[name]))
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

print strip_tags('<html>olle&lt;</br>')
 olle<
于 2012-10-23T16:00:25.687 回答
1

在java中你可以使用http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/text/html/parser/DocumentParser.html

您可以提供 ParserCallback 来处理文本并忽略标签。

于 2012-10-23T15:51:34.417 回答
0

有两种方法可以做到:

  1. 编写任意复杂的解析器来清理数据。这是其他答案所建议的。如果您的输入不是非常核心,这通常是快速获胜。

  2. 但是,如果您有非常复杂的输入并且想要“高保真”,则可以使用“真实”浏览器。

一个非常简单的选择是使用PhantomJS。这是一个用于从网页中提取文本的示例:innerText

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://www.httpuseragent.org', function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        var ua = page.evaluate(function () {
            return document.getElementById('myagent').innerText;
        });
        console.log(ua);
    }
    phantom.exit();
});

还有诸如WebBrowser 类(MSIE) 或GeckoFX之类的选项。不过,我怀疑沿着这些路径走下去的学习曲线会非常陡峭。

于 2012-10-23T16:15:05.790 回答
0

如果我做对了,您想删除所有 html 标签,使用 C# 很容易:

var plainText = Regex.Replace(htmlString.Replace("<br>", Environment.NewLine).Replace("&nbsp;", " "), @"<[^>]*>", String.Empty);
于 2012-10-23T15:36:42.283 回答