java - 使用 jsoup 或 regex 提取 header 标签之间的 html 标签

标签 java regex string jsoup

嗨,我在 html 文件解析中有一个场景。我正在使用 jsoup 解析 html 文件,解析后我想提取 header 标签(h1,h3,h4)。我使用了 doc.select() 但它只会返回 header 标签值,但我的要求是我应该提取 h1 到 h3 或 h4 之间的标签,反之亦然。

<h4>SECTION 2</h4>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<h3>lawsuit</h3>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<h1>header one </h1>

所以这里首先搜索html字符串是否包含任何H1,H3,H4。 这里我们有 h4,所以包括 h4 它应该搜索下一个 h1 或 h3,直到 h3 我们提取字符串并将其放入单独的 html 文件中。

第一个 html 文件包含

<h4>SECTION 2</h4>
<p>some thing h4.....</p>
<p>some thing h4.....</p>
<p>some thing h4.....</p>

第二个 html 文件包含

<h3>lawsuit</h3>
<p>some thing h3.....</p>
<p>some thing h3.....</p>
<p>some thing h3.....</p>

第三个 html 文件包含

<h1>header one </h1>
....
....
....

这里的html字符串是动态的,所以我想编写一个正则表达式来实现这个上下文,因为我是java新手,我不知道如何实现这个。 现在我使用了 substring,但我需要一个通用方法,要么是正则表达式,要么是 jsoup 本身。

我尝试过的代码是。

try {
    File sourceFile = new File("E://data1.html");
    org.jsoup.nodes.Document doc = Jsoup.parse(sourceFile, "UTF-8");
    org.jsoup.nodes.Element elements = doc.body();
    String elementString = StringUtils.substringBetween(elements.toString(),"<h4>", "<h3>");
    System.out.println("elementString::"+elementString);
    File destinationFile = new File("E://sample.html");
    BufferedWriter htmlWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destinationFile), "UTF-8"));
    htmlWriter.write(elementString);
    htmlWriter.close();
    System.out.println("Completed!!!");
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

请帮助我实现这一目标。

最佳答案

请不要使用正则表达式从 Xml 或 HTML 文档中提取元素。正则表达式对大文档有限制。

使用 XPath 来查询文档。例如,尝试查看 this堆栈溢出问题。您可以使用管道运算符 | OR 中有多个条件。

类似的东西应该可以工作:

//h1/following-sibling::p |
//h2/following-sibling::p |
//h3/following-sibling::p |
...

关于java - 使用 jsoup 或 regex 提取 header 标签之间的 html 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29889638/

相关文章:

python - 构建用 2 个句点分隔文件名字符串的正则表达式

c# - 正则表达式环视

c - 在 C 程序中访问字符串

java - 将字符串数组转换为int数组android

python - 使用 python 列表中的信息删除 MYSQL 中的多行

java - Eclipse 中缺少非必需库的必需库

java - JAXWS运行时异常

java - Java对象的比较

java - QueryDSL:如何从 case 表达式创建谓词?

regex - 匹配以指定单词结尾的 url 中的域