"Выдрать" конкретную часть сайта на C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by F&D, 19 May 2010.

  1. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Доброго времени суток!
    Есть у меня такая задача, нужно "выдрать"/достать/извлечь конкретную область сайта(в моем случае это сайт deviantart). Что я имею ввиду по словами "выдрать"/достать/извлечь конкретную область сайт?
    Т.е. необходимо чтобы любая часть/блок сайта, допустим блок с фотографиями, отображался у меня в WebBrowser. И чтобы там были именно только фотографии конкретного блока и ничего больше. Либо допустим, только блок с комментариями.

    Пример:
    1.
    [​IMG]

    2.
    [​IMG]

    Вот 1. это сайт, главная страница, а 2., то что нужно достать...


    Использовать пытаюсь Data Extracting SDK.
    И вот так:
    Code:
    HtmlProcessor proc = new HtmlProcessor(new UriHtmlProcessor("http://www.deviantart.com/").DocumentSource);    
    var divs = proc.Body.GetDomElements("div").Where(div => div.Class == "tt.a");     
    foreach(var div in divs) 
    {        
        var images = div.GetDomElements("img"); 
    } 

    Возможно кто-то работал уже с данной SDK. Посоветуйте пожалуйста как это сделать? Потому что уже не знаю как и что. Запустался.

    Либо может каким-то стандартными путями...

    Заранее благодарю.
     
    #1 F&D, 19 May 2010
    Last edited: 20 May 2010
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Стандартные пути:
    IndexOf, Remove, ...
    + Regex
     
    1 person likes this.
  3. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Спасибо.
    А можно маленький пример?
     
  4. assume[C3]

    assume[C3] Banned

    Joined:
    20 Apr 2010
    Messages:
    31
    Likes Received:
    7
    Reputations:
    0
    string URL = "http://google.ru";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
    request.Timeout = 999999999;
    string data = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();
     
  5. assume[C3]

    assume[C3] Banned

    Joined:
    20 Apr 2010
    Messages:
    31
    Likes Received:
    7
    Reputations:
    0
    Чтоб не создавать ещё 1 тему, не кто не подскажет как со string переменной можно убрать все дубли (повторные слова)?

    P.S ТС сорри за оффтоп.
     
  6. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Что-то не совсем понятно.
    Не уже ли я настолько далекий... :(
     
  7. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    в этом примере он паказал, как получить исходник страницы. его ты и можешь пропарсить regex.



    Code:
    string newString = string.Join(" ", oldString.Split(new char[1] { ' ' }).Distinct().Select(s => s.ToString()).ToArray())+"\nthat's why i love c# :)";
     
    #7 BrainDeaD, 20 May 2010
    Last edited: 20 May 2010
  8. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Я правильно понял - это оно?!
     
  9. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    да, правильно. с его помощью ты можешь искат
    регулярные выражения и выбирать тебе нужные.
     
    1 person likes this.
  10. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Ну что ж.. попробую.
    Спасибо.
     
  11. WAYS

    WAYS New Member

    Joined:
    12 Nov 2008
    Messages:
    36
    Likes Received:
    0
    Reputations:
    0
    Code:
        class html_parser
        {
            private string text = null;
            public void setText(string text)
            {
                this.text = text;
            }
            public string getImg()
            {
                var image = "no_image.png";
                var s_text = "<img src='";
                var e_text = "' alt='";
                if (text.IndexOf(s_text) != -1)
                {
                    int c = (text.IndexOf(s_text) + s_text.Length);
                    image = text.Substring(c, (text.IndexOf(e_text, c) - c));
                }
                return image;
            }
        }
     
  12. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Спасибо =)
    Попробую и это. ;)
     
  13. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Глупый вопрос - а куда вводить адрес сайта?!
     
  14. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    в html_parser тебе не нужен адрес. ты должен предать функции setText(string text) зачитанный веб-реквестом текст исходника страницы. а как получить текст определённого url стоит на предыдущей странице.
     
  15. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Как же всё это кажется нереально СЛОЖНЫМ... и это всего на 3-й месяц изучения C# :(
     
  16. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    ну не всё так страшно. вот смотри:
    Code:
          string URL = "http://www.postimage.org/image.php?v=TsMkyRA";
    
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
    
                request.Timeout = 1000;
    
                string data = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();
    
    
                var image = "no_image.png";
                var s_text = "<img src='";
                var e_text = "' alt='";
                if (data.IndexOf(s_text) != -1)
                {
                    int c = (data.IndexOf(s_text) + s_text.Length);
                    image = data.Substring(c, (data.IndexOf(e_text, c) - c));
                }
    в переменной image ссылка на твою картинку.
     
  17. Kaas

    Kaas Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    31
    Likes Received:
    5
    Reputations:
    0
    Юзайте HtmlAgilityPack и XPath, и будет вам счастье. Регексы - тока на крайняк я использую. WebBrowser вообще лучше выбросить, нормальные проекты на нем не поднять (хотя бы потому что потоки он не держит)
     
  18. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Вот мне тоже советовали, но как ими пользоватся разобратся не могу. Если Вас не затруднит, помогите пожалуйста.
     
  19. Kaas

    Kaas Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    31
    Likes Received:
    5
    Reputations:
    0
    Ну что то вроде:

    Code:
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    //html - строка с разметкой, полученная, например, HttpWebRequest'ом
    
    HtmlNode inputNode= doc.DocumentNode.SelectSingleNode("//input[@name='username']");
    
    Здесь мы сделали объект HtmlDocument, с которым можно обращаться с помощью XPath, и далее вытащили икспафом ноду (примерно такую: <input name="username"...</input>).

    Подробнее лучше посмотреть у W3C, там большая дока по XPath.