Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350

Найти число в HTML по по атрибуту. (Парсинг сайта)

22.12.2016, 22:12. Показов 1319. Ответов 12

Студворк — интернет-сервис помощи студентам
Мне нужно на страницах сайта найти числа в ссылке (тег <a>)
Сама ссылка имеет такую структуру:
HTML5
1
<a href="http://TheSite.com/...." title="feedback score: 100">100</a>
мне нужно вытащить это число.
Я ни разу не парсил, поэтому не в курсе как это делается. В инете нашел кое-что, сам принцип.
Но мне нужно составить регулярное выражение на эту строку( как я понял).
С регулярными выражениями то же дело не имел.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2016, 22:12
Ответы с готовыми решениями:

Найти элемент в HTML по атрибуту class
&lt;div class=&quot;bomb-loader&quot; style=&quot;&quot;&gt;&lt;/div&gt; Нужно найти класс &quot;bomb-loader&quot; и из тега style взять данные. С помощью HtmlDocument думаю...

Парсинг html блока с сайта
Прошу помощи у специалистов. Нужно спарсить блок праздников (справа) сайта http://webplus.info/index.php?page=334 , сделал так, но...

Парсинг html кода с сайта tchromium
Уже 4 день подряд пытаюсь написать программу которая копировала б html код с сайта в мемо с помощью tchromium .Если не сложно...

12
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
23.12.2016, 00:56
Worldmen, HTML парсится HtmlAgilityPackом или аналогами. Регулярками его парсить-моветон.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
23.12.2016, 03:53
Worldmen, поддерживаю EvilFromHell - html лучше парсить специальными библиотеками. С другой стороны никто не запрещает комбинировать разные подходы. Вот пример с использованием HtmlAgilityPack:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Качаем
string html;
using (var http = new HttpClient())
{
    html = http.GetStringAsync("http://example.com").Result;
}
 
// Парсим
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html);
int[] numbers = htmlDoc.DocumentNode
    .SelectNodes("//a[@href]") // Ищем все ссылки в документе
    .Where(n => Regex.IsMatch(n.InnerText, @"^\d+$")) // У которых внутри только цифры
    .Select(n => int.Parse(n.InnerText))
    .ToArray();
numbers.Dump();
2
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
23.12.2016, 23:12  [ТС]
Как всегда забыл. Еще нужно в том же коде имя вытянуть и ссылку на пользователя. Оно храниться в таком виде:
HTML5
1
2
3
<a href="http://www.Site.com/ЭтуСсылкуНужно...." id="mbgLink"> 
 <span class="mbg-nw">ThisName</span>
</a>
И тогда нужно будет делать через класс (или двумерный массив). Сделал класс (т.к. таких страниц много будет):
C#
1
2
3
4
5
6
 class DataNumber
    {
        public string NameUser { get; set; }
        public int FeedBack { get; set; }
        public string LinkUser { get; set; }
    }
Как это через htmlDoc.DocumentNode пропустить?

Добавлено через 10 минут
Все данные находятся в одном теге div:
HTML5
1
2
3
4
5
6
7
8
9
10
<div class="mbg vi-VR-margBtm3">
    <a href="http://www.Site.com/sdfsdfsdf" id="mbgLink"> <!--> эту ссылку надо<-->
        <span class="mbg-nw">UserName</span>    <!--> Юзера <-->
    </a>
    <span class="mbg-l"> 
        (
        <a href="http://site.com/sdfsdfs" title="feedback score: 154">154</a> <!--> это число<-->
        )
    </span>
</div>
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
23.12.2016, 23:18
Worldmen, как-то так
C#
1
2
3
4
5
HtmlNode nodeUserLink = htmlDoc.GetElementbyId("mbgLink");
var data = new DataNumber {
    NameUser = nodeUserLink.InnerText,
    LinkUser = nodeUserLink.GetAttributeValue("href", "") 
};
Добавлено через 4 минуты
Дополнение
C#
1
2
3
4
5
6
HtmlNode nodeUserLink = htmlDoc.GetElementbyId("mbgLink");
var data = new DataNumber {
    NameUser = nodeUserLink.InnerText,
    LinkUser = nodeUserLink.GetAttributeValue("href", ""),
    FeedBack = int.Parse(nodeUserLink.NextSibling.SelectSingleNode("a").InnerText)
};
1
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
24.12.2016, 00:34  [ТС]
почему-то на этой строке ошибка "ссылка на объект не указывает на экземпляр объекта"
Цитата Сообщение от OwenGlendower Посмотреть сообщение
FeedBack = int.Parse(nodeUserLink.NextSibling.Selec tSingleNode("a").InnerText)
};
трассировал - данные есть.
что-то могло быть не инициализировано?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
24.12.2016, 00:51
Worldmen, возможно NextSibling возвращает не span, а текстовый узел между <a> и <span>. Попробуй вот такой вариант
C#
1
2
3
4
5
6
7
8
HtmlNode nodeUserLink = htmlDoc.GetElementbyId("mbgLink");
var data = new DataNumber {
    NameUser = nodeUserLink.InnerText,
    LinkUser = nodeUserLink.GetAttributeValue("href", "") 
};
HtmlNode node = nodeUserLink.NextSibling;
while (!"span".Equals(node.Name, StringComparison.OrdinalIgnoreCase)) node = node.NextSibling;
data.FeedBack = int.Parse(node.InnerText);
0
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
24.12.2016, 00:57  [ТС]
Похоже из-за круглых скобок:
HTML5
1
2
3
4
5
<span class="mbg-l"> 
        (
        <a href="http://site.com/sdfsdfs" title="feedback score: 154">154</a> <!--> это число<-->
        )
    </span>
