Regex Работает над тестовой программой, но не над WebSprinx crwaler - PullRequest
0 голосов
/ 07 сентября 2011

Вот мой код для соответствия Regex, который работал для веб-страницы:

public class RegexTestHarness {

    public static void main(String[] args) {

        File aFile = new File("/home/darshan/Desktop/test.txt");
        FileInputStream inFile = null;
        try {
            inFile = new FileInputStream(aFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace(System.err);
            System.exit(1);
        }

        BufferedInputStream in = new BufferedInputStream(inFile);
        DataInputStream data = new DataInputStream(in);
        String string = new String();
        try {
            while (data.read() != -1) {
                string += data.readLine();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Pattern pattern = Pattern
                .compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>");
        Matcher matcher = pattern.matcher(string);
        boolean found = false;
        while (matcher.find()) {
            System.out.println("Name: " + matcher.group(1) );
            found = true;
        }
        if(!found){
            System.out.println("Pattern Not found");
        }
    }
}

Но тот же код не работает с кодом crwaler, для которого я тестирую regex, мой код искателя: (Я использую Websphinx)

// Our own Crawler class extends the WebSphinx Crawler
public class MyCrawler extends Crawler {

    MyCrawler() {
        super(); // Do what the parent crawler would do
    }

    // We could choose not to visit a link based on certain circumstances
    // For now we always visit the link
    public boolean shouldVisit(Link l) {
        // String host = l.getHost();
        return false; // always visit a link
    }

    // What to do when we visit the page
    public void visit(Page page) {
        System.out.println("Visiting: " + page.getTitle());
        String content = page.getContent();

        System.out.println(content);

        Pattern pattern = Pattern.compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>");
        Matcher matcher = pattern.matcher(content);
        boolean found = false;
        while (matcher.find()) {
            System.out.println("Name: " + matcher.group(1) );
            found = true;
        }
        if(!found){
            System.out.println("Pattern Not found");
        }
    }
}

Это мой код для запуска сканера:

public class WebSphinxTest {

    public static void main(String[] args) throws MalformedURLException, InterruptedException {

        System.out.println("Testing Websphinx. . .");

        // Make an instance of own our crawler
        Crawler crawler = new MyCrawler();
        // Create a "Link" object and set it as the crawler's root
        Link link = new Link("http://justeat.in/restaurant/spices/5633/indian-tandoor-chinese-and-seafood/sarjapur-road/bangalore");
        crawler.setRoot(link);

        // Start running the crawler!
        System.out.println("Starting crawler. . .");
        crawler.run(); // Blocking function, could implement a thread, etc.

    }

}

Небольшая информация о коде сканера.shouldvisit(Link link) фильтр, чтобы перейти на ссылку или нет.visit(Page page) решает, что делать, когда мы получаем страницу.

В приведенном выше примере test.txt и content содержат одинаковую строку

1 Ответ

3 голосов
/ 07 сентября 2011

В вашем RegexTestHarness вы читаете строки из файла и объединяете строки без разрывов строк, после чего выполняете сопоставление (readLine() возвращает содержимое строки без разрывов строк!).

Таким образом, на входе вашего MyCrawler класса, вероятно есть символы разрыва строки на входе. А так как метасимвол regex . по умолчанию не соответствует символам разрыва строки, он не работает в MyCrawler.

Чтобы исправить это, добавьте (?s) из всех ваших паттернов, которые содержат . метасимвол. Итак:

Pattern.compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>")

станет:

Pattern.compile("(?s)<div class=\"rest_title\">.*?<h1>(.*?)</h1>")

Флаг DOT-ALL, (?s), заставит . соответствовать любому символу, включая символы разрыва строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...