Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Анализ сайта


Автор: Berliner 20.12.2005, 13:11
Подскажите пожалуста как проанализировать сайт(например найти букву к на странице).Меня интересует как можно сделать с помощью стандартных средств Java. Без сторонних библиотек. Паралельно пытаюсь разобраться C PAth запросами.Но сейчас меня интересует именно простейший пример стандартными средствами Java

Автор: 3,14 20.12.2005, 14:44
Цитата(Berliner @ 20.12.2005, 13:11)
(например найти букву к на странице)

Код

String.indexOf("k");

Автор: Berliner 20.12.2005, 16:49
Спасиб за ответ!
А вообще как обычно анализируют страницы - с помощью чего? поясните мне плиз. Я хочу учить парвильные вещи что востребовано

Автор: sragio 20.12.2005, 16:56
Посмотри в сторону регулярных выражений - regexp.

Автор: Berliner 26.12.2005, 20:09
Может кто нить с кодом поможет как например с помощью String.indexOf("k"); найти на веб странице букву к и вывести сообщение нашел к!
Этот задание более учебное, и никак не коммерческое. Пытаюсь писать маленькие програмки на Java!

Автор: lovermann 27.12.2005, 03:27
Смотри, сайт - это страницы. А страница - это просто много HTML-текста. Вот ты берёшь этот текст и выискиваешь в нём с помощью регулярных выражений то, что тебе нужно. Вот на этот текст (String) и применяешь String.indexOf("k");.

Система такая: чтобы тебе броузер отобразил страницу, он посылает на сервер http-запрос, а в ответ сервер возвращает HTML-код, который твой броузер трансформирует в то, что ты видишь в окне этого самого броузера. Твоя задача состоит в том, чтобы послать запрос серверу, получить текст (HTML) страницы, а потом уже копаться в этом тексте, выискивая всё, что тебе нужно. Ну, например, тебе нужен заголовок, тогда с помощью regexp-ов считываешь всё, что находится между тэгами <title>...</title>.

Это очень просто. Теперь ты можешь в поисковике искать тематически: " Java как послать запрос", регулярные выражения".

Я так понял, что, базовый простой синтаксис ты знаешь.

Удачи!

Автор: Berliner 27.12.2005, 15:31
Знаю я как подгрузить страницу, отобразить содержимое. Вот только не могу найти пример использования регулярных выражений в Java. Все восновном про Perl. Про применение регулярных выражений в Java- ничего нет! по форуму тоже пробывал искать инфы мало smile smile

Автор: LSD 27.12.2005, 15:49
Если сами регулярные выражения ты знаешь, то с Java все просто:
1. Создаем екземпряр java.util.regex.Pattern
Код
Pattern pattern = Pattern.compile(<pattern>, Pattern.CASE_INSENSITIVE & Pattern.MULTILINE);

достаточно создать его один раз он не изменяемый, и разные потоки могут совместно его использовать
2. Для твоей строки создаешь Matcher
Код
Matcher matcher = pattern.matcher(str);

3. Ищешь в строке совпадения:
Код
while(matcher.find())
{
  System.out.println("Position: " + matcher.regionStart() + "-" + matcher.regionEnd());
  System.out.println("Text: '" + matcher.group() + "'");
}

group() - позволяет получить не все выражение а лишь определенную группу из него, группа 0 зарезервированна за выражением в целом

Автор: Berliner 27.12.2005, 16:09
Спасиб за информацию!

Автор: Berliner 11.1.2006, 16:38
скажите пожалуста ,а как подключится а подключаюсь примерно так:

JEditorPane htm=new JEditorPane();
htm.SetContentType("text,htm");
а дальше

Pattern pattern = Pattern.compile(<pattern>, Pattern.CASE_INSENSITIVE & Pattern.MULTILINE);
.......

скажите как указать правильно стравницу которую анализировать,

JEditorPane htm=new JEditorPane();
htm.SetContentType("text,htm");

или

URL url=new URL("http\\yahoo.com");

как правильно подключится к странице?



