Форум программистов, компьютерный форум, киберфорум
XML/XSL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
1

Составить XPath путь

13.04.2021, 20:55. Показов 7077. Ответов 46

Author24 — интернет-сервис помощи студентам
Всем привет подскажите как составить xpatch мне нужны значения 66.00 и 1.03 они находятся в классе table__col _type_btn _type_normal по классу искать умею, но мне выдает все значения, а нужен xpatch как к к первому значению, так и к третьему и что бы лишних не было данных.
Кликните здесь для просмотра всего текста
HTML5
1
<tbody class="table__body"><tr class="table__row _type_segment _type_nocaptions" style="background-color: rgb(97, 154, 56);"><th colspan="2" class="table__col _type_head _size_long"><div class="table__col-inner table__event-title"><span class="table__sport-icon icon _type_sport" style="background-image: url(&quot;//origin.bkfon-resources.com/ContentCommon/Logotypes/SportKinds/new-design/white_new/1-football.svg&quot;);"></span><span class="table__flag-icon icon icon_643688" style="background-image: url(&quot;//origin.bkfon-resources.com/ContentCommon/NewFlags/England.svg&quot;);"></span><div class="table__title-text" title="Футбол. Англия. Чемпион-Лига">Футбол. Англия. Чемпион-Лига</div></div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">X</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">2</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1X</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">12</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">X2</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Фора</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Фора</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">2</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Тотал</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">Б</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">М</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">Доп</div></th></tr><tr class="table__row"><td class="table__col _pos_first _indent_1"><div class="table__btn icon _type_normal _icon_arrow-right-gray _state_collapsed"></div><a class="table__star"><i class="table__star-icon icon _type_normal _icon_star"></i></a></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _indent_1"><span class="table__event-number">44410</span><a class="table__match-title-text" href="/live/football/12018/27368915"><div class="table__match-title-text">Хаддерсфилд Т — Борнмут</div></a></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__channels"><div class="table__channel"><span class="icon _type_normal _size_17 _icon_channel _icon_channel-6 _sport_1"></span></div></div><a class="table__betradar-link-icon" title="Статистика"><span class="icon _type_normal _size_17 _icon_betradar_blue"></span></a><div class="table__score"><span class="table__score-normal">0:2</span><span class="table__score-more" title="(0-2)">(0-2)</span></div></div><div><div class="table__time"><span class="table__time-icon icon _type_normal _icon_time-gray"></span><span class="table__time-text _type_suspended" seconds="2700" direction="0" updatems="">45:00</span></div></div></div></td><td class="table__col _type_btn _type_normal">66.00</td><td class="table__col _type_btn _type_normal">18.00</td><td class="table__col _type_btn _type_normal">1.03</td><td class="table__col _type_btn _type_normal">12.00</td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora">+2.5</td><td class="table__col _type_btn _type_normal">1.60</td><td class="table__col _type_fora">-2.5</td><td class="table__col _type_btn _type_normal">2.30</td><td class="table__col _type_fora">3.5</td><td class="table__col _type_btn _type_normal">2.10</td><
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2021, 20:55
Ответы с готовыми решениями:

Существует ли такой редактор, который показывает полный XPath путь к тегу?
То есть выделил например таблицу, и увидел до неё XPath путь. Такое есть? Добавлено через 1...

Как в lxml составить запрос xpath?
import requests import lxml.html import re session = requests.session() openUrl =...

Почему xpath в xpather работает как надо, а html.xpath обрезает последний элемент
Тут все ок. http://xpather.com/QdzC7iC7 Добавляю выражение для скрипта, но там обрезается...

Как правильно составить XPATH-запрос для HtmlAgillityPack?
&lt;div id=&quot;adv_140751&quot; class=&quot;adv_short radius_10&quot;&gt; &lt;ul class=&quot;edit-menu&quot;&gt; &lt;li...

46
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
16.04.2021, 20:32  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от diadiavova Посмотреть сообщение
Для этого новые документы не нужны, поскольку любой узел, полученный с помощью выражений, также имеет методы SelectNodes и SelectSingleNode, и в этих методах узлы для которых они вызваны будут считаться узлами контекста, так что в этой всей свистопляске нет никакого смысла.
Например я делаю без лишних документов
C#
1
2
3
4
5
6
7
8
9
10
foreach (var tbody in pars_doc_liga)
            {
                result.Append("Лига: ").AppendLine(tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText);
                var pars_komand = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                foreach (var komand in pars_komand)
                {
                     //В этой строке в komand команды меняются, но на выходе получаю одну с одним названием если команд больше одной. Такое ощущение что  цикл не работает, но в отадчике посмотрел и все данные разные, но почему дублирует так и не понял, но если делаю через документы, то все ок... Хотя Этот код должен показывать азные лиги и команды, но только иги разные вижу..
                    result.Append("Команды: ").AppendLine(komand.SelectSingleNode("//div[@class='table__match-title-text']").InnerText);
                }
            }
Добавлено через 1 минуту
Цитата Сообщение от diadiavova Посмотреть сообщение
Так просто раздели код на отдельные методы и все станет предельно ясно. Например вынеси генерацию текста для одного матча в отдельный метод, который будет получать нужную строку и возвращать текст, вот как-то так
C#
С LINQ не особо дружу. Мне так вообще не удобно =) Привык только разные функции разделять если между ними нет связи) Кстати коэфициенты в новом коде попрежнему не меняются)

