Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > HTML parse


Автор: IgnisFatuus 17.3.2014, 14:25
День добрый. Есть задачка:
-Вычачать HTML страничку и все картинки на которые она ссылается. (сделано)
-Открыв страничку на локальной машине браузером я хотел бы видеть эти картинки, т.е. переписать путь в тэге <img src=..."

Как это сделать наиболее эффективно? Я подумывал о regex, но на stackoverflow категорически не советуют этого делать.

Автор: Stolzen 17.3.2014, 14:34
Судя по описанию, вам должна подойти библиотека Jsoup. С помощью css селектора находите все теги img, и меняете абсолютный url (или что у вас там) на локальный 

Автор: IgnisFatuus 17.3.2014, 15:13
У меня например есть такие теги в файле, который я закачал


<a href="#hp-feature-2" data-lbl="feature 2"><img src="/us/hp01-thumb-cloudworld-2110108.jpg" alt="Business in the Cloud">

я хочу сделать вместо <img src="/us/hp01-thumb-cloudworld-2110108.jpg" 

<img src="/hp01-thumb-cloudworld-2110108.jpg"   - как бы из текущей директории

я на всякий пожарный сохраняю в отдельном массиве/буфере название всех картинок.


Автор: Stolzen 17.3.2014, 22:39
Ну так отделяйте smile Я ж написал как можно... 

Автор: IgnisFatuus 18.3.2014, 06:57
Большое спасибо

Автор: IgnisFatuus 20.3.2014, 13:34

Получилось вот так, но все равно не работает


Код

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;

import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.net.URLConnection;
import javax.imageio.ImageIO;
import javax.swing.text.AttributeSet;
import javax.swing.text.html.HTMLDocument;


public class ExtractAllImages {
static String result_doc =  "/home/foo/index.html";
static String home_folder = "/home/foo/";
static String start_webURL = "http://www.oracle.com/";


public static void main(String args[]) throws Exception {

    String webUrl = start_webURL;
    URL url = new URL(webUrl);
    URLConnection connection = url.openConnection();
    InputStream is = connection.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    HTMLEditorKit htmlKit = new HTMLEditorKit();
    HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument();

    HTMLEditorKit.Parser parser = new ParserDelegator();
    HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);



    parser.parse(br, callback, true);
    FileWriter writer = new FileWriter(result_doc);
    htmlKit.write(writer, htmlDoc, 0, htmlDoc.getLength());
    writer.close();

    int number_or_images = 0;
    String[] array = new String[4096];



    for (HTMLDocument.Iterator iterator = htmlDoc.getIterator(HTML.Tag.IMG); iterator.isValid(); iterator.next()) {
        AttributeSet attributes = iterator.getAttributes();
        String imgSrc = (String) attributes.getAttribute(HTML.Attribute.SRC);
        System.out.println("img_src = " + imgSrc);


        if (imgSrc != null && (imgSrc.endsWith(".jpg") || (imgSrc.endsWith(".png")) || (imgSrc.endsWith(".jpeg")) || (imgSrc.endsWith(".bmp")) || (imgSrc.endsWith(".ico")))) {
            try {
                downloadImage(webUrl, imgSrc);
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
        array[number_or_images] = imgSrc;
        number_or_images++;
        ///TODO change


    }

    for(int i =0; i < number_or_images; i++)
    {
       System.out.println("before = "+array[i]);
        while(true)
        {
            int count = array[i].indexOf('/');
            if(count == -1) break;
            array[i] = array[i].substring(count+1);
        }
        System.out.println("after = " + array[i]);
    }


    //TODO open file and replace tags
    int i =0;
   File input = new File(result_doc);
    Document doc = Jsoup.parse(input, "UTF-8");
    System.out.println( input.canWrite());
    for( Element img : doc.select("img[src]") )
    {
        String s = img.attr("src");
        System.out.println(s);

        img.attr("src", "/home/foo/"+array[i]); // set attribute 'src' to 'your-source-here'
        s = img.attr("src");
        System.out.println(s);
        ++i;
    }








}
private static void downloadImage(String url, String imgSrc) throws IOException {
    BufferedImage image = null;
    try {
        if (!(imgSrc.startsWith("http"))) {
            url = url + imgSrc;
        } else {
            url = imgSrc;
        }
        imgSrc = imgSrc.substring(imgSrc.lastIndexOf("/") + 1);
        String imageFormat = null;
        imageFormat = imgSrc.substring(imgSrc.lastIndexOf(".") + 1);
        String imgPath = null;
        imgPath = home_folder + imgSrc + "";
        URL imageUrl = new URL(url);
        image = ImageIO.read(imageUrl);
        if (image != null) {
            File file = new File(imgPath);
            ImageIO.write(image, imageFormat, file);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

}
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)