0

Webページスクレーパーを作成しています。XPathを使用して取得したページ上のデータからJTableに入力しようとしています。単一行のデータを配列に入れたい。

{"Name","Phone","Address","City","State","Postal Code","Link"}

解析する文字列にWebページを取得します。\ nはありません(申し訳ありませんが、これに適切な単語がわかりません。新しい行ですか?)

プログラムのスクリーンショット 配列は、列のデータを表します。私がやりたいのは、その行の個々のデータ行を取得し、それを配列に挿入してから、JTableに配置するようにすることです。次に、配列がnullに設定され、プロセスが繰り返されます。

私が本当に扱いたくないもう1つのオプションは、個々のセルすべてを各列の配列リストに配置してから、whileループを実行することです。これに関する問題は、エントリが空を返す可能性があることです。これは、インデックスが完全に同期されていない可能性があることを意味します。

私はかなり「新しい」プログラマーであり、実際にほとんどのことを自分で行った経験が約6か月あります。私はまだ方法論の構築に取り組んでいますが、ここで立ち往生しています。

この状況で最善の解決策は何でしょうか。おそらく、私が考えていなかったより良い解決策があるでしょう。

これは生のコードの問題ではなく、フローの問題です。

散らかっています、はい。ただし、GoogleDocsのxPathおよびImportXML関数を使用してクロールするのは非常に簡単でした。

これが私がセルに入れるものです:

名前:

=importxml("http://www.yellowpages.com/[location]/[type]","//a[@class='no-tracks url ']")

住所:

=importxml("http://www.yellowpages.com/[location]/[type]","//span[@class='street-address']")

電話:

=importxml("http://www.yellowpages.com/[location]/[type]","//span[@class='business-phone phone']")

私は他のことをしませんでした、しかし私はそれが可能であることを知っています。

プライバシー上の理由からHTMLの例を削除しました。申し訳ありません。

4

1 に答える 1

2

データ(配列)を最もよく表すオブジェクトを生成します。配列からのデータを使用してオブジェクトを作成し、オブジェクトをテーブルモデルに追加します。

public class Data {
    private String name;
    private String phone;
    private String address;
    private String city;
    private String state;
    private String postalCode;
    private String link;
    public Data(String[] data) { 
        name = data[0];
        phone = data[1];
        address = data[2];
        city = data[3];
        state = data[4];
        postalCode = data[5];
        link= data[6];
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }

    public String getAddress() {
        return address;
    }

    public String getCity() {
        return city;
    }

    public String getState() {
        return state;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public String getLink() {
        return link;
    }
}

このデータオブジェクトを利用できるテーブルモデルを作成します...

public class MyDataTableModel extends AbstractTableModel {

    private List<Data> dataList;

    public MyDataTableModel() {
        dataList = new ArrayList<Data>(25);
    }

    @Override
    public int getRowCount() {
        return dataList.size();
    }

    @Override
    public int getColumnCount() {
        return 7;
    }

    @Override
    public String getColumnName(int column) {
        String name = "??";
        switch (column) {
            case 0:
                name = "Name";
                break;
            case 1:
                name = "Phone";
                break;
            case 2:
                name = "Address";
                break;
            case 3:
                name = "City";
                break;
            case 4:
                name = "State";
                break;
            case 5:
                name = "Postal Code";
                break;
            case 6:
                name = "Link";
                break;
        }
        return super.getColumnName(column);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object value = null;
        Data data = dataList.get(rowIndex);
        switch (columnIndex) {
            case 0:
                value = data.getName();
                break;
            // Other case statements per column...
        }
        return value;
    }

    public void add(Data data) {
        dataList.add(data);
        int index = dataList.size() - 1;
        fireTableRowsInserted(index, index);
    }
}

新しいオブジェクトを作成したらData、このmodelsaddメソッドを使用してオブジェクトをモデルに追加します。

于 2012-10-16T03:46:00.867 に答える