Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621

HtmlAgilityPack Отпарсить страничку

31.08.2015, 15:02. Показов 2955. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
http://market.karelia.pro/section/8/ - вот то, что нужно отпарсить, а именно объявления, время название и ссылку на объявление.

Я пробовал так, не получается. Еще и @data-id='282602 это у каждого объявления разное

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  public void ParseAdverts(string AvitoAdverts)
        {
            HtmlAgilityPack.HtmlDocument PostsParser = new HtmlAgilityPack.HtmlDocument();
            PostsParser.LoadHtml(AvitoAdverts);
            HtmlAgilityPack.HtmlNodeCollection AllNode =
                PostsParser.DocumentNode.SelectNodes("//ul[@class='new']");
            if (AllNode != null)
            {
                foreach (HtmlNode node in AllNode) // Поиск параметров и создание списка объявлений
                {
                    string title = node.SelectSingleNode("./li[[B]@data-id='282602[/B]']/div[@class='date'").InnerText);     
                }
            }
        }
Во вложениях структура страницы.
Миниатюры
HtmlAgilityPack Отпарсить страничку  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2015, 15:02
Ответы с готовыми решениями:

Отпарсить html страницу (HtmlAgilityPack, xPath)
Всем привет. Может кто-нибудь подскажет, как с помощью HtmlAgilityPack и xPath отпарсить эту страницу? ...

Как безболезненно отпарсить html страничку?
Надо передрать допустим погоду или валюту с другого ресурса. Как бы это сделать без особого гемора? (Допустим html ку мы получили)

Отпарсить страничку, вытянуть кусок кода между комментариями
Всем привет. Такой вопрос, есть html страница, необходимый мне кусок кода заключен в 2х комментариях ( <!--ON--> и <!--OFF-->)....

7
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
31.08.2015, 16:08
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public void ParseAdverts(string AvitoAdverts)
        {
            HtmlAgilityPack.HtmlDocument PostsParser = new HtmlAgilityPack.HtmlDocument();
            PostsParser.LoadHtml(AvitoAdverts);
            var AllNode = PostsParser.DocumentNode.SelectNodes("//*[@id='alist']//li");//получаем все объявления на странице
            if (AllNode != null)
            {
                foreach (var node in AllNode) // берем одно из объявлений
                {
                    string title = node.SelectSingleNode("//*[@class='date']").InnerText;//получаем дату объявления
                }
            }
        }
1
 Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621
01.09.2015, 20:44  [ТС]
quakeer,
пытаюсь сделать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public void ParseAdverts(string AvitoAdverts)
        {
                HtmlAgilityPack.HtmlDocument PostsParser = new HtmlAgilityPack.HtmlDocument();
            PostsParser.LoadHtml(AvitoAdverts);
            var AllNode = PostsParser.DocumentNode.SelectNodes("//ul[@id='alist']/li");//получаем все объявления на странице
            if (AllNode != null)
            {
                foreach (var node in AllNode) // берем одно из объявлений
                {
                    DateTime date = DateNormaliser(node.SelectSingleNode("//div[@class='date']").InnerText);//получаем дату объявления
                    string link = node.SelectSingleNode("//div[@class='name']/a").Attributes["href"].Value;
                    string name = node.SelectSingleNode("//div[@class='name']/a/span[@class='title']").InnerText;
                    string price = node.SelectSingleNode("//div[@class='price']/strong/span").InnerText;
                    AdvertList.Add(new Adverts(name, price, link, date));
                }
                System.Windows.Forms.MessageBox.Show(AdvertList.Count.ToString());
            }
        }
Он верно находит 15 объявлений, что есть на странице, но каждый раз выводит данные самого первого, не подскажете почему?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Куплю процессор сокет 1150
01.09.2015 18:02:00
300
[url]http://market.karelia.pro/advert/kuplyu_processor_soket_1150_282745/[/url]
Добавлено через 2 часа 43 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 if (AllNode != null)
            {
                int x = 1;
                foreach (var node in AllNode) // берем одно из объявлений
                {
                    string price = "Не указана";
                    DateTime date = DateNormaliser(node.SelectSingleNode("//*[@id=\"alist\"]/li[" + x + "]/div[1]").InnerText);//получаем дату объявления //*[@id="alist"]/li[2]/div[1]
                    string link = node.SelectSingleNode("//*[@id=\"alist\"]/li[" + x + "]/div[2]/a[2]").Attributes["href"].Value;
                    string name = node.SelectSingleNode("//*[@id=\"alist\"]/li[" + x + "]/div[2]/a[2]/span").InnerText;
                    if (node.SelectSingleNode("//*[@id=\"alist\"]/li[" + x + "]/div[3]/strong/span")!=null) // Исключение, если отсутствует цена.
                     price = node.SelectSingleNode("//*[@id=\"alist\"]/li[" + x + "]/div[3]/strong/span").InnerText;
                    AdvertList.Add(new Adverts(name, price, link, date));
                    x++;
                }
 
                System.Windows.Forms.MessageBox.Show(AdvertList.Count.ToString());
            }
