Аватар для Scrypto
132 / 111 / 48
Регистрация: 08.02.2013
Сообщений: 621

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

31.08.2015, 15:02. Показов 2983. Ответов 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 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru