Войти

Показать полную графическую версию : Regexp java или иной библиотеки для парсинга HTML


Flick
24-03-2008, 21:52
Здравствуйте, встала задача, написать класс , который будет парсить 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
Flick
берем tidy, подключаем его, кормим ему ваш не валидный HTML на выходе получаем дом объект, выдираем все ссылки.

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

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

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

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




© OSzone.net 2001-2012