Добавлено через 46 секунд
Цитата Сообщение от diadiavova Посмотреть сообщение
Возможно какое-то расширение браузера мешает, типа блокировщика рекламы. Я просто давно там регистрировался, так что не помню уже как это делается ))
Скорее всего, я не через гугл, ни через твиттер или фейсбук или напрямую зарегистрироваться не смог

Добавлено через 16 минут
C#
1
2
var pars_komand = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                foreach (var komand in pars_komand)
Если здесь две команды цикл должен сработать два раза и так как указан только блок верстки с 1 командой, то берем ее имя, в блоке верстки komand не может быть две команды. Но как то работает все не так..

Добавлено через 15 минут
Вот пример кода через документ
C#
1
2
3
4
5
6
7
8
9
10
11
foreach (var tbody in pars_doc_liga)
            {
                result.Append("Лига: ").AppendLine(tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText);
                doc_komand.LoadHtml(tbody.InnerHtml);
                //var pars_komand = doc_komand.DocumentNode.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                var pars_doc_komand = doc_komand.DocumentNode.SelectNodes("//div[@class='table__match-title-text']");
                foreach (var komand in pars_doc_komand)
                {
                    result.Append("Команды: ").AppendLine(komand.InnerText);
                }
            }
Команды перебираются, а без документа нет.. Я уже ничего не понимаю =) Можно пример на основе моего кода? Без Linq и выноса в отдельные методы, код итак мал =) Суть в том что я получаю родителя таблицы и оттуда беру лигу, потом получаю родителя команд и перебираю их циклом 1цикл = 1 команда и коэффициенты, но вместо этого, даже родителя команды без документа не выходит получить.
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
16.04.2021, 21:31 22
Цитата Сообщение от xellan24rus Посмотреть сообщение
В этой строке в komand команды меняются, но на выходе получаю одну с одним названием если команд больше одной
Тут дело в выражении. Когда выражение начинается с двойного слэша, узлом контекста счтиается документ. Поставь перед двойным слэшем точку и отсчет будет вестись от текущего узла.
Цитата Сообщение от xellan24rus Посмотреть сообщение
Можно пример на основе моего кода?
Попробуй то, о чем я написал, если не получится - будем разбираться в чем дело.
Вот что выдает мой код у меня
Лига:

Футбол. Дания.
Кубок. 1/2 финала. Ответные матчи


Команды:
Сендерюске — Митьюлланд
Победа первой команды: 5.50
Победа второй команды: 1.62


Лига:

Баскетбол. NBA2K21. CLA. 4х5
мин.


Команды:
Бруклин Нетс (ZOD) — Милуоки Бакс (gatz)
Победа первой команды: 1.45
Победа второй команды: 2.55


Команды:

Портленд Трэйл Блэйзерс (JoKeR) — Лос-Анджелес Клипперс
(BumbleBee)

Победа первой команды: 2.05
Победа второй команды: 1.68


1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
16.04.2021, 22:32  [ТС] 23
Цитата Сообщение от diadiavova Посмотреть сообщение
Тут дело в выражении. Когда выражение начинается с двойного слэша, узлом контекста счтиается документ. Поставь перед двойным слэшем точку и отсчет будет вестись от текущего узла.
В этом вы правы изменил выражение и сразу увидел разницу, если до этого перебирались и выводилась одна команда, то я точку поставил и они стали перебираться =)

Добавлено через 3 минуты
Цитата Сообщение от diadiavova Посмотреть сообщение
Попробуй то, о чем я написал, если не получится - будем разбираться в чем дело.
Сейчас у меня код выглядит вот так и всё работает на ура) Осталось только сделать, чтобы коэффициенты если не доступны не брались) Спасибо вам за все объяснения прям многое узнал =) Может кому то пригодится код, в интернете подобного не находил =)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var doc = new HtmlAgilityPack.HtmlDocument();
            var doc_komand = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            var pars_doc_liga = doc.DocumentNode.SelectNodes("//tbody[contains(@class, 'table__body')]");
            var result = new StringBuilder();
            foreach (var tbody in pars_doc_liga)
            {
                result.Append("Лига: ").AppendLine(tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText);
                doc_komand.LoadHtml(tbody.OuterHtml);
                var pars_doc_komand = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                var col = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]").Count;
                foreach (var komand in pars_doc_komand)
                {
                    result.Append("Команды: ").AppendLine(komand.SelectSingleNode(".//div[@class='table__match-title-text']").InnerText)
                        .Append("Победа первой команды: ").AppendLine(komand.SelectSingleNode("./td[3]").InnerText)
                        .Append("Победа второй команды: ").AppendLine(komand.SelectSingleNode("./td[5]").InnerText);
                }
            }
 
            textBox1.AppendText(result.ToString());
Добавлено через 1 минуту
Цитата Сообщение от diadiavova Посмотреть сообщение
Вот что выдает мой код у меня
У меня также =) Документ косячный был, с другим все гуд =)
0
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
16.04.2021, 22:38  [ТС] 24
diadiavova, и ещё вопросик как hml привести в читаемый вид) Как на картинке
Составить XPath путь

