Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Верный способ извлечения ссылок и картинок из html


Автор: Softaz 28.12.2006, 14:29
Вот способ доставания из WebBrowser. Вроде бы работает. Может есть способ красивей и проще?

Картинки
Код

        private string[] GetImageUrls(WebBrowser wb)
        {
            if (wb.Document != null)
            {
                HtmlDocument doc = wb.Document;
                string[] urls = (string[])Array.CreateInstance(Type.GetType("System.String"), doc.Images.Count);
                int i = 0;
                foreach (HtmlElement imgElement in doc.Images)
                {
                    urls[i] = imgElement.GetAttribute("src");
                    i++;
                }
                return (urls);
            }
            else
            {
                return (new string[0]);
            }
        }


Ссылки
Код

        private string[] GetLinksUrls(WebBrowser wb)
        {
            if (wb.Document != null)
            {
                HtmlDocument doc = wb.Document;
                string[] urls = (string[])Array.CreateInstance(Type.GetType("System.String"), doc.Links.Count);
                int i = 0;
                foreach (HtmlElement aElement in doc.Links)
                {
                    urls[i] = aElement.GetAttribute("href");
                    i++;
                }
                return (urls);
            }
            else
            {
                return (new string[0]);
            }
        }

Автор: Дрон 28.12.2006, 15:40
Цитата(Softaz @  28.12.2006,  14:29 Найти цитируемый пост)
string[] urls = (string[])Array.CreateInstance(Type.GetType("System.String"), doc.Images.Count);

Фигасе!  smile  smile  smile  smile  smile 

Интересно, какая религия запрещает сделать:
Код
string[] urls = new string[doc.Images.Count];

smile

И вообще лучше использовать не массив, а список: ArrayList или List<string>.

Автор: Softaz 28.12.2006, 16:21
Цитата(Дрон @  28.12.2006,  15:40 Найти цитируемый пост)
Фигасе!           

Это из... MSDN взят от сих до сих.

Говоря "красивее" я имел ввиду смену алгоритма нахождения ссылок и картинок. Не люблю WebBrowser, а с регулярными целый лес надо городить smile 

Автор: ivashkanet 28.12.2006, 16:53
Цитата(Softaz @  28.12.2006,  13:29 Найти цитируемый пост)
Вот способ доставания из WebBrowser. Вроде бы работает. Может есть способ красивей и проще?

А что тебе не нравится? Все вроде нормуль. Можно 
Цитата(Дрон @  28.12.2006,  14:40 Найти цитируемый пост)
И вообще лучше использовать не массив, а список: ArrayList или List<string>.

Тогда будет еще и красивше smile

Код

  private List<string> GetImageUrls(WebBrowser wb)
        {
            if (wb.Document != null)
            {
                HtmlDocument doc = wb.Document;
                List<string> urls = new List<sting>(doc.Images.Count);

                foreach (HtmlElement imgElement in doc.Images)
                    urls.Add(imgElement.GetAttribute("src"));
              
                return (urls);
            }
            else
            {
                return (new null);
            }
        }

Автор: Yama 29.12.2006, 12:13
Цитата(ivashkanet @ 28.12.2006,  16:53)
Цитата(Softaz @  28.12.2006,  13:29 Найти цитируемый пост)
Вот способ доставания из WebBrowser. Вроде бы работает. Может есть способ красивей и проще?

А что тебе не нравится? Все вроде нормуль. Можно 
Цитата(Дрон @  28.12.2006,  14:40 Найти цитируемый пост)
И вообще лучше использовать не массив, а список: ArrayList или List<string>.

Тогда будет еще и красивше smile

Код

  private List<string> GetImageUrls(WebBrowser wb)
        {
            if (wb.Document != null)
            {
                HtmlDocument doc = wb.Document;
                List<string> urls = new List<sting>(doc.Images.Count);

                foreach (HtmlElement imgElement in doc.Images)
                    urls.Add(imgElement.GetAttribute("src"));
              
                return (urls);
            }
            else
            {
                return (new null);
            }
        }

угу...
а это для ссылок smile
Код

public String[] getUrls(HtmlDocument hDoc){
            if (hDoc == null) throw new NullReferenceException(); //или "return null;" , что то же логично :)
            int i = 0;
            String[] s = new String[hDoc.Links.Count];
            foreach (HtmlElement link in hDoc.Links)
            {
                s[i] = link.OuterHtml;
                i++;
            }
         return s;
        }


Добавлено @ 12:23 
В догонку:
посмотри еще это
Код

String []sclick=new String[hDoc.All.Count];
            int i = 0;
            foreach (HtmlElement e in hDoc.All) {
//потому что очень много реальных ссылок
//идут по onckick, а не как <a href=.....> 
//а свойство Links берет только <a ....
                if (e.GetAttribute("ONCKLICK") != "")                 {
                    sclick[i] = e.OuterHtml;
                }

            }

но как это работает, еще не проверял, сорри, времени нет.
Как руки дойдут - проверю и напишу, что получаетцца smile .

Автор: ivashkanet 29.12.2006, 12:26
Цитата(ivashkanet @  28.12.2006,  15:53 Найти цитируемый пост)
 return (new null);

Эт я такое написал  smile 
Убейте меня ап стену smile

Нужно либо просто null (а потом его обрабатывать), либо new List<string>  smile 

Автор: Exception 30.12.2006, 15:26
Цитата(Yama @  29.12.2006,  13:13 Найти цитируемый пост)
Код

            foreach (HtmlElement e in hDoc.All) {
//потому что очень много реальных ссылок
//идут по onckick, а не как <a href=.....> 
//а свойство Links берет только <a ....
                if (e.GetAttribute("ONCKLICK") != "")                 {
                    sclick[i] = e.OuterHtml;


Во-первых, не ONCKLICK, а onclick.
Во-вторых, это не ссылки smile . Это JavaScript, так что из него всё равно фиг что-то вытянешь.

Добавлено @ 15:27 
Цитата(ivashkanet @  29.12.2006,  13:26 Найти цитируемый пост)
Нужно либо просто null (а потом его обрабатывать), либо new List<string> 


Лучше пустой список, т.к. меньше вероятности потом "напороться" на null.

Автор: DarkDragon 31.12.2006, 00:50
а вот о таком слышали:

<img id="img_01">

<script language="javascript">
   img_01.href = "image01.jpg";
</script>

или о вот таком:

<div style="BACKGROUND-IMAGE=url(backimg.gif)">Здрасти Новый Год</div>

Думаю Регулярные выражения самый раз чтобы забазарить и такие способы линковки smile

Автор: Exception 31.12.2006, 15:47
Это слишком экзотично. Может тогда просто ловить "по расширению"? Как встретится (.jpg|.gif|.swf|.png|.htm|.html|...), так и выдираем путь smile ?

Автор: setnull 26.8.2008, 17:49
А существует способ на основе имеющегося HTML кода создать экземпляр HTMLDocument, не прибегая к помощи WebBrowser (как то: сохранить код в файл; открыть его броузером и т.д.)?

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