Автор: LSD 11.1.2006, 18:30
Получить страничку, можно получить так:
Код
URL url = new URL("http://forum.vingrad.ru/index.php");
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
Reader reader = new InputStreamReader(httpConnection.getInputStream(), httpConnection.getContentEncoding());

Автор: Berliner 20.1.2006, 09:46
Код

Pattern pattern = Pattern.compile(<pattern>, Pattern.CASE_INSENSITIVE & Pattern.MULTILINE);
Matcher matcher = pattern.matcher(str);


извините есть еще вопросик:

Не могу нормальной инфы по Pattern найти
Я думал, что Pattern pattern = Pattern.compile(<pattern>, Pattern.CASE_INSENSITIVE & Pattern.MULTILINE);

в скобках напишу запрос "типа SQL" и по нему буду анализировать страницу. Но вижу что эт не так.

Matcher matcher = pattern.matcher(str);

тут я так понимаю ищем совпадения . А что за перемення str?
если я хочу найти букву "К" то ее надо присвить String str="k";?

Пояните пожалуста этот Pattern


Автор: LSD 20.1.2006, 12:23
Пока кратко, может потом напишу статейку.

Pattern - это описатель шаблона поиска. Ты даешь ему описание того выражения, которое ты хочешь найти, на языке регулярных выражений. Он его переводит его в свой внутренний формат, пригодный для поиска.
Затем ты создаешь Matcher, этот класс производит поиск подстроки в указанной строке, используя заданный Pattern, у него есть несколько режимов поиска: полное совпадение строки с образцом или частичное.

По коду:
<pattern> - это регулярное выражение, которое ты хочешь найти.
str - это строка в которой надо производить поиск.

Пусть мы хотим найти текс между тегами <head> на странице, тогда он будет выглядеть приблизительно так:
Код
URL url = new URL("http://forum.vingrad.ru/index.php");
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
Reader reader = new InputStreamReader(httpConnection.getInputStream(), httpConnection.getContentEncoding());
StringBuffer strBuffer = new StringBuffer(5 * 1024);
char[] buffer = new char[512];
int read;
while((read = reader.read(buffer)) != -1)
  strBuffer.append(buffer, 0, read);
