Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ сайта, например название страницы 
:(
    Опции темы
Berliner
Дата 20.12.2005, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Подскажите пожалуста как проанализировать сайт(например найти букву к на странице).Меня интересует как можно сделать с помощью стандартных средств Java. Без сторонних библиотек. Паралельно пытаюсь разобраться C PAth запросами.Но сейчас меня интересует именно простейший пример стандартными средствами Java
PM   Вверх
3,14
Дата 20.12.2005, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 6
Всего: 24



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

Код

String.indexOf("k");



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Berliner
Дата 20.12.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Спасиб за ответ!
А вообще как обычно анализируют страницы - с помощью чего? поясните мне плиз. Я хочу учить парвильные вещи что востребовано
PM   Вверх
sragio
Дата 20.12.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 26.4.2005

Репутация: нет
Всего: 1



Посмотри в сторону регулярных выражений - regexp.
PM MAIL   Вверх
Berliner
Дата 26.12.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Может кто нить с кодом поможет как например с помощью String.indexOf("k"); найти на веб странице букву к и вывести сообщение нашел к!
Этот задание более учебное, и никак не коммерческое. Пытаюсь писать маленькие програмки на Java!
PM   Вверх
lovermann
Дата 27.12.2005, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 28.12.2004
Где: Прага

Репутация: нет
Всего: 8



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

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

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

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

Удачи!
PM WWW ICQ   Вверх
Berliner
Дата 27.12.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Знаю я как подгрузить страницу, отобразить содержимое. Вот только не могу найти пример использования регулярных выражений в Java. Все восновном про Perl. Про применение регулярных выражений в Java- ничего нет! по форуму тоже пробывал искать инфы мало smile smile
PM   Вверх
LSD
Дата 27.12.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Если сами регулярные выражения ты знаешь, то с 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 зарезервированна за выражением в целом


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 27.12.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Спасиб за информацию!
PM   Вверх
Berliner
Дата 11.1.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



скажите пожалуста ,а как подключится а подключаюсь примерно так:

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");

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



PM   Вверх
LSD
Дата 11.1.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 20.1.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Код

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


PM   Вверх
LSD
Дата 20.1.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Пока кратко, может потом напишу статейку.

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));



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 23.1.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



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

Код

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());


PM   Вверх
powerOn
Дата 23.1.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



В последней строчке ты что хочешь сделать?

Код

ht(url.openConnection());



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
powerOn
Дата 23.1.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Буду короче. Ты этой строчкой делаешь примерно следующее:

Код

this.ht(url.openConnection());


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

Код

ht = url.openConnection();



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 23.1.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Значита так, что я нашел у тебя:

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

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

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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 23.1.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



ОК. Спасиб смотрю
PM   Вверх
Berliner
Дата 23.1.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Вроде 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());

не получается так.
PM   Вверх
chief39
Дата 23.1.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



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

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

вместо
Код

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

сделай
Код

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



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
batigoal
Дата 23.1.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Судя по доке, так тоже не выйдет. Ему нужен массив char[].


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
LSD
Дата 23.1.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(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());.




--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 24.1.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Цитата

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

Спасиб! ничего против твоего кода я не имею- просто пытаюсь сам писать, так я лучше усваиваю. ок спасиб буду разбираться в коде
PM   Вверх
Berliner
Дата 2.2.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Я так понял тут регулярое выражение вылавливает первую строку текста
между тегами 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));


PM   Вверх
LSD
Дата 2.2.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(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() уже можно будет рисовать. Только надо ли это? Если хочешь отобразить данные в окне, есть способы и попроще.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 2.2.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Цитата

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

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

Нашел что- то -написал нашел!
PM   Вверх
LSD
Дата 2.2.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 2.6.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



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

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

 
PM   Вверх
LSD
Дата 3.6.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Berliner
Дата 6.6.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



Спасиб за ответ

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

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 


  
PM   Вверх
Ivan Kolesnikov
Дата 6.6.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



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

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

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 еще не долго изучаю, попробуй сравни. 

Это сообщение отредактировал(а) Ivan Kolesnikov - 6.6.2006, 13:50
--------------------
PM MAIL ICQ   Вверх
Berliner
Дата 7.6.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



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


Цитата

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


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

Это сообщение отредактировал(а) Berliner - 7.6.2006, 10:38
PM   Вверх
Berliner
Дата 8.6.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 2



иожет кто нить знает? 
PM   Вверх
Ivan Kolesnikov
Дата 8.6.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



Привет!

Вариант 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 
--------------------
PM MAIL ICQ   Вверх
Berliner
Дата 20.9.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 803
Регистрация: 18.5.2005

Репутация: 1
Всего: 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");
};


Только что то неправильноь ищет не находит букву 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 

PM   Вверх
LSD
Дата 22.9.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Модератор: разделил темы, новая тема тут.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.