Решил это так, но до сих пор не понятно, почему не прокручивается автоматом список li
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
01.09.2015, 21:57
На скорую руку
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Xml.Linq;
using HtmlAgilityPack;
 
internal class Program
{
    private static void Main(string[] args)
    {
        MainAsync().Wait();
    }
 
    public static async Task MainAsync()
    {
        string html;
 
        using (var client = new HttpClient())
        {
            html = await client.GetStringAsync("http://market.karelia.pro/section/8/");
        }
 
        var doc = new HtmlDocument();
        doc.LoadHtml(html);
 
        var pageCount =
            int.Parse(HttpUtility.ParseQueryString(
                new Uri(doc.DocumentNode.SelectSingleNode(".//*[@id='paginator']/li[9]/a").GetAttributeValue("href", ""))
                    .Query
                ).Get("page")
                );
 
        var task = Enumerable.Range(1, pageCount)
            .Select((n, i) => $"http://market.karelia.pro/section/8/?page={i + 1}")
            .Select(
                async n =>
                {
                    using (var clien = new HttpClient())
                    {
                        return await clien.GetStringAsync(n);
                    }
                }).ToList();
 
        var results = await Task.WhenAll(task);
 
 
        var q = results.SelectMany(n =>
        {
            var innerdoc = new HtmlDocument();
            innerdoc.LoadHtml(n);
 
            var foo =
                innerdoc.DocumentNode.SelectNodes(".//*[@id='alist']/li")
                    .Select(x => new
                    {
                        link = x.SelectSingleNode("//div[@class='name']/a").Attributes["href"].Value,
                        title = x.SelectSingleNode("//div[@class='name']/a/span[@class='title']").InnerText,
                        price = x.SelectSingleNode("//div[@class='price']/strong/span").InnerText
                    });
 
            return foo;
        }).ToList();
 
        new XDocument(new XDeclaration("1.0", null, null),
            new XElement("root",
                q.Select(
                    n =>
                        new XElement("item", new XElement(nameof(n.link), n.link),
                            new XElement(nameof(n.price), n.price), new XElement(nameof(n.title), n.title))))).Save(
                                "result.xml");
    }
}
Вложения
Тип файла: rar KareliaParser.rar (1.75 Мб, 14 просмотров)
1
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
01.09.2015, 22:30
жесть у меня тоже одинаковые случ заметил
0
116 / 115 / 64
Регистрация: 03.06.2013
Сообщений: 582
01.09.2015, 22:37
А узлы содержат разную информацию, если да, то скорее всего проблема заключается в
C#
1
AdvertList.Add(new Adverts(name, price, link, date));
Создавайте каждый раз экземпляр, а потом присвойте. или типа
C#
1
2
3
4
5
new Adverts()
{
this.name = name;
//и так далее
}
0
 Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621
01.09.2015, 22:58  [ТС]
MaxSlim, так и сделано.
0
49 / 40 / 37
Регистрация: 25.07.2013
Сообщений: 178
02.09.2015, 15:58
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var AllNode = PostsParser.DocumentNode.SelectNodes("//*[@id='alist']/li");
            if (AllNode != null)
            {
                string date;
                string link ;
                string name;
                string price;
                foreach (var node in AllNode) 
                {
                    date = ParseData(node.OuterHtml, "//*[@class='date']")[0].InnerText;
                    link = ParseData(node.OuterHtml, "//div[@class='name']//*")[1].Attributes["href"].Value;
                    name = ParseData(node.OuterHtml, "//*[@class='name']/a/span")[0].InnerText;
 
                    if (ParseData(node.OuterHtml, "//div[@class='price']/strong/small") != null)
                    {
                        price = ParseData(node.OuterHtml, "//div[@class='price']/strong/small")[0].InnerText;
                    }
                    else
                    {
                        price = ParseData(node.OuterHtml, "//div[@class='price']/strong/span")[0].InnerText;
                    }
                    AdvertList.Add(new Advert(name, price, link, date)); 
                }
            }
 
public static HtmlNodeCollection ParseData(string html, string xPath)
        {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
 
            var nodeCollection = doc.DocumentNode.SelectNodes(xPath);
 
            return nodeCollection;
        }
Добавлено через 35 секунд
Теперь вроде работает
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2015, 15:58
Помогаю со студенческими работами здесь

Отпарсить файл
Приветствую. Помогите пожалуйста в данном вопросе. Необходимо отпарсить курсы валют интеркассы, но как их обработать не понимаю. Вот...

Нужно отпарсить DHTML
Подскажите плиз, каким образом в ХТМЛ страницу с тегом <input type='file' name='myfile' size='50'> вставить (отпарсить) значение (имя...

Как отпарсить текст
Всем привет. Вообщем, есть одна проблемка, ребят, подскажите как отпарсить текст формата (Вместо звездочек, в номере телефона тоже...

Требуется отпарсить файл
Нужна помощь. Требуется отпарсить следующий файл // Коммантарий // Комментарий Admins { ...

Отпарсить строку регулярками
Добрый день! Есть строка : Надо отпарсить строки с помощью регулярок. Вот мои шаблоны для парсинга: Regex rName = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru