从html中提取文本:使用dom解析器寻找类似sax的解析器或建议

时间:2012-09-08 10:37:11

标签: java android

我有一个以这种方式格式化的html文档:

<p>
 some plain text <em>some emphatized text</em>, <strong> some strong text</strong>
</p>
<p>
 just some plain text
</p>
<p>
  <strong>strong text </p> followed by plain, <a>with a link at the end!</a>
</p>

我想提取文字。使用dom之类的解析器,我可以提取每个段落

,但问题在于:我必须从内部标签中提取文本,并在上面的例子中得到一个具有相同顺序的结果字符串,段落,我想提取:

some plain text some emphatized text, some strong text

为了这个目的,我认为像解析器这样的sax会比dom更好,因为我不知道内部标签的数字序列:一个段落可以有零个或多个不同类型的内部标签。

3 个答案:

答案 0 :(得分:0)

您可以使用dom解析器,将p标签内的文本(包括子html元素)放入字符串变量中,并使用其他一些功能从结果字符串中删除所有html标记。这应该为您提供p标签之间的所有内容,而不包含任何子元素标签。

示例

<p>
    some plain text <em>some emphatized text</em>, <strong> some strong text</strong>
</p>
<p>
    just some plain text
</p>
<p>
    <strong>strong text </p> followed by plain, <a>with a link at the end!</a>
</p>

使用一些dom解析器将p标签提取到字符串,然后你会得到一个像这样的字符串:

String content = "some plain text <em>some emphatized text</em>, <strong> some strong text</strong>";
content = stripHtmlTags( content );
println( content ); // some plain text some emphatized text, some strong text

答案 1 :(得分:0)

String extractedText = Html.fromHtml(您的HTML字符串).toString()

这给你提取的文字.. 希望这能帮助你。

答案 2 :(得分:0)

Add code to read CDATA by DOM pase
**childNode.getNodeType() == Node.CDATA_SECTION_NODE**

if Using XMLUtils modify like

public static String getNodeValue(Node node) {
        node.normalize();
        String response = node.getNodeValue();
        if (response != null) {
            return response;
        } else {
            NodeList list = node.getChildNodes();
            int size = list == null ? 0 : list.getLength();
            for (int j = 0; j < size; j++) {
                Node childNode = list.item(j);
                if (childNode.getNodeType() == Node.TEXT_NODE
                        || childNode.getNodeType() == Node.CDATA_SECTION_NODE) {
                    response = childNode.getNodeValue();
                    return response;
                }
            }
        }
        return "";
    }