Java中用正则从HTML标签中提取文本2种方法

在 Java 中处理HTML内容时,从 HTML 标记中提取特定文本是很常见的。虽然由于结构复杂,通常不鼓励使用正则表达式(regex) 来解析 HTML,但有时它足以完成简单的任务。

在本教程中,我们将了解如何使用 Java 中的正则表达式从 HTML 标签中提取文本。

1、使用模式和匹配器类 Java 提供了java.util.regex中的Pattern和Matcher类,允许我们定义和应用正则表达式来从字符串中提取文本。下面是如何使用正则表达式从指定 HTML 标记中提取文本的示例:

@Test
void givenHtmlContentWithBoldTags_whenUsingPatternMatcherClasses_thenExtractText() {
    String htmlContent = "<div>This is a <b>Jdon</b> article for <b>extracting text</b> from HTML tags.</div>";
    String tagName = "b";
    String patternString = "<" + tagName + ">(.*?)</" + tagName + ">";
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(htmlContent);
    List<String> extractedTexts = new ArrayList<>();
    while (matcher.find()) {
        extractedTexts.add(matcher.group(1));
    }
    assertEquals("Jdon", extractedTexts.get(0));
    assertEquals("extracting text", extractedTexts.get(1));
}
在这里,我们首先定义 HTML 内容,表示为htmlContent,其中包含带有标签的 HTML。此外,我们将标签名称tagName指定为“ b ”以从标签中提取文本。

然后,我们使用compile()方法编译正则表达式模式,其中patternString是“ (.*?) ”来匹配和提取标签内的文本。然后,我们使用 while 循环和find()方法来迭代所有匹配项并将它们添加到名为extractedTexts的列表中。

最后,我们断言从标签中提取了两个文本(“ Jdon”和“ extracting text ”) 。

为了处理标签内容可能包含换行符的情况,我们可以通过添加(?s)来修改模式字符串,如下所示:

String patternString = "(?s)<" + tagName + ">(.*?)</" + tagName + ">";

在这里,我们使用启用 dotall 模式(?s)的正则表达式模式“ (?s)

(.*?)

”来匹配多行的

标签。

2、使用JSoup进行HTML解析和提取 对于更复杂的 HTML 解析任务,尤其是涉及嵌套标签的任务,建议使用JSoup等专用库。让我们演示如何使用JSoup从

标签中提取文本,包括处理嵌套标签:

@Test
void givenHtmlContentWithNestedParagraphTags_thenExtractAllTextsFromHtmlTag() {
    String htmlContent = "<div>This is a <p>multiline\nparagraph <strong>with nested</strong> content</p> and <p>line breaks</p>.</div>";
    Document doc = Jsoup.parse(htmlContent);
    Elements paragraphElements = doc.select("p");
    List<String> extractedTexts = new ArrayList<>();
    for (Element paragraphElement : paragraphElements) {
        String extractedText = paragraphElement.text();
        extractedTexts.add(extractedText);
    }
    assertEquals(2, extractedTexts.size());
    assertEquals("multiline paragraph with nested content", extractedTexts.get(0));
    assertEquals("line breaks", extractedTexts.get(1));
}
在这里,我们使用parse()方法来解析htmlContent字符串,将其转换为Document对象。接下来,我们在doc对象上使用select()方法来选择已解析文档中的所有《p》元素。

随后,我们迭代选定的paragraphElements集合,使用paragraphElement.text()方法从每个《p》元素中提取文本内容。