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

  • Автор темы Angfal
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Angfal

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

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

Angfal

Гость
#3
Это мне ничего не говорит, мне нужен пример кода
 
D

Dzmitry Vl.Bondar

Гость
#4
В языке существует масса способов получить данные в некотором виде по определенному 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() {
....
}
}

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

Dzmitry Vl.Bondar

Гость
#5
Прошу прощения за флуд - не разобрался с форумом еще толком
 
D

Dzmitry Vl.Bondar

Гость
#6
Есть еще несколько примеров другого плана - если этот не подошел - пишите выложу
 
A

Angfal

Гость
#7
Это задание в лабе, мне именно надо было отпарсить xml-ник
 
Статус
Закрыто для дальнейших ответов.