Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Анализ сайта |
Автор: Berliner 20.12.2005, 13:11 |
Подскажите пожалуста как проанализировать сайт(например найти букву к на странице).Меня интересует как можно сделать с помощью стандартных средств Java. Без сторонних библиотек. Паралельно пытаюсь разобраться C PAth запросами.Но сейчас меня интересует именно простейший пример стандартными средствами Java |
Автор: 3,14 20.12.2005, 14:44 | ||||
|
Автор: 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- ничего нет! по форуму тоже пробывал искать инфы мало ![]() ![]() |
Автор: LSD 27.12.2005, 15:49 | ||||||
Если сами регулярные выражения ты знаешь, то с Java все просто: 1. Создаем екземпряр java.util.regex.Pattern
достаточно создать его один раз он не изменяемый, и разные потоки могут совместно его использовать 2. Для твоей строки создаешь Matcher
3. Ищешь в строке совпадения:
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 | ||
Получить страничку, можно получить так:
|
Автор: Berliner 20.1.2006, 09:46 | ||
извините есть еще вопросик: Не могу нормальной инфы по 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> на странице, тогда он будет выглядеть приблизительно так:
|
Автор: Berliner 23.1.2006, 16:16 | ||||
Вот мой код кторый я сделал - но только что-то не работает(ничего не выдает)
И еще если можно поясните пожалуста, почему у меня возникает ошибка при написании следующего когда:
|
Автор: powerOn 23.1.2006, 16:28 | ||
В последней строчке ты что хочешь сделать?
|
Автор: powerOn 23.1.2006, 16:50 | ||||
Буду короче. Ты этой строчкой делаешь примерно следующее:
и естественно метода ht у класса src нет. Вот ошибка. Может так подойдет?
|
Автор: 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 пункты я исправил насчет соединения -соединение устанавливается нормально Про эксепшины я сейчас читаю как правильно обрабатывать.
но вылазит такая ошибка 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 секунд)
не получается так. |
Автор: chief39 23.1.2006, 19:38 | ||||
Он не может найти метод в который передаётся StringBuffer Есть только метод, в коотрый передаётся String В код не вчитывался но вместо
сделай
|
Автор: batigoal 23.1.2006, 20:14 |
Судя по доке, так тоже не выйдет. Ему нужен массив char[]. |
Автор: LSD 23.1.2006, 21:02 | ||
На время отладки, вполне достаточно:
Метод read() принимает в качестве аргумента или char[] или CharBuffer. Мне кажется на даном этапе обучения связываться с CharBuffer, не стоит. Чем тебе не нравится тот код, что я тебе привел? Он полностью рабочий, за исключением одного момента. httpConnection.getContentEncoding() иногда возвращает null (на винграде например так). Поэтому надо кодировку или указать вручную, или не указывать вообще: Reader reader = new InputStreamReader(httpConnection.getInputStream());. |
Автор: Berliner 24.1.2006, 10:09 | ||
Спасиб! ничего против твоего кода я не имею- просто пытаюсь сам писать, так я лучше усваиваю. ок спасиб буду разбираться в коде |
Автор: Berliner 2.2.2006, 14:45 | ||
Я так понял тут регулярое выражение вылавливает первую строку текста между тегами head. а как например сделать чтобы если находит слово подробности выдавал с помощью drawstring("Нашел",13,20) я составил такое рег выражения "^Подробности$" но не работает в коде. Подскажитепожалуста, что неправильно сделал? И как работу с drawstring класса Graphics сюда прикрутить?
|
Автор: Berliner 2.2.2006, 16:54 | ||
Хочу что-то типа как в Delphi Showmessage каой есть аналог? Нашел что- то -написал нашел! |
Автор: LSD 2.2.2006, 17:55 | ||
|
Автор: Berliner 2.6.2006, 11:56 | ||
Этекранировал спец символы / в регулярном выражение - дает ошибку на компиляции. Подскажите как правильно
|
Автор: LSD 3.6.2006, 13:21 | ||
1. Тут идет двойное экранирование: 1-ое это экранирование символа \ в строковых литералах, 2-ое это то что ты пытался экранировать. Выглядеть это будет так:
2. Символ / и < не имею никакого особого значения в регулярных выражениях и в экранировании не нуждаются. |
Автор: Berliner 6.6.2006, 09:51 | ||
Спасиб за ответ Вот пишу програмку и есть некоторые трудности в написании кода Подскажите плиз
Эта програмка должна анализировать сайт на сайте отображается состояние 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&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&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&T_ID=ATM00073"><FONT |
Автор: Ivan Kolesnikov 6.6.2006, 13:38 | ||
Привет, анализируя содержимое, можно жестко привязаться к дизайну сайта (просто выделив нужный код и изменив участки которые меняются), но тогда при небольших изменениях программа уже не будет ничего находить, поэтому лучше привязываться только к общей структуре таблиц. То что тебе нужно, можно найти например следующим регекспом:
Подсовываешь ему все содержимое полученной страницы и я думаю он отлично с этим справится, хотя возможно необходимо будет выделить тот кусок, что ты привел выше. Теперь немножко что этот регексп делает ![]() Так вот:
Про то как выводить все это в графическом виде, помочь тебе пока не могу (сам только взялся за GUI). Пока. P.S. Извини, я что-то маленько не то тебе подсказал ![]() |
Автор: Berliner 7.6.2006, 10:37 | ||
Спасиб за код, но тут такой вопрос мне бы хотелось чтобы анализ HTML страницы проходил по названию банкоматов(названия у меня забиты в массиве данных). например, банкомат уже есть на сайте, но он еще не конфигурирован, то есть связь постоянно N.
Для меня этот вариант более подходящий. Помогите с кодом пожалуста. |
Автор: Berliner 8.6.2006, 11:25 |
иожет кто нить знает? |
Автор: Ivan Kolesnikov 8.6.2006, 12:09 | ||||
Привет! Вариант 1-й (получаем все, но сохраняем только важные для нас):
Вариант 2-й: Изменяем динамически регулярное выражение:
Не в обиду, почитай философию Java, разберись с ней хорошенько, и не нужно будет все вопросы только на форуме решать ![]() |
Автор: Berliner 20.9.2006, 14:21 | ||||
Спасиб второй вариант классно подходит
Только что то неправильноь ищет не находит букву N ошибка в регулярном выражеинии может кто нитьзнает ячто подправить? Ниже часть примера страницы Эта програмка должна анализировать сайт на сайте отображается состояние cash point-ов, если ATM не работает то высвечивется N в определееном месте. Каждый банкомат имеет свое имя. (как "подключиться к сайту" я знаю). сложности следующие: мне нужно чтобы найдя банкомат(по имени) с помощью регялярного выражения(банкомат по имени я нахожу) определить есть ли связь буква Y или N(проанализировать текст на несколько строк ниже <DIV align=left><FONT size=-1>N</FONT></DIV></TD>). Если есть(Y) то ищем другой банкомат и проверяем связь. Если Нет связи высвечиваем сообщение нету связи и дальше ищем, пока не просомтрим все банкоматы у меня не получается реализовать этот алгоритм.
|
Автор: LSD 22.9.2006, 11:42 |
Модератор: разделил темы, новая тема http://forum.vingrad.ru/index.php?showtopic=113040. |