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

Discussion in 'Вопросы новичков' started by idleSSS, Jun 2, 2019.

  1. idleSSS

    idleSSS Новичок

    Joined:
    Feb 12, 2019
    Messages:
    13
    Likes Received:
    1
    Привет!

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

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

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

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

    Code (text):
    1. Tab tab = instance.ActiveTab;
    2. if (tab.IsVoid || tab.IsNull) return -1;
    3. // Получаем атрибут "innerText" всех элементов, соответствующих пути "tr>td>div:nth-child(1)>label:nth-child(1)"
    4. 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();
    5. // Фильтруем элементы
    6. attributes.Filter(ZennoLab.InterfacesLibrary.Enums.Parser.FilterType.Contains, "продукт");
    7. // Выбираем элементы из диапазона "all"
    8. attributes.Range("all");
     
  2. intagens

    intagens Client

    Joined:
    Sep 28, 2015
    Messages:
    68
    Likes Received:
    4
    так а в чем собственно проблема?
    перебираешь все элементы с помощью foreach, если содержит "продукт" забираешь родительскую строку в список, таблицу, вобщем куда надо)
     
  3. idleSSS

    idleSSS Новичок

    Joined:
    Feb 12, 2019
    Messages:
    13
    Likes Received:
    1
    Проблема в том, что я новичок. Лучше бы вы написали пару строк кода для помощи. А так вы мне ничем не помогли.
     
  4. intagens

    intagens Client

    Joined:
    Sep 28, 2015
    Messages:
    68
    Likes Received:
    4
    ну, раз используешь C# и Xpatch - значит не такой уж и новичек)))
    Code (text):
    1. Tab Tab1 = instance.ActiveTab;
    2.  
    3. IZennoTable tblMyData = project.Tables["MyData"];
    4.  
    5. //получаем все строки из таблицы с сайта
    6. HtmlElementCollection colRows = Tab1.FindElementsByXPath("//путь к строке в таблице на сайте");
    7. //перебираем каждую строку
    8. foreach(HtmlElement elRow in colRows){
    9.     //получаем данные нужного элемента конкретной строки
    10.     string strCellOne = elRow.FindChildByXPath(".//путь к нужной ячейке(путь формируем отталкиваясь от родительской строки)", 0).GetAttribute("Наш атрибут");
    11.     if(strCellOne.Contains("продукт")){
    12.         //забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
    13.         string strCellTwo = elRow.FindChildByXPath(".//путь к нужной ячейке(путь формируем отталкиваясь от родительской строки)", 0).GetAttribute("Наш атрибут");
    14.        
    15.         //записываем данные в таблицу
    16.         tblMyData.AddRow(new String[]{strCellOne, strCellTwo});
    17.     }
    18. }
     
    idleSSS likes this.
  5. idleSSS

    idleSSS Новичок

    Joined:
    Feb 12, 2019
    Messages:
    13
    Likes Received:
    1
    Спасибо! Но, что-то не выходит, хотя код отрабатывает.

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

    Вот код,

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

    intagens Client

    Joined:
    Sep 28, 2015
    Messages:
    68
    Likes Received:
    4
    на странице которую ты дал нет ни одного элемента по указанному тобой пути "//table[5]//tr" https://i.imgur.com/QD7p3V6.png

    да, он ищет дочерние элементы текущей строки
     
  7. idleSSS

    idleSSS Новичок

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

    А Вам отдельное спасибо! Без Вас я бы не разобрался.
     
    intagens likes this.
  8. intagens

    intagens Client

    Joined:
    Sep 28, 2015
    Messages:
    68
    Likes Received:
    4
    на здоровье) обращайся)
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)