Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Regexp java или иной библиотеки для парсинга HTML (http://forum.oszone.net/showthread.php?t=103567)

Flick 24-03-2008 21:52 766913

Regexp java или иной библиотеки для парсинга HTML
 
Здравствуйте, встала задача, написать класс , который будет парсить html страницу со, скорее всего кривым кодом ( то есть парсеры типа DOM, я так мыслю отсекаются ) ,
задача, вытянуть из документа все урлы.
но вот проблема, самым очевидным решением принял поиск по совпадению с регулярным выражением ( NB у меня опыта практически ноль )
и когда хочу пропарсить с помощью java.util.regexp - не получается составить выражение, а при помощи org.apache.oro.text.regex. получаю java.lang.ArrayIndexOutOfBoundsException,
Люди добрые не пагубите помогите найти оптимальный выход их этой ситуации...


вот что наваял
Код:




import org.apache.oro.text.awk.AwkCompiler;
import org.apache.oro.text.awk.AwkMatcher;
import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.MatchResult;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;

public class Analyzer2 {

        public ArrayList<String> analyze(String html_body) {

               
                ArrayList<String> al = null;
                String regex = "(http://)*[w]{3}*.*[a-zA-Z0-9].+[a-zA-Z]{1,3}";

                PatternCompiler compiler = new AwkCompiler();
                Pattern pattern = null;
                try {
                        pattern = compiler
                                        .compile(regex, AwkCompiler.CASE_INSENSITIVE_MASK);
                       
                } catch (MalformedPatternException mpe) {
                        mpe.printStackTrace();
                }
                AwkMatcher matcher = new AwkMatcher();
                while (matcher.contains(html_body, pattern)) {
                        MatchResult result = matcher.getMatch();
                        la.add(result.toString());
                }

                return al;
        }
}

подскажите что не так и как сделать что бы это барахло заработало..?

Vlad Drakula 25-03-2008 11:01 767179

Flick
берем tidy, подключаем его, кормим ему ваш не валидный HTML на выходе получаем дом объект, выдираем все ссылки.

Flick 25-03-2008 11:34 767211

Vlad Drakula,
Вот в том-то и дело, что jTidy не скушает не валидный код страницы, а задача стоит выцепить как можно больше урлов, ( а на странице урл же может выводиться скриптом, не обязательно в виде валидной html-ной ссылки ) ( я пытался заюзать и jTidy и Xerces - ничиво не вышло ). Помогите составить regex хоть на чем нибудь......awk perl java

Busla 25-03-2008 12:41 767275

хотя бы так
[Hh][Tt][Tt][Pp]://[^ "']*
блоки <script> стоит исключить - там могут быть "обрывки" адресов

Vlad Drakula 25-03-2008 12:57 767286

Flick
1) тогда бы почему бы вам просто не использовать движок браузера?
2) не знаю как jTidy, но я использую tidy как раз чтобы делать не валидный HTML валидным, tidy конечно не со всем справляется но в большинстве случаев работает на ура.

Flick 25-03-2008 15:23 767397

путь с Tidy - тернистее и длинее, сложнее,
путь с regexp'ом - , оказался быстрее проще ( в общем случае ).... всем спасибо...


Время: 02:00.

Время: 02:00.
© OSzone.net 2001-