Я в спойлер вставил как он у меня выглядит, в одну строчку это дико не удобно) На сайте HtmlTigy можно, но после него у меня половина html кода исчезает в никуда..
Кликните здесь для просмотра всего текста
HTML5
1
<tr class="table__row _type_segment" style="background-color: rgb(97, 154, 56);"><th colspan="2" class="table__col _type_head _size_long"><div class="table__col-inner table__event-title"><span class="table__sport-icon icon _type_sport" style="background-image: url(&quot;//origin.bkfon-resources.com/ContentCommon/Logotypes/SportKinds/new-design/white_new/1-football.svg&quot;);"></span><span class="table__flag-icon icon icon_276" style="background-image: url(&quot;//origin.bkfon-resources.com/ContentCommon/NewFlags/Germany.svg&quot;);"></span><div class="table__title-text" title="Футбол. Германия. Бундеслига">Футбол. Германия. Бундеслига</div></div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">X</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">2</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1X</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">12</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">X2</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Фора</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">1</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Фора</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">2</div></th><th class="table__col _type_head _type_param"><div class="table__col-inner">Тотал</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">Б</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">М</div></th><th class="table__col _type_head _type_value"><div class="table__col-inner">Доп</div></th></tr><tr class="table__row"><td class="table__col _pos_first _indent_1"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div><a class="table__star"><i class="table__star-icon icon _type_normal _icon_star"></i></a></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _indent_1"><span class="table__event-number">1988</span><a class="table__match-title-text" href="/live/football/11916/27432679"><div class="table__match-title-text">Лейпциг — Хоффенхайм</div></a></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__channels"><div class="table__channel"><span class="icon _type_normal _size_17 _icon_channel _icon_channel-4 _sport_1"></span></div><div class="table__channel"><span class="icon _type_normal _size_17 _icon_channel _icon_channel-6 _sport_1"></span></div></div><a class="table__betradar-link-icon" title="Статистика"><span class="icon _type_normal _size_17 _icon_betradar_blue"></span></a><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div><div class="table__time"><span class="table__time-icon icon _type_normal _icon_time-green"></span><span class="table__time-text" seconds="1398" direction="1" updatems="1618599218122">23:41</span></div></div></div></td><td class="table__col _type_btn _type_normal">1.45</td><td class="table__col _type_btn _type_normal">4.20</td><td class="table__col _type_btn _type_normal">8.00</td><td class="table__col _type_btn _type_normal">1.08</td><td class="table__col _type_btn _type_normal">1.23</td><td class="table__col _type_btn _type_normal">2.75</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">2.45</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">1.55</td><td class="table__col _type_fora">2.5</td><td class="table__col _type_btn _type_normal">2.15</td><td class="table__col _type_btn _type_normal">1.70</td><td class="table__col _type_all_count"><span class="text">+262</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1989</span><div class="table__match-title-text no_link">1-й тайм </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">2.45</td><td class="table__col _type_btn _type_normal">1.78</td><td class="table__col _type_btn _type_normal">9.00</td><td class="table__col _type_btn _type_normal">1.03</td><td class="table__col _type_btn _type_normal">1.92</td><td class="table__col _type_btn _type_normal">1.48</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">7.70</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">1.06</td><td class="table__col _type_fora">0.5</td><td class="table__col _type_btn _type_normal">1.75</td><td class="table__col _type_btn _type_normal">1.95</td><td class="table__col _type_all_count"><span class="text">+20</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1990</span><div class="table__match-title-text no_link">2-й тайм </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">1.65</td><td class="table__col _type_btn _type_normal">2.95</td><td class="table__col _type_btn _type_normal">7.30</td><td class="table__col _type_btn _type_normal">1.06</td><td class="table__col _type_btn _type_normal">1.35</td><td class="table__col _type_btn _type_normal">2.10</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">3.15</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">1.30</td><td class="table__col _type_fora">1.5</td><td class="table__col _type_btn _type_normal">1.82</td><td class="table__col _type_btn _type_normal">1.88</td><td class="table__col _type_all_count"><span class="text">+24</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1991</span><div class="table__match-title-text no_link">Что раньше </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_all_count"><span class="text">+17</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1992</span><div class="table__match-title-text no_link">угловые </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span><span class="table__score-more" title="углы поля: 0-0-0-0">углы поля: 0-0-0-0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">1.41</td><td class="table__col _type_btn _type_normal">6.50</td><td class="table__col _type_btn _type_normal">4.50</td><td class="table__col _type_btn _type_normal">1.16</td><td class="table__col _type_btn _type_normal">1.08</td><td class="table__col _type_btn _type_normal">2.70</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">1.65</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">2.10</td><td class="table__col _type_fora">7.5</td><td class="table__col _type_btn _type_normal">2.12</td><td class="table__col _type_btn _type_normal">1.64</td><td class="table__col _type_all_count"><span class="text">+29</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_3"><span class="table__event-number">1993</span><div class="table__match-title-text no_link">1-й тайм угловые </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">1.80</td><td class="table__col _type_btn _type_normal">3.50</td><td class="table__col _type_btn _type_normal">4.15</td><td class="table__col _type_btn _type_normal">1.19</td><td class="table__col _type_btn _type_normal">1.26</td><td class="table__col _type_btn _type_normal">1.90</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.35</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">2.95</td><td class="table__col _type_fora">2.5</td><td class="table__col _type_btn _type_normal">2.17</td><td class="table__col _type_btn _type_normal">1.61</td><td class="table__col _type_all_count"><span class="text">+8</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1994</span><div class="table__match-title-text no_link">жёлтые карты </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">4.15</td><td class="table__col _type_btn _type_normal">3.80</td><td class="table__col _type_btn _type_normal">1.75</td><td class="table__col _type_btn _type_normal">1.96</td><td class="table__col _type_btn _type_normal">1.22</td><td class="table__col _type_btn _type_normal">1.19</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">1.38</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">2.80</td><td class="table__col _type_fora">3.5</td><td class="table__col _type_btn _type_normal">2.20</td><td class="table__col _type_btn _type_normal">1.60</td><td class="table__col _type_all_count"><span class="text">+12</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_3"><span class="table__event-number">1995</span><div class="table__match-title-text no_link">1-й тайм жёлтые карты </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">5.10</td><td class="table__col _type_btn _type_normal">1.85</td><td class="table__col _type_btn _type_normal">2.85</td><td class="table__col _type_btn _type_normal">1.37</td><td class="table__col _type_btn _type_normal">1.85</td><td class="table__col _type_btn _type_normal">1.13</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">2.52</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.46</td><td class="table__col _type_fora">0.5</td><td class="table__col _type_btn _type_normal">1.61</td><td class="table__col _type_btn _type_normal">2.17</td><td class="table__col _type_all_count"><span class="text">+4</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1996</span><div class="table__match-title-text no_link">фолы </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">2:6</span></div></div><div></div></div></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn _type_normal">1.20</td><td class="table__col _type_btn _type_normal">4.00</td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora">+3.5</td><td class="table__col _type_btn _type_normal">1.90</td><td class="table__col _type_fora">-3.5</td><td class="table__col _type_btn _type_normal">1.80</td><td class="table__col _type_fora">25.5</td><td class="table__col _type_btn _type_normal">1.75</td><td class="table__col _type_btn _type_normal">1.96</td><td class="table__col _type_all_count"><span class="text">+12</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_3"><span class="table__event-number">1997</span><div class="table__match-title-text no_link">1-й тайм фолы </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">2:6</span></div></div><div></div></div></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora">+3.5</td><td class="table__col _type_btn _type_normal">2.12</td><td class="table__col _type_fora">-3.5</td><td class="table__col _type_btn _type_normal">1.64</td><td class="table__col _type_fora">13.5</td><td class="table__col _type_btn _state_blocked">1.94</td><td class="table__col _type_btn _type_normal">1.77</td><td class="table__col _type_all_count"><span class="text">+10</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">1998</span><div class="table__match-title-text no_link">удары в створ </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">1.23</td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn _type_normal">3.70</td><td class="table__col _type_fora">-2.5</td><td class="table__col _type_btn _type_normal">1.96</td><td class="table__col _type_fora">+2.5</td><td class="table__col _type_btn _type_normal">1.75</td><td class="table__col _type_fora">7.5</td><td class="table__col _type_btn _type_normal">1.90</td><td class="table__col _type_btn _type_normal">1.80</td><td class="table__col _type_all_count"><span class="text">+14</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_3"><span class="table__event-number">1999</span><div class="table__match-title-text no_link">1-й тайм удары в створ </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">1.73</td><td class="table__col _type_btn _type_normal">3.50</td><td class="table__col _type_btn _type_normal">4.70</td><td class="table__col _type_btn _type_normal">1.15</td><td class="table__col _type_btn _type_normal">1.26</td><td class="table__col _type_btn _type_normal">1.99</td><td class="table__col _type_fora">-1.5</td><td class="table__col _type_btn _type_normal">3.20</td><td class="table__col _type_fora">+1.5</td><td class="table__col _type_btn _type_normal">1.30</td><td class="table__col _type_fora">2.5</td><td class="table__col _type_btn _type_normal">2.35</td><td class="table__col _type_btn _type_normal">1.52</td><td class="table__col _type_all_count"><span class="text">+8</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">2000</span><div class="table__match-title-text no_link">офсайды </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:1</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">2.03</td><td class="table__col _type_btn _type_normal">4.50</td><td class="table__col _type_btn _type_normal">2.77</td><td class="table__col _type_btn _type_normal">1.39</td><td class="table__col _type_btn _type_normal">1.16</td><td class="table__col _type_btn _type_normal">1.70</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.62</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">2.15</td><td class="table__col _type_fora">4.5</td><td class="table__col _type_btn _type_normal">1.80</td><td class="table__col _type_btn _type_normal">1.90</td><td class="table__col _type_all_count"><span class="text">+10</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_3"><span class="table__event-number">2001</span><div class="table__match-title-text no_link">1-й тайм офсайды </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:1</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">6.50</td><td class="table__col _type_btn _type_normal">3.30</td><td class="table__col _type_btn _type_normal">1.63</td><td class="table__col _type_btn _type_normal">2.13</td><td class="table__col _type_btn _type_normal">1.29</td><td class="table__col _type_btn _type_normal">1.08</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">4.00</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.20</td><td class="table__col _type_fora">2.5</td><td class="table__col _type_btn _type_normal">2.65</td><td class="table__col _type_btn _type_normal">1.42</td><td class="table__col _type_all_count"><span class="text">+6</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__btn icon _type_normal _icon_arrow-down-blue _state_expanded"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _type_with-details _is_child _indent_2"><span class="table__event-number">2005</span><div class="table__match-title-text no_link">штанги или перекладины </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn _type_normal">3.70</td><td class="table__col _type_btn _type_normal">1.40</td><td class="table__col _type_btn _type_normal">10.00</td><td class="table__col _type_btn _type_normal">1.02</td><td class="table__col _type_btn _type_normal">2.75</td><td class="table__col _type_btn _type_normal">1.23</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.31</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">3.15</td><td class="table__col _type_fora">0.5</td><td class="table__col _type_btn _type_normal">2.37</td><td class="table__col _type_btn _type_normal">1.51</td><td class="table__col _type_all_count"><span class="text">+4</span></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_3"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _is_child _indent_3"><span class="table__event-number">2006</span><div class="table__match-title-text no_link">1-й тайм штанги или перекладины </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn"></td><td class="table__col _type_btn _type_normal">1.06</td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn _type_normal">7.50</td><td class="table__col _type_btn"></td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">1.34</td><td class="table__col _type_fora">0</td><td class="table__col _type_btn _type_normal">3.00</td><td class="table__col _type_fora">0.5</td><td class="table__col _type_btn _type_normal">5.80</td><td class="table__col _type_btn _type_normal">1.10</td><td class="table__col _type_all_count"></td></tr><tr class="table__row"><td class="table__col _pos_first _indent_2"><div class="table__empty-col"></div></td><td colspan="0" class="table__col _size_long"><div class="table__match-title _is_child _indent_2"><span class="table__event-number">2019</span><div class="table__match-title-text no_link">видеопросмотры </div></div><div class="table__timescore"><div class="table__timescore-left-container"><div class="table__score"><span class="table__score-normal">0:0</span></div></div><div></div></div></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora"></td><td class="table__col _type_btn"></td><td class="table__col _type_fora">0.5</td><td class="table__col _type_btn _type_normal">3.65</td><td class="table__col _type_btn _type_normal">1.24</td><td class="table__col _type_all_count"></td></tr>
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
16.04.2021, 22:45 25
Цитата Сообщение от xellan24rus Посмотреть сообщение
ак hml привести в читаемый вид)
Я это делаю в программе Visual Studio Code. Там при вставке он форматируется автоматически, ну или сочетанием клавиш Alt+Shift+F
Цитата Сообщение от xellan24rus Посмотреть сообщение
а сайте HtmlTigy можно, но после него у меня половина html кода исчезает в никуда..
Ну понятно, что там есть ограничение на размер контента. Это надо делать в приложении с редактором хтмл, поддерживающим форматирование, не обязательно в том, которым пользуюсь я ))
0
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
16.04.2021, 23:13  [ТС] 26
Цитата Сообщение от diadiavova Посмотреть сообщение
Это надо делать в приложении с редактором хтмл, поддерживающим форматирование
А например если форматирование есть, то выглядит вот так
Составить XPath путь

