извлечение текста из html java

<p>я работаю над программой, которая загружает html-страницы, затем выбирает некоторую информацию и записывает ее в другой файл.</p><p>я хочу извлечь информацию, которая находится между тегами абзаца, но я могу получить только одну строку абзаца. мой код выглядит следующим образом;</p><pre><code>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) { } } } </code></pre><p>я пытался добавить еще один цикл while, который велел бы программе продолжать запись в файл, пока строка не будет содержать тег <code></p></code>, говоря;</p><pre><code>while ((s = br.readline()) !=null) { if(s.contains("<p>")) { while(!s.contains("</p>") { try { out.write(s); } catch (ioexception e) { } } } } </code></pre><p>но это не работает. может кто-нибудь, пожалуйста, помогите.</p>

<h1>jsoup</h1><p>другой html-парсер, который мне действительно понравился, был <a href="http://jsoup.org/">jsoup</a> . вы можете получить все элементы <code><p></code> в 2 строки кода.</p><pre><code>document doc = jsoup.connect("http://en.wikipedia.org/").get(); elements ps = doc.select("p"); </code></pre><p>затем запишите это в файл еще в одной строке</p><pre><code>out.write(ps.text()); //it will append all of the p elements together in one long string </code></pre><p>или, если вы хотите, чтобы они были отдельными строками, вы можете перебирать элементы и записывать их отдельно. </p>

<p> <a href="http://jerichohtml.sourceforge.net/">jericho</a> - один из нескольких возможных html-парсеров, которые могут сделать эту задачу простой и безопасной.</p>

<p> <a href="http://jtidy.sourceforge.net/">jtidy</a> может представлять html-документ (даже искаженный) как модель документа, что делает процесс извлечения содержимого тега <code><p></code> довольно более элегантным процессом, чем ручное редактирование необработанного текста.</p>

<p>используйте parsercallback. это простой класс, включенный в jdk. он уведомляет вас каждый раз, когда обнаруживается новый тег, а затем вы можете извлечь текст тега. простой пример:</p><pre><code>import java.io.*; import java.net.*; import javax.swing.text.*; import javax.swing.text.html.*; import javax.swing.text.html.parser.*; public class parsercallbacktest extends htmleditorkit.parsercallback { private int tablevel = 1; private int line = 1; public void handlecomment(char[] data, int pos) { displaydata(new string(data)); } public void handleendoflinestring(string eol) { system.out.println( line++ ); } public void handleendtag(html.tag tag, int pos) { tablevel--; displaydata("/" + tag); } public void handleerror(string errormsg, int pos) { displaydata(pos + ":" + errormsg); } public void handlemutabletag(html.tag tag, mutableattributeset a, int pos) { displaydata("mutable:" + tag + ": " + pos + ": " + a); } public void handlesimpletag(html.tag tag, mutableattributeset a, int pos) { displaydata( tag + "::" + a ); // tablevel++; } public void handlestarttag(html.tag tag, mutableattributeset a, int pos) { displaydata( tag + ":" + a ); tablevel++; } public void handletext(char[] data, int pos) { displaydata( new string(data) ); } private void displaydata(string text) { for (int i = 0; i < tablevel; i++) system.out.print("\t"); system.out.println(text); } public static void main(string[] args) throws ioexception { parsercallbacktest parser = new parsercallbacktest(); // args[0] is the file to parse reader reader = new filereader(args[0]); // urlconnection conn = new url(args[0]).openconnection(); // reader reader = new inputstreamreader(conn.getinputstream()); try { new parserdelegator().parse(reader, parser, true); } catch (ioexception e) { system.out.println(e); } } } </code></pre><p>поэтому все, что вам нужно сделать, это установить логический флаг при обнаружении тега абзаца. затем в методе handletext () вы извлекаете текст.</p>

<p>попробуйте (если вы не хотите использовать библиотеку html-анализатора):</p><pre><code> 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) { } } } </code></pre>

<p>я успешно использовал tagsoup & xpath для анализа html.</p><p> <a href="http://home.ccil.org/~cowan/xml/tagsoup/">http://home.ccil.org/~cowan/xml/tagsoup/</a> </p>

<p>попробуй это.</p><pre><code> public static void main( string[] args ) { string url = "http://en.wikipedia.org/wiki/big\_data"; document document; try { document = jsoup.connect(url).get(); elements paragraphs = document.select("p"); element firstparagraph = paragraphs.first(); element lastparagraph = paragraphs.last(); element p; int i=1; p=firstparagraph; system.out.println("* " +p.text()); while (p!=lastparagraph){ p=paragraphs.get(i); system.out.println("* " +p.text()); i++; } } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } </code></pre>