0

我正在创建一个网页抓取工具。我试图从页面上的数据中填充一个 JTable,使用 XPath 检索。我希望将单行的数据放入数组中。

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

我将网页检索到要解析的字符串中。没有\n(对不起,我不知道这个词的正确说法。换行?)

程序截图 数组表示列中的数据。我想要这样做的方法是让它检索该行的单个数据行,然后将其插入到数组中,然后将其放入 JTable 中。然后将数组设置为null,重复该过程。

我真的不想处理的另一个选项是将所有单个单元格放入每列的数组列表中,然后执行一个 while 循环。这样做的问题是条目可能返回空,这意味着索引可能不会完全同步。

我是一个相当“新”的程序员,有大约 6 个月的经验,我自己做大部分事情。我仍在努力建立我的方法论,但是在这里我被困住了。

我想知道在这种情况下最好的解决方案是什么,可能有一个我没有想到的更好的解决方案。

这不是原始代码问题,而是流程问题。

很乱,是的。然而,使用 Google Docs 的 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对象,使用这个模型add方法将它添加到模型中。

于 2012-10-16T03:46:00.867 回答