А хотелось бы привести в читаемый вид как здесь например)
Составить XPath путь

В программе которыю вы используете есть такое?) Или может подскажете что то подобное)
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
16.04.2021, 23:24 27
Цитата Сообщение от xellan24rus Посмотреть сообщение
В программе которыю вы используете есть такое?)
Отформатировал строку из предыдущего поста. Результат во вложении.
Вложения
Тип файла: zip page.zip (2.3 Кб, 4 просмотров)
1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
16.04.2021, 23:47  [ТС] 28
Цитата Сообщение от diadiavova Посмотреть сообщение
Отформатировал строку из предыдущего поста. Результат во вложении.
Это мощно =) Это он на автомате сам так форматирует и генерирует разметку) Нужно скачать, Sublime и notepad++ так просто не хотят творить чудеса)

Добавлено через 20 минут
diadiavova, программа бомба для таких целей)
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
17.04.2021, 07:55 29
Цитата Сообщение от xellan24rus Посмотреть сообщение
программа бомба для таких целей
Программа вообще хорошая, не только для таких целей. Кстати форматировать можно и своим кодом, например так
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
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.Load(openFileDialog1.FileName);
 
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    var xct = new XslCompiledTransform();
                    var xslt = $@"<?xml version=""1.0"" encoding=""utf-8""?>
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
    <xsl:output method=""html"" indent=""yes""/>
    <xsl:template match=""@* | node()"">
        <xsl:copy>
            <xsl:apply-templates select=""@* | node()""/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>";
                    var tdoc = new XmlDocument();
                    tdoc.LoadXml(xslt);
                    xct.Load(tdoc);
                    using (var stream = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate))
                    {
                        xct.Transform(doc, null, stream);
                    }
 
                }
            }
