Помогите извлечь текст из HTML-тега с помощью Java и Regex - PullRequest
2 голосов
/ 29 августа 2011

Я хотел бы извлечь некоторый текст из html-файла, используя Regex. Я изучаю регулярные выражения, и мне все еще трудно понять все это. У меня есть код, который извлекает весь текст, включенный между <body> и </body>, вот он:

public class Harn2 {

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

String toMatch=readFile();
//Pattern pattern=Pattern.compile(".*?<body.*?>(.*?)</body>.*?"); this one works fine
Pattern pattern=Pattern.compile(".*?<table class=\"claroTable\".*?>(.*?)</table>.*?"); //I want this one to work
Matcher matcher=pattern.matcher(toMatch);

if(matcher.matches()) {
    System.out.println(matcher.group(1));
}

}

 private static String readFile() {

      try{
            // Open the file that is the first 
            // command line parameter
            FileInputStream fstream = new FileInputStream("user.html");
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine = null;
            //Read File Line By Line
            while (br.readLine() != null)   {
                // Print the content on the console
                //System.out.println (strLine);
                strLine+=br.readLine();
            }
            //Close the input stream
            in.close();
            return strLine;
            }catch (Exception e){//Catch exception if any

                System.err.println("Error: " + e.getMessage());
                return "";
            }
}
}

Ну, все работает нормально, но я хотел бы извлечь текст между тегами: <table class="claroTable"> и </table>

Поэтому я заменяю строку регулярных выражений на ".*?<table class=\"claroTable\".*?>(.*?)</table>.*?" Я также пытался ".*?<table class=\"claroTable\">(.*?)</table>.*?" но это не работает, и я не понимаю, почему. В html-файле есть только одна таблица, но в коде javascript есть «таблица»: «... dataTables.js ...» может ли это быть причиной ошибки?

Заранее спасибо за помощь,

РЕДАКТИРОВАТЬ: HTML-текст для извлечения что-то вроде:

<body>
.....
<table class="claroTable">
<td><th>some data and manya many tags </td>
.....
</table>

Я хотел бы извлечь что-нибудь между <table class="claroTable"> и </table>

Ответы [ 2 ]

6 голосов
/ 29 августа 2011

Вот как это можно сделать с помощью JSoup-парсера :

File file = new File("path/to/your/file.html");
String charSet = "ISO-8859-1";
String innerHtml = Jsoup.parse(file,charSet).select("body").html();

Да, вы можете также как-то сделать это с помощью регулярных выражений, но это никогда не будет таким простым.

Обновление: Основная проблема с вашим шаблоном регулярных выражений состоит в том, что вы пропускаете флаг DOTALL:

Pattern pattern=Pattern.compile(".*?<body.*?>(.*?)</body>.*?",Pattern.DOTALL);

И если вам нужен только указанный табличный тег с содержимым, вы можете сделать что-то вроде этого:

String tableTag = 
    Pattern.compile(".*?<table.*?claroTable.*?>(.*?)</table>.*?",Pattern.DOTALL)
           .matcher(html)
           .replaceFirst("$1");

(Обновлено: теперь возвращает только содержимое тега таблицы, но не сам тег таблицы)

0 голосов
/ 29 августа 2011

Как уже говорилось, это плохое место для использования регулярных выражений. Используйте регулярные выражения только тогда, когда вам это действительно нужно, поэтому старайтесь держаться подальше от него, если можете. Взгляните на этот пост, хотя для парсеров:

Как анализировать и изменять HTML-файл в Java

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