в node.InnerText = "(154)"
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
24.12.2016, 01:00
Worldmen, скобки можно обрезать. Или добавить вызов SelectSingleNode("a") как в примере выше.
1
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
24.12.2016, 18:29  [ТС]
Хочу убедиться точно, что выводит
поэтому изменил тип :
C#
1
public string FeedBack { get; set; }
и написал:
C#
1
FeedBack = nodeUserLink.NextSibling.SelectSingleNode("a").InnerText
все равно выводит ошибку: "Ссылка на объект не указывает на экземпляр объекта"
если просто написать:
C#
1
FeedBack = "12"
- присваивает и выводит данные.

Добавлено через 35 минут
Еще дума, что в это поле не попадает
FeedBack = nodeUserLink.NextSibling.SelectSingleNod e("a").InnerText
потому, что мы выбираем по
C#
1
HtmlNode nodeUserLink = htmlDoc.GetElementbyId("mbgLink");
т.е. только область с Id = mbgLink а это только
HTML5
1
2
3
<a href="http://www.Site.com/sdfsdfsdf" id="mbgLink"> <!-- эту ссылку надо-->
        <span class="mbg-nw">UserName</span>    <!-- Юзера -->
    </a>
а этот код туда не попадает:
HTML5
1
2
3
4
5
    <span class="mbg-l"> 
        (
        <a href="http://site.com/sdfsdfs" title="feedback score: 154">154</a> <!-- это число -->
        )
    </span>
весь код:
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
    <div class="mbg vi-VR-margBtm3">
        <a href="http://www.Site.com/sdfsdfsdf" id="mbgLink"> <!-- эту ссылку надо -->
            <span class="mbg-nw">UserName</span>    <!-- Юзера -->
        </a>
        <span class="mbg-l"> 
            (
            <a href="http://site.com/sdfsdfs" title="feedback score: 154">154</a> <!-- это число -->
            )
        </span>     
    </div>


Добавлено через 52 минуты
Пробую сделать по другому, через:
C#
1
HtmlNodeCollection c = nodeUserLink.SelectNodes("//div[@class='mbg vi-VR-margBtm3']");
Добавлено через 39 минут
Попробовал сделать так:
C#
1
2
3
4
5
6
7
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.OptionFixNestedTags = true;
doc.Load(new StringReader(html));
 
listBox1.Items.Add(doc.DocumentNode.SelectSingleNode("//*[@id='mbgLink']").GetAttributeValue("href", "")); //ссылка
listBox1.Items.Add(doc.DocumentNode.SelectSingleNode("//*[@id='mbgLink']/span").InnerText); //user
listBox1.Items.Add(doc.DocumentNode.SelectSingleNode("//*[@id='RightSummaryPanel']/div[3]/div/div/div[2]/div[1]/div[1]/span/a").InnerText ); //рейтинг
все равно ругается на последнюю строку. Что в ней такого?

Добавлено через 14 минут
получилось, нужно так (InnerHtml):
C#
1
listBox1.Items.Add(doc.DocumentNode.SelectSingleNode("//*[@id='RightSummaryPanel']/div[3]/div/div/div[2]/div[1]/div[1]/span/a").InnerHtml );
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2016, 22:20
Worldmen, не понимаю, зачем тыкать пальцем в небо, когда в отладчике видны значения всех переменных. Достаточно разбить код так, чтобы операций на строку было поменьше, и поставить точки останова. Дальше будет сразу видно, что именно неправильно и почему.
0
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
24.12.2016, 22:46  [ТС]
естественно делал точки останова, но при ошибке "Ссылка на объект не указывает на экземпляр объекта" в той строке ничего не показывал. Или я не правильно смотрел.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.12.2016, 23:03
Worldmen, ну раз ссылка на объект не указывается на экземпляр объекта-значит что-то, к чему вы обращаетесь, равно null. Что именно и почему-отлично видно в отладчике.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2016, 23:03
Помогаю со студенческими работами здесь

Получение и парсинг HTML с другого сайта
Та еще задачка =/ Сайт №1 - мой сайт Сайт №2 - не мой сайт на сайте №2 есть HTML элементы с данными которые мне нужны для...

Парсинг html сайта у которого frontend на javascript
Здравствуйте. Пытаюсь запарсить вот этот сайт: http://allsocial.ru Для начала пытаюсь получить html код, но он приходит не...

Парсинг делают одновременно со скачиванием html, или в конце со скачанным html
Представим что html байт за байтом записывается в файл, Как правильнее сделать парсинг , после того как будет скачан полностью весь html,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru