从HTML Java中提取文本

17 html java screen-scraping text-extraction html-content-extraction

我正在开发一个下载HTML页面的程序,然后选择一些信息并将其写入另一个文件.

我想提取段落标记之间的信息,但我只能获得段落的一行.我的代码如下;

FileReader fileReader = new FileReader(file);
BufferedReader buffRd = new BufferedReader(fileReader);
BufferedWriter out = new BufferedWriter(new FileWriter(newFile.txt));
String s;

while ((s = br.readLine()) !=null) {
    if(s.contains("<p>")) {
        try {
            out.write(s);
        } catch (IOException e) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图添加另一个while循环,这将告诉程序继续写入文件,直到该行包含</p>标记,通过说;

while ((s = br.readLine()) !=null) {
    if(s.contains("<p>")) {
        while(!s.contains("</p>") {
            try {
                out.write(s);
            } catch (IOException e) {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.请有人帮忙.

Dan*_*nny 25

jsoup

我真正喜欢使用的另一个html解析器是jsoup.您可以通过<p>2行代码获取所有元素.

Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
Elements ps = doc.select("p");
Run Code Online (Sandbox Code Playgroud)

然后将其写入另一行中的文件

out.write(ps.text());  //it will append all of the p elements together in one long string
Run Code Online (Sandbox Code Playgroud)

或者如果你想要它们在不同的行上,你可以迭代元素并分别写出来.

  • @sinθ 这个问题明确要求`p` 元素。这个答案是正确的。 (2认同)

Gar*_*vis 9

jericho是几个可行的html解析器之一,可以使这项任务既简单又安全.


Nia*_*all 0

尝试(如果您不想使用 HTML 解析器库):


        FileReader fileReader = new FileReader(file);
        BufferedReader buffRd = new BufferedReader(fileReader);
        BufferedWriter out = new BufferedWriter(new FileWriter(newFile.txt));
        String s;
        int writeTo = 0;
        while ((s = br.readLine()) !=null) 
        {
                if(s.contains("<p>"))
                {
                        writeTo = 1;

                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
                if(s.contains("</p>"))
                {
                        writeTo = 0;

                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
                else if(writeTo==1)
                {
                        try 
                        {
                            out.write(s);
                    } 
                        catch (IOException e) 
                        {

                    }
                }
}
Run Code Online (Sandbox Code Playgroud)