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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с HTML? HTMLDocument, загрузка HTML, парсинг ... 
:(
    Опции темы
Sleepy_PIP
Дата 30.6.2004, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 12



в Java я пока чайник ... не пинайте сильно! smile.gif

Тут вот есть необходимость работать с html. надо его парсить и получать из
него как минимум все ссылки.
Нашел на http://javaalmanac.com пример:
try
{
URL url= new URI("file:////c://ttt.html").toURL();
URLConnection conn=url.openConnection();
Reader rd= new InputStreamReader(conn.getInputStream());

EditorKit kit= new HTMLEditorKit();

HTMLDocument doc=(HTMLDocument)kit.createDefaultDocument();
try
{
kit.read(rd, doc, 0);
}
catch(ChangedCharSetException ee)
{ };

HTMLDocument.Iterator it=doc.getIterator(HTML.Tag.A);
while(it.isValid())
{
SimpleAttributeSet s = (SimpleAttributeSet)it.getAttributes();
String link=(String)s.getAttribute(HTML.Attribute.HREF);
if(link !=null)
System.out.println(link);
}
} catch (Exception E)
{
System.out.println(E.toString());

}
}

ну пробую с ним работать - и полное фиаско.
сначала на kit.read(rd, doc, 0); выскакивал эксепшен ChangedCharSetException
, покопавшись в сорцах нашел что это нормально и надо его вообщем-то
обходить. обошел, так теперь it.isValid() - false всегда, а входной стрим
при попытке с ним работать дает IOException с расшифровкой Closed stream ...
А как-же быть?
я пока не разобрался во всех тонкостях работы с html и на примере как раз
хотел разбираться, а он оказывается не рабочий sad.gif.
Подскажите в чем дело, а?
Спасибо!





--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
rni
Дата 30.6.2004, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Наверное стоит почитать про JEditorPane. Он сам парсит HTML. К нему добавляют класс-слушатель HyperLinkListener. Удачи
--------------------
r-xr-xr-x 3 мусорных ведра корня 14312 9 января 2000 perl
PM MAIL ICQ   Вверх
Sleepy_PIP
Дата 30.6.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 12



так оттуда и взято (JEditorPane.java):
=====================
....
* <p>
* There are multiple ways to get a character set mapping to happen
* with <code>JEditorPane</code>.
* <ol>
* <li>
* One way is to specify the character set as a parameter of the MIME
* type. This will be established by a call to the
* <a href="#setContentType">setContentType</a> method. If the content
* is loaded by the <a href="#setPage">setPage</a> method the content
* type will have been set according to the specification of the URL.
* It the file is loaded directly, the content type would be expected to
* have been set prior to loading.
* <li>
* Another way the character set can be specified is in the document itself.
* This requires reading the document prior to determining the character set
* that is desired. To handle this, it is expected that the
* <code>EditorKit</code>.read operation throw a
* <code>ChangedCharSetException</code> which will
* be caught. The read is then restarted with a new Reader that uses
* the character set specified in the <code>ChangedCharSetException</code>
* (which is an <code>IOException</code>).
* </ol>
* <p>
* <dt><b><font size=+1>Newlines</font></b>
* <dd>
* For a discussion on how newlines are handled, see
* <a href="text/DefaultEditorKit.html">DefaultEditorKit</a>.
* </dl>
*
* <p>
....
=====================

так вот как мне - " * One way is to specify the character set as a parameter of the MIME
* type. " - я не нашел подходящих методов ни в HTMLDocument ни в EditorKit

