Парсинг в список с условием

trecho

Client
Регистрация
12.07.2018
Сообщения
171
Благодарностей
124
Баллы
43
Такая задача - спарсить из вот такой таблицы данные с список

НазваниеИгры:Ключ

Как сделать, что если название ключа "Steamworks", то брать данные из ng-bind="item.product.name" соответствующего элемента?

Сейчас у меня сделано вот так:
парсим //*[@ng-value="keyInfo.value.Key"] и //*[@ng-if="keyInfo.value.DisplayName"] в два разных списка, а потом берем из них данные по очереди и пишем в файл.
как в таком случае замену сделать я не знаю, наверное вообще по другому делать надо
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
парси через родителя.
//*[@ng-if="keyInfo.value.DisplayName" and contains(text(),'STEAMWORKS')]/ancestor::div[@ng-show]//*[@ng-value="keyInfo.value.Key"]
 
  • Спасибо
Реакции: trecho

trecho

Client
Регистрация
12.07.2018
Сообщения
171
Благодарностей
124
Баллы
43
парси через родителя.
//*[@ng-if="keyInfo.value.DisplayName" and contains(text(),'STEAMWORKS')]/ancestor::div[@ng-show]//*[@ng-value="keyInfo.value.Key"]
к сожалению, не работает
я уже и так и сяк попробовал на основе этого что-то сделать, но безуспешно :(

и я же правильно понимаю, что по такому условию найдется только элементы со "STEAMWORKS :" внутри?
а как мне потом в список в правильном порядке все положить?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Как сделать, что если название ключа "Steamworks", то брать данные из ng-bind="item.product.name" соответствующего элемента?
это ответ на этот вопрос.
для других записей нужен другой ключ.
либо составлять xpath без ключа, но так же через родителей.
 
  • Спасибо
Реакции: trecho

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
Как бы сделал я: сначала сохранил все игры в список. Потом в цикле берём из списка элементы с удалением, парсим название, регуляркой проверяем не steamworks ли там, если да то парсим название из другого места. Потом парсим ключ.

И так пока не кончатся элементы в списке. Во вложении шаблон, демонстрирующий то что я описал выше.
 

Вложения

  • Спасибо
Реакции: trecho

trecho

Client
Регистрация
12.07.2018
Сообщения
171
Благодарностей
124
Баллы
43
Как бы сделал я: сначала сохранил все игры в список. Потом в цикле берём из списка элементы с удалением, парсим название, регуляркой проверяем не steamworks ли там, если да то парсим название из другого места. Потом парсим ключ.

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

C#:
// --- входные настройки ---
var list = project.Lists["Список 1"];                                    // список для операций
string filter = "STEAMWORKS";                                            // фильтр для контрольного элемента
string xpath_base="//li[@ng-repeat='item in order.items']";              // задает основного родителя элемента
string xpath_control="//*[@ng-if='keyInfo.value.DisplayName']";         // задает контрольный элемент относительно родителя
string xpath_data_1="//*[@ng-value='keyInfo.value.Key']";                // задает элемент с данными относительно родителя
string xpath_data_2="//*[@ng-bind='item.product.name' ]";                // задает элемент с данными относительно родителя

// --- работа ---
string control = xpath_base+xpath_control;
string data="";
Tab tab = instance.ActiveTab;
HtmlElement el = tab.FindElementByXPath(control, 0);
HtmlElementCollection col = tab.FindElementsByXPath(control);

for (int ii=0; ii<col.Count; ii++) {
    // парс контрольного элемента
    string pars_1 =  col.Elements[ii].InnerText;
    if (pars_1.IndexOf(filter)>=0) {             // условие по фильтру
        data = xpath_base+xpath_data_2;
        el = tab.FindElementByXPath(data, ii);
        pars_1 = el.InnerText + ":";
    }
    // парс данных
    data = xpath_base+xpath_data_1;
    el = tab.FindElementByXPath(data, ii);
    string pars_2 = el.GetAttribute("value");
    // запись в список
    string parse_all = pars_1 + pars_2;
    list.Add(parse_all);
}
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)