it-swarm.com.de

Textextraktion aus HTML Java

Ich arbeite an einem Programm, das HTML-Seiten herunterlädt, dann einige Informationen auswählt und in eine andere Datei schreibt.

Ich möchte die Informationen extrahieren, die sich zwischen den Absatz-Tags befinden, aber ich kann nur eine Zeile des Absatzes abrufen. Mein Code ist wie folgt;

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) {
        }
    }
}

ich habe versucht, eine weitere while-Schleife hinzuzufügen, die das Programm anweist, weiter in die Datei zu schreiben, bis die Zeile den Tag </p> enthält.

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

Das geht aber nicht. Könnte jemand bitte helfen.

17
MajorMajor

jsoup

Ein anderer HTML-Parser, den ich sehr mochte, war jsoup . Sie könnten alle <p> -Elemente in 2 Codezeilen erhalten.

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

Schreiben Sie es dann in eine weitere Zeile

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

oder wenn Sie möchten, dass sie in separaten Zeilen stehen, können Sie die Elemente durchlaufen und separat ausschreiben.

22
Danny

jericho ist einer von mehreren möglichen HTML-Parsern, die diese Aufgabe sowohl einfach als auch sicher machen könnten.

9
Gareth Davis

JTidy kann ein HTML-Dokument (auch ein fehlerhaftes) als Dokumentmodell darstellen, was das Extrahieren des Inhalts eines <p>-Tags zu einem eleganteren Vorgang macht, als manuell durch den Rohtext zu blättern.

4
skaffman

Verwenden Sie einen ParserCallback. Es ist eine einfache Klasse, die im JDK enthalten ist. Es benachrichtigt Sie jedes Mal, wenn ein neues Tag gefunden wird, und Sie können dann den Text des Tags extrahieren. Einfaches Beispiel:

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);
        }
    }
}

Sie müssen also nur ein Boolesches Flag setzen, wenn das Absatz-Tag gefunden wird. Dann extrahieren Sie in der handleText () -Methode den Text.

0
camickr

Versuchen Sie (wenn Sie keine HTML-Parser-Bibliothek verwenden möchten):


        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) 
                        {

                    }
                }
}
0
Niall

Ich hatte Erfolg mit TagSoup & XPath zum Parsen von HTML.

http://home.ccil.org/~cowan/XML/tagsoup/

0
Billy Bob Bain

Versuche dies.

 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();
}
}
0
Consultant