JXL Изменение столбцов для приложения на основе JSOUP - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время эта программа запускает столбец URL-адресов и выводит выбранные данные в соседнюю ячейку.Я могу указать, с какого столбца он начинается, но это все, что я могу сделать.Прямо сейчас у меня это работает только на одном столбце.Как я могу поручить ему перейти, скажем, к столбцу 4 (столбец E) и работать сверху вниз, как только он закончится со столбцом 0 (A)?А потом, может быть, другой, скажем, столбец J после этого?

Я считаю, что моя проблема лежит в строке "while (! (Cell = sheet.getCell ..."), но я не уверен, что там изменить безвзлом программы.

Мой код выглядит следующим образом:

public class App {

private static final int URL_COLUMN = 0; // Column A
private static final int PRICE_COLUMN = 1; //Column B

public static void main(final String[] args) throws Exception {

    Workbook originalWorkbook = Workbook.getWorkbook(new File("C:/Users/Shadow/Desktop/original.xls"));
    WritableWorkbook workbook = Workbook.createWorkbook(new File("C:/Users/Shadow/Desktop/updated.xls"), originalWorkbook);
    originalWorkbook.close();
    WritableSheet sheet = workbook.getSheet(0);
    int currentRow = 1;
    Cell cell;

    while (!(cell = sheet.getCell(URL_COLUMN, currentRow)).getType().equals(CellType.EMPTY)) {

        String url = cell.getContents();
        System.out.println("Checking URL: " + url);
        if (url.contains("scrapingsite1.com")) {
            String Price = ScrapingSite1(url);
            System.out.println("Scraping Site1's Price: " + Price);
            Label cellWithPrice = new Label(PRICE_COLUMN, currentRow, Price);
            sheet.addCell(cellWithPrice);
        }
        currentRow++;
    }
    workbook.write();
    workbook.close();
}

private static String ScrapingSite1 (String url) throws IOException {
    Document doc = null;
    for (int i=1; i <= 6; i++) {
        try {
            doc = Jsoup.connect(url).userAgent("Mozilla/5.0").timeout(6000).validateTLSCertificates(false).get();
            break;
        } catch (IOException e) {
            System.out.println("Jsoup issue occurred " + i + " time(s).");
        }
    }
    if (doc == null){
        return null;
    }
    else{
        return doc.select("p.price").text();
    }
}
}

1 Ответ

0 голосов
/ 21 февраля 2019

Чтобы упростить код, я сделал предположение, что цена всегда приходит к следующему столбцу (+1).

Также для обработки нескольких столбцов вместо использования одного значения int URL_COLUMN = 0 Я заменил его на массивстолбцы для обработки: int[] URL_COLUMNS = { 0, 4, 9 }; // Columns A, E, J.

Затем можно выполнить цикл по каждому столбцу {0, 4, 9} и сохранить данные в следующем столбце {1, 5, 10}.


    private static final int[] URL_COLUMNS = { 0, 4, 9 }; // Columns A, E, J

    public static void main(final String[] args) throws Exception {

        Workbook originalWorkbook = Workbook.getWorkbook(new File("C:/Users/Shadow/Desktop/original.xls"));
        WritableWorkbook workbook = Workbook.createWorkbook(new File("C:/Users/Shadow/Desktop/updated.xls"), originalWorkbook);
        originalWorkbook.close();
        WritableSheet sheet = workbook.getSheet(0);
        Cell cell;

        // loop over every column
        for (int i = 0; i < URL_COLUMNS.length; i++) {
            int currentRow = 1;
            while (!(cell = sheet.getCell(URL_COLUMNS[i], currentRow)).getType().equals(CellType.EMPTY)) {

                String url = cell.getContents();
                System.out.println("Checking URL: " + url);
                if (url.contains("scrapingsite1.com")) {
                    String Price = ScrapingSite1(url);
                    System.out.println("Scraping Site1's Price: " + Price);
                    // save price into the next column
                    Label cellWithPrice = new Label(URL_COLUMNS[i] + 1, currentRow, Price);
                    sheet.addCell(cellWithPrice);
                }
                currentRow++;
            }
        }

        workbook.write();
        workbook.close();
    }
...