使用jsoup或regex

时间:2015-04-27 07:25:59

标签: java regex string jsoup

嗨我在html文件解析中有一个场景。我正在使用jsoup解析html文件,解析后我想提取头标记(h1,h3,h4)。我使用doc.select()但它只会返回标头标签值,但我的要求是我应该在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的新手,我不知道如何实现这一点。 Rightnow我使用了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();
}

请帮助我实现这一目标。

2 个答案:

答案 0 :(得分:1)

您可能正在寻找this。选择所需的元素后,可以使用此功能。

如果您正在使用Jsoup,那么在dom操作的情况下,您不必(实际上并不需要)使用正则表达式。

Elements heads = body.select('h1');
// iterate and get inner html of that elements by
String html = head.html();

- 编辑 -

误解了这个问题;

您可以确定h标记的索引并使用getElementsByIndexGreaterThan。其余的都是一样的。

- 编辑2 -

针对您的具体情况;你可以在找到第一个h元素后迭代:

  Elements elements = doc.select("h1,h2,h3,h4,h5");
  for (Element element : elements) {
     StringBuilder sb = new StringBuilder(element.toString());

     Element next = element.nextElementSibling();
     while (next != null && !next.tagName().startsWith("h")) {
        sb.append(next.toString()).append("\n");
        next = next.nextElementSibling();
     }
     System.out.println(sb);

  }

应该适合你。

答案 1 :(得分:1)

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

使用XPath代替查询文档。例如,尝试查看this stackoverflow问题。您可以使用管道运算符|在OR中有多个条件。

类似的东西应该有效:

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