在 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)); } |
然后,我们使用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)); } |
随后,我们迭代选定的paragraphElements集合,使用paragraphElement.text()方法从每个《p》元素中提取文本内容。