Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JAVA解析html(Jsoup)_Java_Html_Parsing_Jsoup - Fatal编程技术网

使用JAVA解析html(Jsoup)

使用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>

我在使用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>
  <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;i
publicstaticvoidmain(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("-----------------------");
    }
}