有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在安卓中使用jsoup删除html实体

我使用jsoup来抓取HTML。我在从以下类型的html标记中提取信息时遇到问题:

<span class="some">&#8237;&#8237;78&#8236;&#8236;</span>

应该只是

<span class="some">78‬‬</span>

如何从字符串中删除HTML实体


共 (1) 个答案

  1. # 1 楼答案

    我不熟悉jsoup,但如果它是一个“正常”的HTMLDOM解析器,返回一个“标准”的HTMLDOM,那么你想要的就不可能了。问题是,一旦构建了DOM,它就无法区分正常编码的字符和表示为实体的字符

    例如:<span>A</span><span>&#65;</span>被认为是完全相同的,在DOM中一次也无法区分——这两个元素都是span元素,包含一个带有文本A的文本节点

    因此,您可以在所有文本节点上循环搜索并替换这些字符(而不是实体):

    void removeInvalidChars(Element element) {
      for (Node child : element.childNodes()) {
        if (child instanceof TextNode) {
          TextNode textNode = (TexNode) child;
          textNode.text( textNode.text().replaceAll("\u202C", "").replaceAll("\u202D", "") );
          // 202C and 202D are the hex codes for the decimal values 8236 and 8237
        } else if (child instanceof Element) {
           removeInvalidChars((Element) child);
        }
      }
    }
    

    如果需要区分原始字符和实体,则需要使用不同的非DOM(例如基于事件的)HTML解析器