Копирование из интернета

Тема в разделе "Java", создана пользователем Angfal, 30 май 2007.

Статус темы:
Закрыта.
  1. Angfal

    Angfal Гость

    Народ, мне нужно, при помощи команд java, с любого сайта новостей скачать страницу (лучше XML) с текстом новостей.

    Подскажите, акк это можно реализовать.
     
  2. Pete

    Pete Гость

    Apache'вский HttpClient вам в помощь
     
  3. Angfal

    Angfal Гость

    Это мне ничего не говорит, мне нужен пример кода
     
  4. Dzmitry Vl.Bondar

    Dzmitry Vl.Bondar Гость

    В языке существует масса способов получить данные в некотором виде по определенному URL. Все будет зависеть от того какая далее будет производиться их обработка. Насколько я понимаю, желательно получать XML файл и его парсить. Однако я предложу более изящное решение - парсить саму HTML страничку на лету. Для этого нам понадобятся следующие библиотеки:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.MissingResourceException;
    import javax.swing.text.MutableAttributeSet;
    import javax.swing.text.html.HTMLEditorKit.ParserCallback;
    import javax.swing.text.html.parser.ParserDelegator;

    Все что нам нужно - создать некоторый сервлет, который сможет делать запрос по определенному URL (к примеру заранее определенному в файле свойств) и получать отображение HTML-страницы в виде битового потока. После чего просто парсить данные по определенным ключам.

    Итак - сервлет

    public class RealityParserSuite extends SiteParserCase {
    /** Contains static field for any instances of the class */
    private static final String ID = "Reality";
    /** Container for the parsed data */
    private static ParsingResultSet results = new ParsingResultSet(ID);
    /** Work-process variables */
    private BufferedReader webPageStream = null;
    private URL stockSite = null;
    private ParserDelegator htmlParser = null;
    private PageParserCallback callback = null;

    /**
    * Экземпляр класса с необходимым URL для парсинга
    */
    public RealityParserSuite() throws MissingResourceException {
    PropertyChecker property = null;
    try { property = new PropertyChecker("Reality"); }
    /**
    * In the case of missing need to be parsed resources throwing an Exception which must be catched
    */
    catch(MissingResourceException e) {
    throw new MissingResourceException(e.getMessage(), e.getClassName(), e.getKey());
    }
    /** Contains all of the need to be parsed urls */
    stockSite = new URL(...);//Достаем из файла свойств
    property = null;
    }

    /** Процесс парсинга */
    public ParsingResultSet parse() throws IOException, MalformedURLException {
    htmlParser = new ParserDelegator();
    callback = new PageParserCallback();
    webPageStream = new BufferedReader(new InputStreamReader(stockSite.openStream()));
    synchronized(htmlParser){
    htmlParser.parse(webPageStream, callback, false);
    }
    return results;
    }

    Далее собственно сам процесс парсинга

    class PageParserCallback extends ParserCallback {
    /** К примеру, полезные данные расположены в тегах TR, H4, P, A, ... */
    /** Нам нужны флажки по которым мы будем узнавать что парсер дошел именно до такого тега */
    private boolean trFlag = false;
    private boolean h4Flag = false;
    private boolean pFlag = false;
    private boolean aFlag = false;
    /** Если данные находятся в таблице - нам понадобятся счетчики строк и столбцов */
    private int tdCounter = 0;
    private int trCounter = 0;
    /** Ну и переменные, которые будут содержать наши данные. В дальнейшем удобнее создать объект, отражающий структуру получаемых данных */
    private String header = "";
    private String description = "";
    private String price = "";
    private String infolink = "";
    /** Будет содержать текст в теге */
    private String htmlText = "";

    /**
    * Creates a new instance of PageParserCallback
    */
    public PageParserCallback(){
    setUp();
    tdCounter = 0;
    trCounter = 0;
    trFlag = false;
    h4Flag = false;
    pFlag = false;
    aFlag = false;
    }

    private void setUp() {
    header = "";
    description = "";
    price = "";
    infolink = "";
    }

    // Если имела место ошибка в процессе парсинга - описать действия тут
    public void handleError(String errorMsg, int pos){
    ....
    }
    // встреча начала любого тега
    public void handleStartTag(javax.swing.text.html.HTML.Tag t, MutableAttributeSet a, int pos){
    /** Check <tr> area beginnings */
    if (t == javax.swing.text.html.HTML.Tag.TR){
    trFlag = true;
    trCounter++;
    tdCounter = 0;
    }
    /** Check <td> area beginnings and count them.
    * The structure of data grid layout:
    * 1st <td> contains input (value = order number);
    * 2nd <td> contains <a href=link to detailed info>title</a>
    * <p>basic description</p>
    * <p><span>type</span> , <span>type</span>...</p>
    * 3rd <td> contains region
    * 4th <td> contains price/price per square and
    * <span>description</span>
    * 5th <td> contains offers type (building)
    * 6th <td> contains picture link
    */
    else if (t == javax.swing.text.html.HTML.Tag.TD){
    tdCounter++;
    }
    /** Check <h4> area beginnings */
    else if (t == javax.swing.text.html.HTML.Tag.H4){
    h4Flag = true;
    }
    /** Check <p> area beginnings */
    else if (t == javax.swing.text.html.HTML.Tag.P){
    pFlag = true;
    }
    /** Check <a> area beginnings */
    else if (t == javax.swing.text.html.HTML.Tag.A){
    aFlag = true;
    if (tdCounter == 2) {
    /** Attribute "href" contains link for detailed info */
    infolink = (String)a.getAttribute((Object)"href");
    Object attrName;
    for (Enumeration e = a.getAttributeNames(); e.hasMoreElements():p {
    attrName = e.nextElement();//(String)a.getAttribute(e.nextElement());
    if(attrName.toString().equalsIgnoreCase("href"))
    infolink = (String)a.getAttribute(attrName);
    }
    orderNumber = infolink.substring(infolink.length()-12, infolink.length()-2);
    }
    }
    }
    // встреча конца любого тега
    public void handleEndTag(javax.swing.text.html.HTML.Tag t, int pos){
    /** Check <tr> area ends and empty <td> tags counter */
    if (t == javax.swing.text.html.HTML.Tag.TR){
    trFlag = false;
    if (tdCounter > 1) {
    Map map = new HashMap();
    map.put("header", header);
    map.put("description", description);
    map.put("price", price);
    map.put("infolink", infolink);
    setUp();
    }
    }
    /** Check <h4> area ends */
    else if (t == javax.swing.text.html.HTML.Tag.H4){
    h4Flag = false;
    strongCounter = 0;
    }
    /** Check <p> area ends */
    else if (t == javax.swing.text.html.HTML.Tag.P){
    pFlag = false;
    }
    /** Check <a> area ends */
    else if (t == javax.swing.text.html.HTML.Tag.A){
    aFlag = false;
    }
    }

    public void handleText (char[] data, int pos){
    /** Gets text between tags */
    htmlText = new String(data).trim();
    /** Gets orders main values */
    else if (trFlag) {
    switch(tdCounter) {
    case 2:
    if (aFlag) {
    header += htmlText;
    }
    if (pFlag) {
    description += htmlText;
    }
    break;
    case 3:
    break;
    case 4:
    price += htmlText;
    break;
    }
    }
    }
    }
    protected void finalize() {
    ....
    }
    }

    Вот собственно простейший примерчик...
    Если будут вопросы либо я неверно истолковал ваш вопрос - пишите
     
  5. Dzmitry Vl.Bondar

    Dzmitry Vl.Bondar Гость

    Прошу прощения за флуд - не разобрался с форумом еще толком
     
  6. Dzmitry Vl.Bondar

    Dzmitry Vl.Bondar Гость

    Есть еще несколько примеров другого плана - если этот не подошел - пишите выложу
     
  7. Angfal

    Angfal Гость

    Это задание в лабе, мне именно надо было отпарсить xml-ник
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей