19

HTMLページをダウンロードし、情報の一部を選択して別のファイルに書き込むプログラムに取り組んでいます。

段落タグの間にある情報を抽出したいのですが、段落の1行しか取得できません。私のコードは次のとおりです。

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

</p>私は別のwhileループを追加しようとしていました。これは、行にタグが含まれるまでファイルへの書き込みを続けるようにプログラムに指示します。

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

しかし、これは機能しません。誰か助けてくれませんか。

4

8 に答える 8

31

スープ

私が本当に気に入ったもう 1 つの HTML パーサーはjsoupです。2 行のコードですべての<p>要素を取得できます。

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

次に、もう1行でファイルに書き出します

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

または、それらを別々の行に配置したい場合は、要素を繰り返し処理して別々に書き出すことができます。

于 2012-04-23T14:04:39.307 に答える
10

jerichoは、このタスクを簡単かつ安全に行うことができるいくつかの可能な html パーサーの 1 つです。

于 2009-09-06T17:02:08.720 に答える
4

JTidyは HTML ドキュメント (不正な形式のドキュメントであっても) をドキュメント モデルとして表すことができるため、タグのコンテンツを抽出するプロセスは<p>、生のテキストを手動で処理するよりも洗練されたプロセスになります。

于 2009-09-06T17:08:15.480 に答える
0

TagSoupとXPathを使用してHTMLを解析することに成功しました。

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

于 2009-09-06T17:32:18.863 に答える
0

これを試して。

 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();
}
}
于 2013-06-20T05:33:12.650 に答える
0

ParserCallback を使用します。JDK に含まれている単純なクラスです。新しいタグが見つかるたびに通知され、タグのテキストを抽出できます。簡単な例:

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

そのため、段落タグが見つかったときにブール フラグを設定するだけです。次に、handleText() メソッドでテキストを抽出します。

于 2009-09-06T22:04:22.523 に答える
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) 
                        {

                    }
                }
}
于 2009-09-06T17:02:04.867 に答える
-3

仕事に間違ったツールを使用している可能性があります。

perl -ne "print if m|<p>| .. m|</p>|" infile.txt >outfile.txt
于 2009-09-06T17:14:50.490 に答える