Результат во вложении.
Вложения
Тип файла: zip qqq-out.zip (2.3 Кб, 4 просмотров)
1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 13:06  [ТС] 30
Цитата Сообщение от diadiavova Посмотреть сообщение
Результат во вложении.
Сохраню код =) Для быстрых решений подходит идеально =)

Добавлено через 2 минуты
diadiavova, сделал код на все события что нужны и отфильтровал через if чтобы не было команды с недоступными коэффициентами =) Интересно как его уменьшить или вынести в отдельные методы, чтобы не таким страшным был =)
Кликните здесь для просмотра всего текста
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
private void Parsing()
        {
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            var pars_doc_liga = doc.DocumentNode.SelectNodes("//tbody[contains(@class, 'table__body')]");
            var filtr = "";
            foreach (var tbody in pars_doc_liga)
            {
                filtr = tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText;
                if (filtr.Contains("Теннис") || filtr.Contains("Баскетбол") || filtr.Contains("Киберспорт") || filtr.Contains("Бильярд"))
                {
                    var pars_doc_komand = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                    foreach (var komand in pars_doc_komand)
                    {
                        string res_komand = komand.SelectSingleNode(".//div[@class='table__match-title-text']").InnerText;
                        string res_win_one = komand.SelectSingleNode("./td[3]").InnerText;
                        string res_win_two = komand.SelectSingleNode("./td[5]").InnerText;
                        string filtr_win_one = komand.SelectSingleNode("./td[3]").OuterHtml;
                        string filtr_win_two = komand.SelectSingleNode("./td[5]").OuterHtml;
                        if (filtr_win_one.Contains("btn _type_normal") || filtr_win_one.Contains("btn _state_down") || filtr_win_one.Contains("btn _state_up")
                           || filtr_win_two.Contains("btn _type_normal") || filtr_win_two.Contains("btn _state_down") || filtr_win_two.Contains("btn _state_up")
                            )
                        {
                            textBox1.AppendText("Лига: " + filtr + Environment.NewLine + "Команды: " + res_komand + Environment.NewLine + "Победа первой команды: " + res_win_one + Environment.NewLine + "Победа второй команды: " + res_win_two + Environment.NewLine);
                        }
                    }
                }
                else
                {
                    if (filtr.Contains("Настольный теннис") || filtr.Contains("Волейбол"))
                    {
                        var pars_doc_komand = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                        foreach (var komand in pars_doc_komand)
                        {
                            string res_komand = komand.SelectSingleNode(".//div[@class='table__match-title-text']").InnerText;
                            string res_win_one = komand.SelectSingleNode("./td[3]").InnerText;
                            string res_win_two = komand.SelectSingleNode("./td[4]").InnerText;
                            string filtr_win_one = komand.SelectSingleNode("./td[3]").OuterHtml;
                            string filtr_win_two = komand.SelectSingleNode("./td[4]").OuterHtml;
                            if (filtr_win_one.Contains("btn _type_normal") || filtr_win_one.Contains("btn _state_down") || filtr_win_one.Contains("btn _state_up")
                               || filtr_win_two.Contains("btn _type_normal") || filtr_win_two.Contains("btn _state_down") || filtr_win_two.Contains("btn _state_up")
                                )
                            {
                                textBox1.AppendText("Лига: " + filtr + Environment.NewLine + "Команды: " + res_komand + Environment.NewLine + "Победа первой команды: " + res_win_one + Environment.NewLine + "Победа второй команды: " + res_win_two + Environment.NewLine);
                            }
                        }
                    }
                }
            }
        }


