Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   "Выдрать" конкретную часть сайта на C# (https://forum.antichat.xyz/showthread.php?t=205169)

F&D 19.05.2010 15:52

"Выдрать" конкретную часть сайта на C#
 
Доброго времени суток!
Есть у меня такая задача, нужно "выдрать"/достать/извлечь конкретную область сайта(в моем случае это сайт deviantart). Что я имею ввиду по словами "выдрать"/достать/извлечь конкретную область сайт?
Т.е. необходимо чтобы любая часть/блок сайта, допустим блок с фотографиями, отображался у меня в WebBrowser. И чтобы там были именно только фотографии конкретного блока и ничего больше. Либо допустим, только блок с комментариями.

Пример:
1.
http://www.postimage.org/image.php?v=PqqZfqJ

2.
http://www.postimage.org/image.php?v=TsMkyRA

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


Использовать пытаюсь Data Extracting SDK.
И вот так:
Код:

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. Посоветуйте пожалуйста как это сделать? Потому что уже не знаю как и что. Запустался.

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

Заранее благодарю.

W!z@rD 19.05.2010 17:10

Стандартные пути:
IndexOf, Remove, ...
+ Regex

F&D 19.05.2010 18:04

Цитата:

Сообщение от W!z@rD
Стандартные пути:
IndexOf, Remove, ...
+ Regex

Спасибо.
А можно маленький пример?

assume[C3] 19.05.2010 18:21

string URL = "http://google.ru";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Timeout = 999999999;
string data = new StreamReader(request.GetResponse().GetResponseStre am()).ReadToEnd();

assume[C3] 19.05.2010 18:29

Чтоб не создавать ещё 1 тему, не кто не подскажет как со string переменной можно убрать все дубли (повторные слова)?

P.S ТС сорри за оффтоп.

F&D 20.05.2010 19:37

Цитата:

Сообщение от assume[C3]
string URL = "http://google.ru";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Timeout = 999999999;
string data = new StreamReader(request.GetResponse().GetResponseStre am()).ReadToEnd();

Что-то не совсем понятно.
Не уже ли я настолько далекий... :(

BrainDeaD 20.05.2010 20:01

Цитата:

Сообщение от F&D
Что-то не совсем понятно.
Не уже ли я настолько далекий... :(

в этом примере он паказал, как получить исходник страницы. его ты и можешь пропарсить regex.



Цитата:

Сообщение от assume[C3]
Чтоб не создавать ещё 1 тему, не кто не подскажет как со string переменной можно убрать все дубли (повторные слова)?.

Код:

string newString = string.Join(" ", oldString.Split(new char[1] { ' ' }).Distinct().Select(s => s.ToString()).ToArray())+"\nthat's why i love c# :)";

F&D 20.05.2010 20:56

Цитата:

Сообщение от BrainDeaD
в этом примере он паказал, как получить исходник страницы. его ты и можешь пропарсить regex.

Я правильно понял - это оно?!

BrainDeaD 20.05.2010 21:00

да, правильно. с его помощью ты можешь искат
регулярные выражения и выбирать тебе нужные.

F&D 20.05.2010 21:15

Цитата:

Сообщение от BrainDeaD
да, правильно. с его помощью ты можешь искат
регулярные выражения и выбирать тебе нужные.

Ну что ж.. попробую.
Спасибо.

WAYS 21.05.2010 11:31

Код:

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


F&D 22.05.2010 19:08

Спасибо =)
Попробую и это. ;)

F&D 31.05.2010 13:25

Глупый вопрос - а куда вводить адрес сайта?!

BrainDeaD 31.05.2010 13:47

в html_parser тебе не нужен адрес. ты должен предать функции setText(string text) зачитанный веб-реквестом текст исходника страницы. а как получить текст определённого url стоит на предыдущей странице.

F&D 31.05.2010 14:43

Цитата:

Сообщение от BrainDeaD
в html_parser тебе не нужен адрес. ты должен предать функции setText(string text) зачитанный веб-реквестом текст исходника страницы. а как получить текст определённого url стоит на предыдущей странице.

Как же всё это кажется нереально СЛОЖНЫМ... и это всего на 3-й месяц изучения C# :(

BrainDeaD 31.05.2010 18:37

ну не всё так страшно. вот смотри:
Код:

      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 ссылка на твою картинку.

Kaas 31.05.2010 22:13

Юзайте HtmlAgilityPack и XPath, и будет вам счастье. Регексы - тока на крайняк я использую. WebBrowser вообще лучше выбросить, нормальные проекты на нем не поднять (хотя бы потому что потоки он не держит)

F&D 01.06.2010 11:06

Цитата:

Сообщение от Kaas
Юзайте HtmlAgilityPack и XPath, и будет вам счастье. Регексы - тока на крайняк я использую. WebBrowser вообще лучше выбросить, нормальные проекты на нем не поднять (хотя бы потому что потоки он не держит)

Вот мне тоже советовали, но как ими пользоватся разобратся не могу. Если Вас не затруднит, помогите пожалуйста.

Kaas 01.06.2010 16:39

Ну что то вроде:

Код:

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.


Время: 07:05