Pattern headPattern = Pattern.compile("<head>(.*)<\\/head>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher headMatcher = headPattern.matcher(strBuffer);
while(headMatcher.find())
  System.out.println("Head: " + headMatcher.group(1));

Автор: Berliner 23.1.2006, 16:16
Вот мой код кторый я сделал - но только что-то не работает(ничего не выдает)

Код

class scr {
 String str;

 public void scr(){
    
   
try {
    
URL url=new URL("http://www.proj.pib.com.ua/?page=1&body=podrob"); //подключаем
 //ht(url.openConnection());
HttpURLConnection http=(HttpURLConnection) url.openConnection();    //устанавливаем соединение
BufferedReader reader = new BufferedReader                            
(new InputStreamReader(http.getInputStream(),http.getContentEncoding()));// //создаем ридер (ридер)
//он будет использоваться для чтения
        
        
        
StringBuffer buffer=new StringBuffer(); //создаем буфер(buffer) в который будем писать данные
while ((str=reader.read(buffer))!=null) { //читаем с помощью //ридера(reader) и заносим в переменную str
 buffer.append(str); //добавляем в буфер(buffer) результат //считывания str 
    
Pattern pattern=Pattern.compile("<head>(.*)<\\/head>",Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(str); //ищем совпадение 

while (matcher.find()==true)
{System.out.println("Head: " + matcher.group(1));
 

}

                                        }

    }
catch(IOException e) {
//System.out.print("Введите правиьно ссылку");
                      }
    
 } 


 

}




И еще если можно поясните пожалуста, почему у меня возникает ошибка при написании следующего когда:
Код


class scr {
 String str;

 public void scr(HttpURLConnection ht){
    
   
try {
    
URL url=new URL("http://www.proj.pib.com.ua/?page=1&body=podrob");
ht(url.openConnection());


Автор: powerOn 23.1.2006, 16:28
В последней строчке ты что хочешь сделать?

Код

ht(url.openConnection());

Автор: powerOn 23.1.2006, 16:50
Буду короче. Ты этой строчкой делаешь примерно следующее:

Код

this.ht(url.openConnection());


и естественно метода ht у класса src нет. Вот ошибка.
Может так подойдет?

Код

ht = url.openConnection();

Автор: LSD 23.1.2006, 17:35
Значита так, что я нашел у тебя:

1. Ты ловишь ошибки но никуда их не выводишь, может у тебя проблема с установкой соединения, а может еще что. Так ты никогда не узнаешь.

2. Ты читаешь данные в buffer, а совпадение ищешь в str.

3. Шаблон у тебя скомпилирован без флагов MULTILINE и DOTALL, соответсвенно нужно чтобы весь искомый текст распологался в одной строке.

Для начала исправь их, потом будем дальше разбираться.

Автор: Berliner 23.1.2006, 17:38
ОК. Спасиб смотрю

Автор: Berliner 23.1.2006, 19:16
Вроде 2,3 пункты я исправил
насчет соединения -соединение устанавливается нормально
Про эксепшины я сейчас читаю как правильно обрабатывать.
Код

class scr {
 String str;

 public void scr(){
      
try {
    
URL url=new URL("http://vingrad.ru"); //подключаем 
HttpURLConnection http=(HttpURLConnection) url.openConnection();    //устанавливаем соединение
BufferedReader reader = new BufferedReader                            
(new InputStreamReader(http.getInputStream(),http.getContentEncoding()));// создаем ридер (ридер)
//он будет использоваться для чтения
        
        
        
StringBuffer buffer=new StringBuffer(); //создаем буфер(buffer) в который будем писать данные
while ((str=reader.read(buffer))!=null) { //читаем с помощью ридера(reader) и заносим в переменную str
       buffer.append(str); //добавляем в буфер(buffer) результат считывания str 
    
Pattern pattern=Pattern.compile("<head>(.*)<\\/head>",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE | Pattern.DOTALL);
Matcher matcher=pattern.matcher(buffer); //ищем совпадение 

while (matcher.find()==true)
{System.out.println("Head: " + matcher.group(1));
 

}

                                        }

    }
catch(IOException e) {
//System.out.print("Введите правиьно ссылку");
                      }
    
 } 


 

}




но вылазит такая ошибка


C:\Documents and Settings\Administrator\Рабочий стол\istr\src\istr\istr.java:326: cannot find symbol
symbol : method read(java.lang.StringBuffer)
location: class java.io.BufferedReader
while ((str=reader.read(buffer))!=null) { //читаем с помощью ридера(reader) и заносим в переменную str
1 error
СБОРКА ЗАВЕРШЕНА НЕУДАЧНО (общее время: 0 секунд)

Код


this.ht(url.openConnection());

не получается так.

Автор: chief39 23.1.2006, 19:38
Он не может найти метод в который передаётся StringBuffer
Есть только метод, в коотрый передаётся String

В код не вчитывался но

вместо
Код

while ((str=reader.read(buffer))!=null) 

сделай
Код

while ((str=reader.read(buffer.toString()))!=null) 

Автор: batigoal 23.1.2006, 20:14
Судя по доке, так тоже не выйдет. Ему нужен массив char[].

Автор: LSD 23.1.2006, 21:02
Цитата(Berliner @ 23.1.2006, 19:16 Найти цитируемый пост)
Про эксепшины я сейчас читаю как правильно обрабатывать.

На время отладки, вполне достаточно:
Код
try
{
.....
}
catch(Exception ex)
{
  ex.printStackTrace();
}


Метод read() принимает в качестве аргумента или char[] или CharBuffer. Мне кажется на даном этапе обучения связываться с CharBuffer, не стоит.

Чем тебе не нравится тот код, что я тебе привел? Он полностью рабочий, за исключением одного момента. httpConnection.getContentEncoding() иногда возвращает null (на винграде например так). Поэтому надо кодировку или указать вручную, или не указывать вообще: Reader reader = new InputStreamReader(httpConnection.getInputStream());.


Автор: Berliner 24.1.2006, 10:09
Цитата

Чем тебе не нравится тот код, что я тебе привел? Он полностью рабочий, за исключением одного момента. httpConnection.getContentEncoding() иногда возвращает null (на винграде например так).

Спасиб! ничего против твоего кода я не имею- просто пытаюсь сам писать, так я лучше усваиваю. ок спасиб буду разбираться в коде

Автор: Berliner 2.2.2006, 14:45
Я так понял тут регулярое выражение вылавливает первую строку текста
между тегами head. а как например сделать чтобы если находит слово подробности выдавал с помощью drawstring("Нашел",13,20)
я составил такое рег выражения "^Подробности$" но не работает в коде. Подскажитепожалуста, что неправильно сделал? И как работу с drawstring класса Graphics сюда прикрутить?
Код

URL url = new URL("http://forum.vingrad.ru/index.php");
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
Reader reader = new InputStreamReader(httpConnection.getInputStream(), httpConnection.getContentEncoding());
StringBuffer strBuffer = new StringBuffer(5 * 1024);
char[] buffer = new char[512];
int read;
while((read = reader.read(buffer)) != -1)
  strBuffer.append(buffer, 0, read);
Pattern headPattern = Pattern.compile("<head>(.*)<\\/head>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher headMatcher = headPattern.matcher(strBuffer);
while(headMatcher.find())
  System.out.println("Head: " + headMatcher.group(1));


Автор: LSD 2.2.2006, 15:52
Цитата(Berliner @ 2.2.2006, 14:45 Найти цитируемый пост)
Я так понял тут регулярое выражение вылавливает первую строку текста
между тегами head.

Нет, он находит весь текст между тегами head, независимо от того сколько строк он занимает.

Цитата(Berliner @ 2.2.2006, 14:45 Найти цитируемый пост)
я составил такое рег выражения "^Подробности$" но не работает в коде.

Это регулярно выражение требует: чтобы вся входная строка символос состояла из Подробности больше, ничего в ней быть не должно (при условии что регулярное скомпилированно с флагами CASE_INSENSITIVE, MULTILINE, DOTALL).

Цитата(Berliner @ 2.2.2006, 14:45 Найти цитируемый пост)
И как работу с drawstring класса Graphics сюда прикрутить?

Тебе нужно создать свой компонент и в его методе paint() уже можно будет рисовать. Только надо ли это? Если хочешь отобразить данные в окне, есть способы и попроще.

Автор: Berliner 2.2.2006, 16:54
Цитата

ебе нужно создать свой компонент и в его методе paint() уже можно будет рисовать. Только надо ли это? Если хочешь отобразить данные в окне, есть способы и попроще.

Хочу что-то типа как в Delphi Showmessage каой есть аналог?

Нашел что- то -написал нашел!

Автор: LSD 2.2.2006, 17:55
Цитата(Berliner @ 2.2.2006, 16:54 Найти цитируемый пост)
Хочу что-то типа как в Delphi Showmessage каой есть аналог?

Код
JOptionPane.showMessageDialog(Main.this, "Do your realy wont to quit?", "Confirmation", JOptionPane.INFORMATION_MESSAGE);

Автор: Berliner 2.6.2006, 11:56
Этекранировал спец символы /  в регулярном выражение - дает ошибку на компиляции. Подскажите как правильно
Код

Pattern pattern=Pattern.compile(" size=-1\>ATM00071 \<\/FONT\>\<\/A\>\<\/TD\>",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE|Pattern.DOTALL);

 

Автор: LSD 3.6.2006, 13:21
1. Тут идет двойное экранирование: 1-ое это экранирование символа \ в строковых литералах, 2-ое это то что ты пытался экранировать. Выглядеть это будет так:
Код
Pattern p1 = Pattern.compile(" size=-1\\>ATM00071 \\<\\/FONT\\>\\<\\/A\\>\\<\\/TD\\>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);


2. Символ / и < не имею никакого особого значения в регулярных выражениях и в экранировании не нуждаются. 

Автор: Berliner 6.6.2006, 09:51
Спасиб за ответ

Вот пишу програмку и есть некоторые  трудности в написании кода
Подскажите плиз
Код

class FileR{
        
int read,i;
String stroka;

    
public void readF(){
    
File filename=new File("c:/atm.txt");


String atm [] = new String [10];

atm[0]="ATM00071";
atm[1]="ATM00072";
atm[2]="ATM00073";
atm[3]="ATM00262";
atm[4]="ATM00416";
atm[5]="00547";
atm[6]="00566";
atm[7]="00692";
atm[8]="00781";
atm[9]="00782";
for (i=0; i<9; i++)// do till atm i
{
System.out.println(atm[i]);
}



try {
        
FileReader reader=new FileReader(filename);
StringBuffer StrBuffer=new StringBuffer (5*1024);


char[] buffer=new char[512];


while ((read=reader.read(buffer))!=-1)
    
{
   
StrBuffer.append(buffer,0,read);   
Pattern pattern=Pattern.compile(".+00071+.",Pattern.CASE_INSENSITIVE| Pattern.MULTILINE|Pattern.DOTALL);
Matcher matcher=pattern.matcher(StrBuffer);


if (matcher.find()) {

 
    
  
System.out.println("тег "+matcher.group(0));

break;

}
else 
   JOptionPane.showMessageDialog(null,"ничего не нашел",null,JOptionPane.YES_NO_OPTION);
    break;

}

}






Эта програмка должна анализировать сайт на сайте отображается состояние cash point-ов, если ATM не работает то высвечивется N в определееном месте. Каждый банкомат имеет свое имя. (как "подключиться к сайту" я знаю). 
сложности следующие: 
мне нужно чтобы найдя банкомат(по имени) с помощью регялярного выражения(банкомат по имени я нахожу)

 определить есть ли связь буква Y или N(проанализировать текст на несколько строк ниже <DIV align=left><FONT size=-1>N</FONT></DIV></TD>).
Если есть(Y) то ищем другой банкомат и проверяем связь. Если Нет связи высвечиваем сообщение нету связи и дальше ищем, пока не просомтрим все банкоматы у меня не получается реализовать этот алгоритм.

И хочится чтобы имена банкоматов читал из текстового файла а не забивались в нутрь программы, может кто нить знает.

ниже часть кода HTML которій я анализирую


<TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00071"><FONT 
            size=-1>ATM00071 </FONT></A></TD>
          <TD width="12%" bgColor=#ffff00><FONT size=-1>Внимание:есть 
            ошибки</FONT></TD>
          <TD width="19%"><FONT size=-1>...</FONT></TD>
          <TD width="3%" bgColor=#80ff80>
            <DIV align=left><FONT size=-1>N</FONT></DIV></TD>
          <TD width="12%"><FONT size=-1><A 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/last_dsps.jsp?PSSWD=122042">Последняя 
            выдача </A></FONT></TD>
          <TD width="8%" bgColor=#ffff00>
            <DIV align=center><FONT size=-1>2</FONT></DIV></TD></TR>
        <TR bgColor=#ffffff>
          <TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00072"><FONT 
            size=-1>ATM00072 </FONT></A></TD>
          <TD width="12%" bgColor=#ffffff><FONT size=-1>Внимание</FONT></TD>
          <TD width="19%"><FONT size=-1>...</FONT></TD>
          <TD width="3%" bgColor=#80ff80>
            <DIV align=left><FONT size=-1>Y</FONT></DIV></TD>
          <TD width="12%"><FONT size=-1><A 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/last_dsps.jsp?PSSWD=122048">Последняя 
            выдача </A></FONT></TD>
          <TD width="8%" bgColor=#80ff80>
            <DIV align=center><FONT size=-1>0</FONT></DIV></TD></TR>
        <TR bgColor=#ffffff>
          <TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00073"><FONT 


  

Автор: Ivan Kolesnikov 6.6.2006, 13:38
Привет, анализируя содержимое, можно жестко привязаться к дизайну сайта (просто выделив нужный код и изменив участки которые меняются), но тогда при небольших изменениях программа уже не будет ничего находить, поэтому лучше привязываться только к общей структуре таблиц.

То что тебе нужно, можно найти например следующим регекспом:
Код

Pattern headPattern = Pattern.compile("<tr[^>]*>.*?<font[^>]*>\\s*(.*?)\\s*</font>.*?(?:<td.*?){3}<font[^>]*>\\s*(.*?)\\s*</font>",
  Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher headMatcher = headPattern.matcher(strBuffer);
while (headMatcher.find())
  System.out.println(headMatcher.group(1) + " - " + headMatcher.group(2));

Подсовываешь ему все содержимое полученной страницы и я думаю он отлично с этим справится, хотя возможно необходимо будет выделить тот кусок, что ты привел выше.

Теперь немножко что этот регексп делает smile, раньше я жутко боялся таких вещей, но работая с Perl грех не пользоваться таким мощным инструментом, вот и научился, и перестал боятся. Я первый раз использовал регекспы на Java, и оказывается они практически неотличаются, покрайней мере твой пример выглядит абсолютно также.

Так вот:
  • ищем "<tr";
  • пропускам все символы, кроме ">" ([] - обозначают набор символов, а если вначале стоит ^ - то все кроме этих символов);
  • пропускам как можно меньше любых символов (знак ? - уменьшает жадность), пока не встретится "<font";
  • доходим до ">";
  • пропускам пробельные символы (\s);
  • получаем номер банкомата;
  • пробелы нам не нужны;
  • граница банкомата тег "</font>";
  • далее можно пропустить несколько символов, до "<td" (опять знак вопроса, а это значит, что до первого "<td")
  • нужно пропустить не один, а 3 тега "<td", я ненавижу дублирование поэтому, сгруппировал эти символы (круглые скобки), а так как результат нам не интересен, то поставил знак "?:";
  • также как и номер банкомата проверяем его статус.
Вот и все, насчет чтения из файла, я думаю на форуме полно таких вопросов, поищи лучше.

Про то как выводить все это в графическом виде, помочь тебе пока не могу (сам только взялся за GUI).

Пока. 

P.S. Извини, я что-то маленько не то тебе подсказал smile, если тебе нужны не все банкоматы, а только конкретные (из списка), то можно или динамически генерировать регулярное выражение (заменить в нем первые круглые скобки на искомый банкомат) или просматривать все, а реагировать только на необходимые. Как оптимальнее сказать тебе не могу, так как Java еще не долго изучаю, попробуй сравни. 

Автор: Berliner 7.6.2006, 10:37
Спасиб за код, но тут такой вопрос мне бы хотелось чтобы анализ HTML страницы проходил  по названию банкоматов(названия у меня забиты в массиве данных). например, банкомат уже  есть на сайте,  но он еще не конфигурирован, то есть связь постоянно N.   


Цитата

Извини, я что-то маленько не то тебе подсказал smile, если тебе нужны не все банкоматы, а только конкретные (из списка), то можно или динамически генерировать регулярное выражение (заменить в нем первые круглые скобки на искомый банкомат) или просматривать все, а реагировать только на необходимые. Как оптимальнее сказать тебе не могу, так как Java еще не долго изучаю, попробуй сравни. 


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

Автор: Berliner 8.6.2006, 11:25
иожет кто нить знает? 

Автор: Ivan Kolesnikov 8.6.2006, 12:09
Привет!

Вариант 1-й (получаем все, но сохраняем только важные для нас):
Код

String[] items = {"ATM00071", "ATM00072", "ATM00073"};
        
//Сортируем чтобы работал бинарный поиск
Arrays.sort(items);
Pattern headPattern = Pattern.compile("<tr[^>]*>.*?<font[^>]*>\\s*(.*?)\\s*</font>.*?(?:<td.*?){3}<font[^>]*>\\s*(.*?)\\s*</font>",
  Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher headMatcher = headPattern.matcher(strBuffer);
while (headMatcher.find())
  if (Arrays.binarySearch(items, headMatcher.group(1))>-1)
    System.out.println(headMatcher.group(1) + " - " + headMatcher.group(2));


Вариант 2-й:
Изменяем динамически регулярное выражение:
Код

String[] items = {"ATM00071", "ATM00072", "ATM00073"};
Pattern p;
Matcher m;
for (int i=0; i<items.length; i++) {
  p = Pattern.compile(items[i] + ".*?(?:<td.*?){3}<font[^>]*>\\s*(.*?)\\s*</font>",
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  m = p.matcher(strBuffer);
  System.out.print(items[i] + " - ");
  if (m.find())
    System.out.println(m.group(1));
  else
    System.out.println("NO");
};


Не в обиду, почитай философию Java, разберись с ней хорошенько, и не нужно будет все вопросы только на форуме решать smile 

Автор: Berliner 20.9.2006, 14:21
Спасиб второй вариант классно подходит

Код

String[] items = {"ATM00071", "ATM00072", "ATM00073"};
Pattern p;
Matcher m;
for (int i=0; i<items.length; i++) {
  p = Pattern.compile(items[i] + ".*?(?:<td.*?){3}<font[^>]*>\\s*(.*?)\\s*</font>",
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  m = p.matcher(strBuffer);
  System.out.print(items[i] + " - ");
  if (m.find())
    System.out.println(m.group(1));
  else
    System.out.println("NO");
};


Только что то неправильноь ищет не находит букву N ошибка в регулярном выражеинии может кто нитьзнает ячто подправить? Ниже часть примера страницы 

Эта програмка должна анализировать сайт на сайте отображается состояние cash point-ов, если ATM не работает то высвечивется N в определееном месте. Каждый банкомат имеет свое имя. (как "подключиться к сайту" я знаю). 
сложности следующие: 
мне нужно чтобы найдя банкомат(по имени) с помощью регялярного выражения(банкомат по имени я нахожу)

 определить есть ли связь буква Y или N(проанализировать текст на несколько строк ниже <DIV align=left><FONT size=-1>N</FONT></DIV></TD>).
Если есть(Y) то ищем другой банкомат и проверяем связь. Если Нет связи высвечиваем сообщение нету связи и дальше ищем, пока не просомтрим все банкоматы у меня не получается реализовать этот алгоритм.
Код
<TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00071"><FONT 
а вот номер ATM00071            size=-1>ATM00071 </FONT></A></TD>
          <TD width="12%" bgColor=#ffff00><FONT size=-1>Внимание:есть 
            ошибки</FONT></TD>
          <TD width="19%"><FONT size=-1>...</FONT></TD>
          <TD width="3%" bgColor=#80ff80>
вот тут N значит не работает ATM00071   <DIV align=left><FONT size=-1>N</FONT></DIV></TD>
          <TD width="12%"><FONT size=-1><A 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/last_dsps.jsp?PSSWD=122042">Последняя 
            выдача </A></FONT></TD>
          <TD width="8%" bgColor=#ffff00>
            <DIV align=center><FONT size=-1>2</FONT></DIV></TD></TR>
        <TR bgColor=#ffffff>
          <TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00072"><FONT 
            size=-1>ATM00072 </FONT></A></TD>
          <TD width="12%" bgColor=#ffffff><FONT size=-1>Внимание</FONT></TD>
          <TD width="19%"><FONT size=-1>...</FONT></TD>
          <TD width="3%" bgColor=#80ff80>
            <DIV align=left><FONT size=-1>Y</FONT></DIV></TD>
          <TD width="12%"><FONT size=-1><A 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/last_dsps.jsp?PSSWD=122048">Последняя 
            выдача </A></FONT></TD>
          <TD width="8%" bgColor=#80ff80>
            <DIV align=center><FONT size=-1>0</FONT></DIV></TD></TR>
        <TR bgColor=#ffffff>
          <TD width="10%"><A title="Посмотреть детально" 
            href="http://192.168.64.5:7777/atmcity/jsp/monitor/detail.jsp?PSSWD3=H2605&amp;T_ID=ATM00073"><FONT 

Автор: LSD 22.9.2006, 11:42
Модератор: разделил темы, новая тема http://forum.vingrad.ru/index.php?showtopic=113040.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)