или как мне - " * Another way the character set can be specified is in the document itself.
* This requires reading the document prior to determining the character set
* that is desired. To handle this, it is expected that the
* <code>EditorKit</code>.read operation throw a
* <code>ChangedCharSetException</code> which will
* be caught. The read is then restarted with a new Reader that uses ..."
как мне его рестартовать (без перезакачивания с инета), если стрим уже closed (что кстати определить то-ж проблемматично - после kit.read(rd, doc, 0); любая операция со стримом приводит к IOExceptiuon, и определить что этот эксепшен всего-то на stream closed можно только по анализу строки эксепшена - ну не маразм? sad.gif(( ).

вот такие проблеммы.
Может у кого есть _рабочие_ примеры, а?

Спасибо!


PS: интересно - проблемма то вообщем простая, а ни примеров, ни доков толковых ... в книжках этого просто нет ... и что каждый раз в сорцы ходить? ... че-то не так в этом супе sad.gif((.




--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Andyb
Дата 1.7.2004, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 4
Всего: 5



По поводу всех ссылок - посмотри вот эту прогу, может что-нибудь пригодится:
Код

import java.io.*;
import java.net.*;
import java.util.*;

public class URLConnectionTest
{  
  public static void main(String[] args)
  {  
     try
     {  
        String urlName;
        if (args.length > 0)
           urlName = args[0];
        else
           urlName = "http://java.sun.com";

        URL url = new URL(urlName);
        URLConnection connection = url.openConnection();

       
        if (args.length > 2)
        {  
           String username = args[1];
           String password = args[2];
           String input = username + ":" + password;
           String encoding = base64Encode(input);
           connection.setRequestProperty("Authorization",
              "Basic " + encoding);
        }

        connection.connect();  
        int n = 1;
        String key;
        while ((key = connection.getHeaderFieldKey(n)) != null)
        {  
           String value = connection.getHeaderField(n);
           System.out.println(key + ": " + value);
           n++;
        }
        System.out.println("----------");
        System.out.println("getContentType: "
           + connection.getContentType());
        System.out.println("getContentLength: "
           + connection.getContentLength());
        System.out.println("getContentEncoding: "
           + connection.getContentEncoding());
        System.out.println("getDate: "
           + connection.getDate());
        System.out.println("getExpiration: "
           + connection.getExpiration());
        System.out.println("getLastModifed: "
           + connection.getLastModified());
        System.out.println("----------");

        BufferedReader in = new BufferedReader(new
           InputStreamReader(connection.getInputStream()));

        String line;
        n = 1;
        while ((line = in.readLine()) != null && n <= 10)
        {  
           System.out.println(line);
           n++;
        }
        if (line != null) System.out.println(". . .");
     }
     catch (IOException exception)
     {  
        exception.printStackTrace();
     }
  }

 public static String base64Encode(String s)
  {  
     ByteArrayOutputStream bOut
        = new ByteArrayOutputStream();
     Base64OutputStream out = new Base64OutputStream(bOut);
     try
     {  
        out.write(s.getBytes());
        out.flush();
     }
     catch (IOException exception)
     {
     }
     return bOut.toString();
  }
}


class Base64OutputStream extends FilterOutputStream
{
  private int col = 0;
  private int i = 0;
  private int[] inbuf = new int[3];

  public Base64OutputStream(OutputStream out)
  {  
     super(out);
  }

  public void write(int c) throws IOException
  {  
     inbuf[i] = c;
     i++;
     if (i == 3)
     {  
        super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
        super.write(toBase64[((inbuf[0] & 0x03) << 4) |
           ((inbuf[1] & 0xF0) >> 4)]);
        super.write(toBase64[((inbuf[1] & 0x0F) << 2) |
           ((inbuf[2] & 0xC0) >> 6)]);
        super.write(toBase64[inbuf[2] & 0x3F]);
        col += 4;
        i = 0;
        if (col >= 76)
        {  
           super.write('\n');
           col = 0;
        }
     }
  }

  public void flush() throws IOException
  {  
     if (i == 1)
     {  
        super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
        super.write(toBase64[(inbuf[0] & 0x03) << 4]);
        super.write('=');
        super.write('=');
     }
     else if (i == 2)
     {  
        super.write(toBase64[(inbuf[0] & 0xFC) >> 2]);
        super.write(toBase64[((inbuf[0] & 0x03) << 4) |
           ((inbuf[1] & 0xF0) >> 4)]);
        super.write(toBase64[(inbuf[1] & 0x0F) << 2]);
        super.write('=');
     }
  }

  private static char[] toBase64 =
  {  
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
     'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
     'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
     'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
     'w', 'x', 'y', 'z', '0', '1', '2', '3',
     '4', '5', '6', '7', '8', '9', '+', '/'
  };

 
}


--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
Sleepy_PIP
Дата 2.7.2004, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 12



Кстати оказалось все просто. не совсем полное решение задачи - частичное только, но тем не менее мне хватает.
а именно - надо сделать следущее:
после
HTMLDocument doc=(HTMLDocument)kit.createDefaultDocument();
сказать:
doc.putProperty("IgnoreCharsetDirective",Boolean.TRUE);

и все ... пока все smile.gif.



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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