Парсер строки Html таблицы, при нахождении во 2 столбце конкретного слова.

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
1
Баллы
3
Привет!

Нужно спарсить все строки в таблице, в которых есть конкретное слово в фразе (начало слова).

https://radikal.ru/lfp/d.radikal.ru/d02/1906/18/e540774b6830t.jpg/htm

Парсил страницу с помощью Xpath, затем фильтровал по содержанию "продукт" (ниже пример переведенный в C#). Как спарсить все строки с данными где есть во втором столбце "продукт"??

Ну или спарсить данные из всей таблицы, я потом отфильтрую в Exel.

Код:
Tab tab = instance.ActiveTab;
if (tab.IsVoid || tab.IsNull) return -1;
// Получаем атрибут "innerText" всех элементов, соответствующих пути "tr>td>div:nth-child(1)>label:nth-child(1)"
var attributes = ZennoPoster.Parser.ParseByCssSelector(tab, ZennoLab.InterfacesLibrary.Enums.Parser.SourceType.Dom, "tr>td>div:nth-child(1)>label:nth-child(1)", "innerText", true).ToList();
// Фильтруем элементы
attributes.Filter(ZennoLab.InterfacesLibrary.Enums.Parser.FilterType.Contains, "продукт");
// Выбираем элементы из диапазона "all"
attributes.Range("all");
 

intagens

Client
Регистрация
28.09.2015
Сообщения
93
Благодарностей
9
Баллы
8
так а в чем собственно проблема?
перебираешь все элементы с помощью foreach, если содержит "продукт" забираешь родительскую строку в список, таблицу, вобщем куда надо)
 

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
1
Баллы
3
так а в чем собственно проблема?
перебираешь все элементы с помощью foreach, если содержит "продукт" забираешь родительскую строку в список, таблицу, вобщем куда надо)
Проблема в том, что я новичок. Лучше бы вы написали пару строк кода для помощи. А так вы мне ничем не помогли.
 

intagens

Client
Регистрация
28.09.2015
Сообщения
93
Благодарностей
9
Баллы
8
Проблема в том, что я новичок.
ну, раз используешь C# и Xpatch - значит не такой уж и новичек)))
Код:
Tab Tab1 = instance.ActiveTab;

IZennoTable tblMyData = project.Tables["MyData"];

//получаем все строки из таблицы с сайта
HtmlElementCollection colRows = Tab1.FindElementsByXPath("//путь к строке в таблице на сайте");
//перебираем каждую строку
foreach(HtmlElement elRow in colRows){
    //получаем данные нужного элемента конкретной строки
    string strCellOne = elRow.FindChildByXPath(".//путь к нужной ячейке(путь формируем отталкиваясь от родительской строки)", 0).GetAttribute("Наш атрибут");
    if(strCellOne.Contains("продукт")){
        //забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
        string strCellTwo = elRow.FindChildByXPath(".//путь к нужной ячейке(путь формируем отталкиваясь от родительской строки)", 0).GetAttribute("Наш атрибут");
       
        //записываем данные в таблицу
        tblMyData.AddRow(new String[]{strCellOne, strCellTwo});
    }
}
 
  • Спасибо
Реакции: idleSSS

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
1
Баллы
3
Спасибо! Но, что-то не выходит, хотя код отрабатывает.

Вот ссылка http://zakupki.gov.ru/epz/orderplan/printForm/view.html?printFormId=25486329

Вот код,

Код:
Tab Tab1 = instance.ActiveTab;
IZennoTable tblMyData = project.Tables["MyData"];
//получаем все строки из таблицы с сайта
HtmlElementCollection colRows = Tab1.FindElementsByXPath("//table[5]//tr");
//перебираем каждую строку
foreach(HtmlElement elRow in colRows){
    //получаем данные нужного элемента конкретной строки
    string strCellOne = elRow.FindChildByXPath(".//td[3]", 0).GetAttribute("innerhtml");
    if(strCellOne.Contains("ремонт")){
        //забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
        string strCellTwo = elRow.FindChildByXPath(".//td[5]", 0).GetAttribute("innerhtml");
        string strCellThree = elRow.FindChildByXPath(".//td[22]", 0).GetAttribute("innerhtml");
        string strCellFour = elRow.FindChildByXPath(".//td[24]", 0).GetAttribute("innerhtml");
        //записываем данные в таблицу
        tblMyData.AddRow(new String[]{strCellOne, strCellTwo, strCellThree, strCellFour});
    }
}
Правда я не совсем понимаю, как мне указывать пути Xpath, после получения всех строк. Я просто указываю .// и Xpath ищет этот элемент уже в текущей строке? Я правильно это делаю??
Код выполняется, но данных в таблице нет.
 

intagens

Client
Регистрация
28.09.2015
Сообщения
93
Благодарностей
9
Баллы
8

idleSSS

Новичок
Регистрация
12.02.2019
Сообщения
28
Благодарностей
1
Баллы
3
на странице которую ты дал нет ни одного элемента по указанному тобой пути "//table[5]//tr" https://i.imgur.com/QD7p3V6.png


да, он ищет дочерние элементы текущей строки
На сайте ведутся регламентные работы, на вашем скриншоте это видно, поэтому страница открылась совсем не та.
Я уже разобрался в чем было дело. При поиске данных нужного элемента (после получения строк) и взятии данных из ячейки нужно было использовать одну черту - "./td[3]", "./td[5]" и так далее. Спасибо плагину Xpath Helper Wizard в хроме.

А Вам отдельное спасибо! Без Вас я бы не разобрался.
 
  • Спасибо
Реакции: intagens

intagens

Client
Регистрация
28.09.2015
Сообщения
93
Благодарностей
9
Баллы
8
на здоровье) обращайся)
 

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