Добавлено через 1 минуту
Вынес в переменные всё, потому что ко всем этим данным нужен доступ по отдельности)
0
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 13:37  [ТС] 31
Вот сам проектик =) delete2.rar В принципе он не основной =) Для ознакомления парсинга и т.п =)
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
17.04.2021, 16:42 32
Цитата Сообщение от xellan24rus Посмотреть сообщение
Интересно как его уменьшить или вынести в отдельные методы, чтобы не таким страшным был =)
Ну, насчет того, чтобы сильно уменьшить, я не уверен, что это можно сделать так, чтобы не в ущерб читабельности кода. Но кое-что сделать можно. В частности у тебя тут ест повторяющийся код, который отличается только индексом ячейки второй команды, можно индекс просто вычислить. Кроме того есть неразумные вещи, типа получение кода узла, с последующей обработкой его как текста. Дело в том, что HAP имеет возможность работать с классами, там есть, в частности, метод, проверяющий наличие того или иного класса у узла. Я бы сделал примерно так
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
        private void ExtractData()
        {
            var doc = new hap.HtmlDocument();
            doc.LoadHtml(html);
            var tbodies = doc.DocumentNode.SelectNodes("//tbody[contains(@class, 'table__body')]");
            var result = new StringBuilder();
            Func<HtmlNode, bool> validTeam = td => td.HasClass("_type_normal") || td.HasClass("_state_up") || td.HasClass("_state_down");
            foreach (HtmlNode tbody in tbodies)
            {
                var tr1 = tbody.SelectSingleNode("tr[1]");
                var team2Index = (int)(double)tr1.CreateNavigator().Evaluate("count(./th[.//text()[1]='2'][1]/preceding-sibling::th)") + 1;
                var matches = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                result.Append("Лига: ").AppendLine(tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText);
                foreach (HtmlNode tr in matches)
                {
                    var tds = tr.SelectNodes("./td");
                    if (validTeam(tds[2]) || validTeam(tds[team2Index]))
                    {
                        result.Append("Команды: ").AppendLine(tds[1].InnerText)
                            .Append("Победа первой команды: ").AppendLine(tds[2].InnerText)
                            .Append("Победа второй команды: ").AppendLine(tds[team2Index].InnerText);
                    }
                }
                textBox1.Text = result.ToString();
            }
        }
Добавлено через 2 минуты
И еще: у тебя в проекте хтмл-документ просто загружен в папку дебаг. Так делать не надо. Надо добавить его в проект, а в свойствах элемента проекта указать, что он должен копироваться при сборке. Иначе при очистке проекта файл просто потеряется.

Добавлено через 2 минуты
И я не уверен, что при проверке условия правильно использовать именно ||, а не &&. Но я ориентировался на твой код, так что смотри уже сам.
1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 19:23  [ТС] 33
diadiavova, спасибо, расшарю этот этот код =)

Добавлено через 1 минуту
Цитата Сообщение от diadiavova Посмотреть сообщение
И я не уверен, что при проверке условия правильно использовать именно ||, а не &&. Но я ориентировался на твой код, так что смотри уже сам.
Да работает одинаково, но || когда то показал что лучше, так и привык =)

