使用JAVA解析html(Jsoup)
我在使用jsoup(Java)解析html文档时遇到了一个问题。我正在分析的HTML具有以下格式:使用JAVA解析html(Jsoup),java,html,parsing,jsoup,Java,Html,Parsing,Jsoup,我在使用jsoup(Java)解析html文档时遇到了一个问题。我正在分析的HTML具有以下格式: ..... <hr> <a name="N1"> </a> Text 1<br> <hr> <a name="N2"> </a> Text 2<br> <hr> <a name="N3"> </a>Text 3<br> <hr>
.....
<hr>
<a name="N1"> </a> Text 1<br>
<hr>
<a name="N2"> </a> Text 2<br>
<hr>
<a name="N3"> </a>Text 3<br>
<hr>
<a name="N4"> </a>
<DIV style="margin-left: 36px">
<div></div>
<img src=bullet.gif alt="Bullet point"> Text
</DIV><br>
<hr>
<a name="X5"> </a>
<DIV style="margin-left: 36px">
<div></div>
<img src=bullet.gif alt="Bullet point"> Text
</DIV><br>
<hr>
...
。。。。。
正文1
正文2
正文3
正文
正文
...
我想在两个“hr”标记之间隔离HTML文本。我正在尝试以下代码:
File input = new File("C:\\Users\\page.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Elements body = doc.select("body");
Elements hrs = body.select("hr");
ArrayList<String> objects = new ArrayList<String>();
for (Element hr : hrs) {
String textAfterHr = hr.nextSibling().toString();
objects.add(textAfterHr);
}
File input=新文件(“C:\\Users\\page.html”);
Document doc=Jsoup.parse(输入“UTF-8”http://example.com/");
元素主体=单据选择(“主体”);
元素hrs=主体。选择(“hr”);
ArrayList对象=新的ArrayList();
对于(元素hr:hrs){
字符串textAfterHr=hr.nextSibling().toString();
对象。添加(textAfterHr);
}
System.out.println(对象)
但是ArrayList没有包含我想要的内容,我不知道如何解决它。(我可以将“hr”标记转换为“hr”文本“/hr”标记吗?这里,您可以通过读取每个hr标记的子项来获得结果。使用此选项可获得更好的解决方案
ArrayList<String> objects = new ArrayList<String>();
Elements hrs = body.select("hr");
for(int i=0;i<hrs.size();i++){
Element hrElm=hrs.get(i);
Elements childrens=hrElm.children();
for(Element child: childrens){
String text=child.text();
objects.add(text);
}
}
ArrayList objects=new ArrayList();
元素hrs=主体。选择(“hr”);
对于(int i=0;ipublicstaticvoidmain(String[]args)抛出ParseException,IOException{
字符串html=“……\n”+
“
\n”+
“文本1
\n”+
“
\n”+
“文本2
\n”+
“
\n”+
“文本3
\n”+
“
\n”+
“\n”+
“\n”+
“\n”+
“文本\n”+
“
\n”+
“
\n”+
“\n”+
“\n”+
“\n”+
“文本\n”+
“
\n”+
“
\n”+
" ...";
//在每个hr标记处拆分html字符串并保留分隔符
字符串[]拆分=(html.split((?=
)));
//使用结束标记将其连接回字符串
html=String.join(“\n”,拆分);
//使用JSoupXMLParser
Document doc=Jsoup.parse(html,“,Parser.xmlParser());
元素元素元素=文件选择(“hr”);
用于(元素e:元素e){
System.out.println(e.html());
System.out.println(“--------------------------”;
}
}
ArrayList包含什么?预期的输出是什么?您只对直接放在
之后的
或
之间的整个文本感兴趣吗?ArrayList包含两个标记之间的所有文本,@Pshemo我对这两个标记之间的整个文本感兴趣,我将解析它们以获得或DivsCan我们假设所有的hr
s(至少是您感兴趣的那些)是否在同一嵌套级别?这样,我们可以尝试迭代hr
的所有同级,并将它们合并,直到找到下一个hr
。当我们这样做时,我们将迄今为止收集的文本放在列表中,然后再次开始收集。但由于我们将迭代同级,如果某些hr
处于其他嵌套级别,这可能会失败。
public static void main(String[] args) throws ParseException, IOException {
String html = ".....\n" +
"<hr>\n" +
" <a name=\"N1\"> </a> Text 1<br>\n" +
"<hr>\n" +
" <a name=\"N2\"> </a> Text 2<br>\n" +
"<hr>\n" +
" <a name=\"N3\"> </a>Text 3<br>\n" +
"<hr>\n" +
" <a name=\"N4\"> </a>\n" +
" <DIV style=\"margin-left: 36px\">\n" +
" <div></div>\n" +
" <img src=bullet.gif alt=\"Bullet point\"> Text\n" +
" </DIV><br>\n" +
"<hr>\n" +
" <a name=\"X5\"> </a>\n" +
" <DIV style=\"margin-left: 36px\">\n" +
" <div></div>\n" +
" <img src=bullet.gif alt=\"Bullet point\"> Text\n" +
" </DIV><br>\n" +
"<hr>\n" +
" ...";
//Split your html string at each hr tag and keep the delimiter
String [] splited = (html.split("(?=<hr>)"));
//join it back to a string using a closing hr tag
html = String.join("</hr>\n",splited);
//use the jsoup xmlParser
Document doc = Jsoup.parse(html,"",Parser.xmlParser());
Elements eles = doc.select("hr");
for(Element e : eles){
System.out.println(e.html());
System.out.println("-----------------------");
}
}