嗨我在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();
}
请帮助我实现这一目标。
答案 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 |
...