Добавлено через 2 минуты
Цитата Сообщение от diadiavova Посмотреть сообщение
И еще: у тебя в проекте хтмл-документ просто загружен в папку дебаг. Так делать не надо. Надо добавить его в проект, а в свойствах элемента проекта указать, что он должен копироваться при сборке. Иначе при очистке проекта файл просто потеряется.
Верно подмечено, но это не основной проект и + я в нем даже дизайн вообще никакой не делал, просто компоненты кинул чтобы работали и все ок =) В основном проекте вывод через datagridview =) Но я у меня привычка если что то протестить и понять как работает, создаю отдельный проект и в нем проверяю как и что )
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
17.04.2021, 20:32 34
Цитата Сообщение от xellan24rus Посмотреть сообщение
Да работает одинаково, но || когда то показал что лучше, так и привык =)
Так это разные операторы и результат дают разный. Когда ты проверяешь условие в рамках одного узла, то все логично - тебе нужно, чтобы узел имел хотя бы один из этих классов, но когда проверка выполняется между узлами (в моем коде это 17-я строка), то тут в случае использования || проверяется, что хотя бы один из узлов содержит один из указанных классов, а если нужно, чтобы таковой присутствовал непременно в обоих узлах, то нужно использовать &&.

Добавлено через 2 минуты
xellan24rus, и да, еще такое мелкое замечание. Вот ты говоришь, что не любишь линк, а вот мне интересно, как бы выглядело твое выражение проверки (то, которое в if-е), если бы и классов было побольше и узлов нужно было бы проверить достаточно много? Неужели все варианты перечислял бы? ))
1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 22:19  [ТС] 35
Цитата Сообщение от diadiavova Посмотреть сообщение
проверяется, что хотя бы один из узлов содержит один из указанных классов, а если нужно, чтобы таковой присутствовал непременно в обоих узлах, то нужно использовать &&.
Принял к сведениям =)

Добавлено через 6 минут
Цитата Сообщение от diadiavova Посмотреть сообщение
и да, еще такое мелкое замечание. Вот ты говоришь, что не любишь линк, а вот мне интересно, как бы выглядело твое выражение проверки (то, которое в if-е), если бы и классов было побольше и узлов нужно было бы проверить достаточно много? Неужели все варианты перечислял бы? ))
Суть в том что я беру в данном случае все таблицы с играми и каждую перебираю по одной и из этих таблиц беру все команды и по одной их перебираю =) То есть 1 команда один блок кода от родительского класса =) И вот так string filtr_win_one = komand.SelectSingleNode("./td[3]").OuterHtml; я получаю имя класса для обработки через if, классы могут 5 имен принять от разных событий игры и вот эти имена класса сравниваю, если они мне не подходят, то я пропускаю и не вношу никаких данных в форму =) Линк конечно хорошо, изучу со временем, то что благодаря вам узнал разные подходы и понял про xpath и как делать не надо =) Хочу вынести в основной проект и закончить его быстрее =) А там уже можно и линк пробовать изучать =)

Добавлено через 13 минут
То есть я не работаю с целым документом если в этом нет нужды =)

Добавлено через 56 минут
Цитата Сообщение от diadiavova Посмотреть сообщение
var team2Index = (int)(double)tr1.CreateNavigator().Evaluate("count(./th[.//text()[1]='2'][1]/preceding-sibling::th)") + 1;
Все равно не пойму как это работает) Как вы перебрали победу второй команды) Ведь там много классов td, в случае со второй командой мне только 5 и 4 позиция нужна =) И то 4 нужна если нету ничьей =)

Добавлено через 1 минуту
И в целом не понимаю когда условие if (validTeam(tds[2]) || validTeam(tds[team2Index])) знает что нужно брать validTeam(tds[team2Index])
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
17.04.2021, 22:26 36
Цитата Сообщение от xellan24rus Посмотреть сообщение
Все равно не пойму как это работает)
Ну как это определяется, если просто смотреть на таблицу в браузере? Где двоечка в заголовочной части, там и вторая команда. Вот я и беру первую строку tbody, нахожу первую ячейку, содержащую двойку и подсчитываю сколько ячеек ей предшествует. После этого прибавляю единичку к этому числу и получаю индекс, актуальный для всех матчей данного tbody.
Цитата Сообщение от xellan24rus Посмотреть сообщение
И в целом не понимаю когда условие if (validTeam(tds[2]) || validTeam(tds[team2Index])) знает что нужно брать validTeam(tds[team2Index])
Функция определена в 7-ой строке кода. Она проверяет ячейку на наличие одного из классов. Вот я и передаю ей по очереди нужные ячейки и объединяю условие. Здесь, в общем-то, ничего сложного нет.
1
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 22:44  [ТС] 37
Цитата Сообщение от diadiavova Посмотреть сообщение
Функция определена в 7-ой строке кода. Она проверяет ячейку на наличие одного из классов. Вот я и передаю ей по очереди нужные ячейки и объединяю условие. Здесь, в общем-то, ничего сложного нет.
Понял, это я запутался уже =)

