Использование Crawler4j для печати Arraylist в файл HTML?

Основы этой программы; Запускает веб-сканер на основе PerentUrl и Keyword, указанных пользователем в Controller (main). Если ключевое слово найдено в тексте страницы, URL-адрес сохраняется в списке массивов;

ArrayList UrlHits = new ArrayList ();

После завершения сканирования программа вызовет методы из класса WriteFile в основном для записи html-файла, содержащего все UrlHits.

    WriteFile f = new WriteFile();
    f.openfile(Search);
    f.StartHtml();
    f.addUrl(UrlHits);
    f.EndHtml();
    f.closeFile();

Все, кроме f.addUrl, работают правильно, создавая HTML-файл с правильным именем и каталогом. Но ни одна из строк из ArrayList не выводится в файл.

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

    RobotstxtConfig robotstxtConfig2 = new RobotstxtConfig();

    String crawlStorageFolder = "/Users/Jake/Documents/sem 2/FYP/Crawler/TestData";
    int numberOfCrawlers = 1;

    CrawlConfig config = new CrawlConfig();
    config.setCrawlStorageFolder(crawlStorageFolder);

    config.setMaxDepthOfCrawling(21);
    config.setMaxPagesToFetch(24);

    PageFetcher pageFetcher = new PageFetcher(config);
    RobotstxtConfig robotstxtConfig = new RobotstxtConfig();

    RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
    CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);

    Scanner perentUrl = new Scanner(System.in);
    System.out.println("Enter full perant Url... example. http://www.domain.co.uk/");
    String Url = perentUrl.nextLine();

    Scanner keyword = new Scanner(System.in);
    System.out.println("Enter search term... example. Pies");
    String Search = keyword.nextLine();

    System.out.println("Searching domain :" + Url);
    System.out.println("Keyword:" + Search);

    ArrayList<String> DomainsToInv = new ArrayList<String>();
    ArrayList<String> SearchTerms = new ArrayList<String>();
    ArrayList<String> UrlHits = new ArrayList<String>();

    DomainsToInv.add(Url);
    SearchTerms.add(Search);

    controller.addSeed(Url);

    controller.setCustomData(DomainsToInv);
    controller.setCustomData(SearchTerms);
    controller.start(Crawler.class, numberOfCrawlers);

    WriteFile f = new WriteFile();
    f.openfile(Search);
    f.StartHtml();
    f.addUrl(UrlHits);
    f.EndHtml();
    f.closeFile();
}

}

открытый класс Crawler расширяет WebCrawler {

@Override
public void visit(Page page) {

    int docid = page.getWebURL().getDocid();
    String url = page.getWebURL().getURL();
    String domain = page.getWebURL().getDomain();
    String path = page.getWebURL().getPath();
    String subDomain = page.getWebURL().getSubDomain();
    String parentUrl = page.getWebURL().getParentUrl();
    String anchor = page.getWebURL().getAnchor();

    System.out.println("Docid: " + docid);
    System.out.println("URL: " + url);
    System.out.println("Domain: '" + domain + "'");
    System.out.println("Sub-domain: '" + subDomain + "'");
    System.out.println("Path: '" + path + "'");
    System.out.println("Parent page: " + parentUrl);
    System.out.println("Anchor text: " + anchor);

    if (page.getParseData() instanceof HtmlParseData) {
        HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
        String text = htmlParseData.getText();
        String html = htmlParseData.getHtml();
        List<WebURL> links = htmlParseData.getOutgoingUrls();

        System.out.println("Text length: " + text.length());
        System.out.println("Html length: " + html.length());
        System.out.println("Number of outgoing links: " + links.size());
    }

    Header[] responseHeaders = page.getFetchResponseHeaders();
    if (responseHeaders != null) {
        System.out.println("Response headers:");
        for (Header header : responseHeaders) {
            System.out.println("\t" + header.getName() + ": " + header.getValue());
        }
    }
    System.out.println("=============");

    ArrayList<String> SearchTerms = (ArrayList<String>) this.getMyController().getCustomData();
    ArrayList<String> UrlHits = (ArrayList<String>) this.getMyController().getCustomData();

    for (String Keyword : SearchTerms) {

        System.out.println("Searching Keyword: " + Keyword);

        HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();

        int KeywordCounter = 0;
        String pagetext = htmlParseData.getText();
        Pattern pattern = Pattern.compile(Keyword);
        Matcher match1 = pattern.matcher(pagetext);

        if (match1.find()) {
            while (match1.find()) {
                KeywordCounter++;
            }
            System.out.println("FOUND " + Keyword + " in page text. KeywordCount: " + KeywordCounter);

            UrlHits.add(url);
            for (int i = 0; i < UrlHits.size(); i++) {
                System.out.print(UrlHits.get(i) + "\n");

                System.out.println("=============");
            }

        } else {
            System.out.println("Keyword search was unsuccesful");

            System.out.println("=============");
        }

    }

}

}

открытый класс WriteFile {

private Formatter x;

public void openfile(String keyword) {

    try {
        x = new Formatter(keyword + ".html");
    } catch (Exception e) {

        System.out.println("ERROR");
    }
}

public void StartHtml() {
    x.format("%s %n %s %n %s %n %s %n %s %n ", "<html>", "<head>", "</head>", "<body>", "<center>");
}

public void addUrl(ArrayList<String> UrlHits) {

    for (String list : UrlHits) {
        x.format("%s%s%s%s%s%n%s%n", "<a href=\"", list, "\" target=\"_blank\">", list, "</a>", "<br>");
    }
}

public void EndHtml() {
    x.format("%s %n %s %n %s %n", "</center>", "</body>", "</html>");
}

public void closeFile() {
    x.close();
}

}

Извинения за заголовки классов вне кода блокируют это немного неудобно. Я пробовал несколько разных операторов for для получения метода для вывода списка массивов, но, похоже, его нет. Строки добавляются в список массивов, так как я могу вызвать их с помощью цикла for в main. Но когда я передаю список массивов методу addUrl, он подходит к приседу. Есть ли более простой способ использовать arraylists с использованием форматеров и.format?

Спасибо за помощь

0 ответов

Другие вопросы по тегам