HTML parse
От: RedCollarPanda  
Дата: 17.03.14 11:08
Оценка:
День добрый. Есть задачка:
-Вычачать HTML страничку и все картинки на которые она ссылается. (сделано)
-Открыв страничку на локальной машине браузером я хотел бы видеть эти картинки, т.е. переписать путь в тэге <img src=..."

Как это сделать наиболее эффективно? Я подумывал о regex, но на stackoverflow категорически не советуют этого делать.
Re: HTML parse
От: Blazkowicz Россия  
Дата: 17.03.14 11:13
Оценка:
Здравствуйте, RedCollarPanda, Вы писали:

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

Не проще ли заинжектить свой собственный JavaScript+jQuery и ими обработать все картинки?
Re[2]: HTML parse
От: RedCollarPanda  
Дата: 17.03.14 11:17
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, RedCollarPanda, Вы писали:


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

B>Не проще ли заинжектить свой собственный JavaScript+jQuery и ими обработать все картинки?


Надо написать на Java.
Re: HTML parse
От: vsb Казахстан  
Дата: 17.03.14 11:32
Оценка: 1 (1) +1
Здравствуйте, RedCollarPanda, Вы писали:

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


Не нужно бездумно слушать SO. Там в основном умные мысли, но встречаются и глупости. Если структура веб-страницы неизменна (генерируется скриптом), то regexp чаще всего прекрасно подходит.

Суть претензий к регэкспу обычно в том, что XML (и HTML) это рекурсивная структура, а регэкспы не могут парсить рекурсивные структуры. Но в большинстве случаев можно работать с HTML как с текстом, а не как с древовидной структурой и никаких проблем не возникает.

А так аналог — распарсить HTML в DOM-документ одним из движков и в DOM-е ориентироваться одним из способов (либо XPath-селекторы либо CSS-селекторы).
Re[2]: HTML parse
От: RedCollarPanda  
Дата: 17.03.14 12:14
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, RedCollarPanda, Вы писали:


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


vsb>Не нужно бездумно слушать SO. Там в основном умные мысли, но встречаются и глупости. Если структура веб-страницы неизменна (генерируется скриптом), то regexp чаще всего прекрасно подходит.


vsb>Суть претензий к регэкспу обычно в том, что XML (и HTML) это рекурсивная структура, а регэкспы не могут парсить рекурсивные структуры. Но в большинстве случаев можно работать с HTML как с текстом, а не как с древовидной структурой и никаких проблем не возникает.


vsb>А так аналог — распарсить HTML в DOM-документ одним из движков и в DOM-е ориентироваться одним из способов (либо XPath-селекторы либо CSS-селекторы).


ТО есть regex подойдет если я хочу нечто вроде :

У меня например есть такие теги в файле, который я закачал


<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" — как бы из текущей директории

я на всякий пожарный сохраняю в отдельном массиве/буфере название всех картинок.
Re[3]: HTML parse
От: avpavlov  
Дата: 17.03.14 14:56
Оценка:
RCP>ТО есть regex подойдет если я хочу нечто вроде :

Регэксп для таких простых случаев может не подойти только когда требования довольно экзотичны, например обязательно обновить только тэги, но не комментарии

<!--
<img src="leave_this_as_is.jpg">
-->
<img src="need_to_be_replaced.jpg">


или, например, заменять картинки внутри параграфов и оставить как есть в таблицах.

В твоём случае регэкспа хватит с головой.
Re: HTML parse
От: andyag  
Дата: 17.03.14 17:27
Оценка:
Здравствуйте, RedCollarPanda, Вы писали:

RCP>День добрый. Есть задачка:

RCP>-Вычачать HTML страничку и все картинки на которые она ссылается. (сделано)
RCP>-Открыв страничку на локальной машине браузером я хотел бы видеть эти картинки, т.е. переписать путь в тэге <img src=..."

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


Вот эта штука: http://jsoup.org/ умеет выкачивать, вносить правки в DOM, и потом сохранять уже с правками.
Re: HTML parse
От: Аноним  
Дата: 18.03.14 03:57
Оценка:
Всем большое спасибо!
Re[3]: HTML parse
От: Eugeny__ Украина  
Дата: 18.03.14 22:40
Оценка: +1
Здравствуйте, RedCollarPanda, Вы писали:


RCP>У меня например есть такие теги в файле, который я закачал



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


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


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


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


Кстати, в таком случае можно было бы пойти и другим путем. Скачанные картинки складывать не в текущую папку с html, а, собственно, с сохранением иерархии относительно текущей. Ну, т.е. файл hp01-thumb-cloudworld-2110108.jpg скачивать в папку us. Тогда при открытии в браузере она прекрасно отобразится без всяких изменений хтмл-кода. Некоторый плюс такого подхода в том, что многие картинки, отображаемые через js, тоже будут показываться.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[2]: HTML parse
От: Аноним  
Дата: 20.03.14 10:36
Оценка:
Получилось вот так, но не работает


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();
        }

    }
}
Re[4]: HTML parse
От: BrainSlug Израиль  
Дата: 20.03.14 10:43
Оценка:
Это если писали страничку адекватные люди. Редко, но бывает, указывают абсолютные пути у картинок и тогда такой способ не подойдет.
.
Re[3]: HTML parse
От: avpavlov  
Дата: 20.03.14 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Спасибо, что не стал спойлерить и портить удовольствие от разбора твоего кода, чтобы понять, что не работает!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.