Добавлено через 2 минуты
Цитата Сообщение от diadiavova Посмотреть сообщение
Ну как это определяется, если просто смотреть на таблицу в браузере? Где двоечка в заголовочной части, там и вторая команда. Вот я и беру первую строку tbody, нахожу первую ячейку, содержащую двойку и подсчитываю сколько ячеек ей предшествует. После этого прибавляю единичку к этому числу и получаю индекс, актуальный для всех матчей данного tbody.
Я так хотел и хотел изначально сделать, но так примерами xpath не смог объяснить, а вы суть поняли уже исходя из кода и результатов =) Буду дальше расшаривать код =) С этого сайта парсить больше не чего) Сделаю просто красивый вывод в datagrid =)
0
6219 / 2467 / 725
Регистрация: 11.04.2015
Сообщений: 3,987
Записей в блоге: 43
17.04.2021, 23:46 38
Цитата Сообщение от xellan24rus Посмотреть сообщение
Я так хотел и хотел изначально сделать, но так примерами xpath не смог объяснить
Это не обязательно делать с помощью xpath, с таким же успехом можно было получить все ячейки и вычислить индекс той, которая содержит число 2 или даже пойти по еще более простому пути - проверять четвертую ячейку и уже в зависимости от того, что в ней (двойка или нет) брать нужный. В любом случае это лучше чем, перечислять виды спорта, я уже не говорю о дублировании кода, от которого всегда можно избавиться, например вынеся повторяющийся код в отдельный метод, а отличающиеся элементы кода(в данном случае индекс ячейки) сделать параметрами метода. Ну это такой универсальный способ.
Цитата Сообщение от xellan24rus Посмотреть сообщение
а вы суть поняли уже исходя из кода и результатов
Ну я догадался, что в коде есть различия, но найти было не так просто. ))
0
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
17.04.2021, 23:56  [ТС] 39
Цитата Сообщение от diadiavova Посмотреть сообщение
ivate void ExtractData()
        {
            var doc = new hap.HtmlDocument();
            doc.LoadHtml(html);
            var tbodies = doc.DocumentNode.SelectNodes("//tbody[contains(@class, 'table__body')]");
            var result = new StringBuilder();
            Func<HtmlNode, bool> validTeam = td => td.HasClass("_type_normal") || td.HasClass("_state_up") || td.HasClass("_state_down");
            foreach (HtmlNode tbody in tbodies)
            {
                var tr1 = tbody.SelectSingleNode("tr[1]");
                var team2Index = (int)(double)tr1.CreateNavigator().Evaluate("count(./th[.//text()[1]='2'][1]/preceding-sibling::th)") + 1;
                var matches = tbody.SelectNodes(".//tr[.//div[@class='table__match-title-text']]");
                result.Append("Лига: ").AppendLine(tbody.SelectSingleNode(".//div[@class='table__title-text']").InnerText);
                foreach (HtmlNode tr in matches)
                {
                    var tds = tr.SelectNodes("./td");
                    if (validTeam(tds[2]) || validTeam(tds[team2Index]))
                    {
                        result.Append("Команды: ").AppendLine(tds[1].InnerText)
                            .Append("Победа первой команды: ").AppendLine(tds[2].InnerText)
                            .Append("Победа второй команды: ").AppendLine(tds[team2Index].InnerText);
                    }
                }
                textBox1.Text = result.ToString();
            }
Ещё один такой момент в коде например Лига: Футбол Австралия А-лига
Составить XPath путь
не спарсила команды, если ещё вниз опуститься, то тоже есть места где нет команды, а лиги есть. Код при этой лиги доходит до if
Составить XPath путь
то условие не срабатывает. И когда я делаю вот так foreach (HtmlNode tr in matches)
C#
1
2
3
4
5
6
7
8
9
 {
                    var tds = tr.SelectNodes("./td");
                    //if (validTeam(tds[2]) || validTeam(tds[team2Index]))
                    {
                        string[] res = { "Команды: " + tr.SelectSingleNode(".//div[@class='table__match-title-text']").InnerText
                    };
                            //tds[2].InnerText, tds[team2Index].InnerText };
                        addGridParam(res, dataGridView1);
                    }
То команды отображаются корректно
Составить XPath путь
Миниатюры
Составить XPath путь  
0
266 / 213 / 38
Регистрация: 08.04.2020
Сообщений: 895
18.04.2021, 00:00  [ТС] 40
Цитата Сообщение от diadiavova Посмотреть сообщение
Это не обязательно делать с помощью xpath, с таким же успехом можно было получить все ячейки и вычислить индекс той, которая содержит число 2 или даже пойти по еще более простому пути - проверять четвертую ячейку и уже в зависимости от того, что в ней (двойка или нет) брать нужный. В любом случае это лучше чем, перечислять виды спорта, я уже не говорю о дублировании кода, от которого всегда можно избавиться, например вынеся повторяющийся код в отдельный метод, а отличающиеся элементы кода(в данном случае индекс ячейки) сделать параметрами метода. Ну это такой универсальный способ.
Я отталкиваясь от 2 вообще не смог путь составить, хотя этот метод хороший и без дублей =) А код я на скорую руку писал, лишь бы проверить) В основных проектах стараюсь покрасивее делать если это возможно моему опыту =)

Добавлено через 1 минуту
Цитата Сообщение от diadiavova Посмотреть сообщение
Ну я догадался, что в коде есть различия, но найти было не так просто. ))
Пробовал по разному, но вывод в итоге один был =) И как вы говорили что лучше кодом объяснить чем словами что нужно =) Хотя и кодом не всегда легко сказать что от него нужно =)
0
18.04.2021, 00:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2021, 00:00
Помогаю со студенческими работами здесь

Доработка макроса: составить путь к файлу из двух ячеек по условию
имеется макрос который с используя цикла копирует поочереди 3 книги за определенную дату(дата и...

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

Составить программу которая выводит полный путь к исполняемому файлу этой программы
В билете такой вопрос. Вообще не понимаю где у программы исполняемый файл и что нужно сделать.

Th:replace не воспринимает рендереный путь. Но работает, если путь захардкодить
Thymeleaf &lt;p th:text=&quot;'themes/'+${theme}+'/general/footer::footer(theme=' + ${theme}...

Как полный путь преобразовать в путь для коммандной строки?
Типа: C:Мои документыМоя Папка в C:Моидок~1Мояпап~1

Возврат на истинный путь, или как вернуться на путь программиста
Доброго времени суток, товарищи! Зайду из далека. Окончил в 14 году универ на программиста,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru