Как объединить пути xpath?

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Такой не простой вопрос по путям Xpath - допустим мы парсим какие то значения с сайта, есть выдача, например, товаров, но данные о товаре скрыты и подгружаются (фрейм) при нажатии кнопки на каждом товаре. Так вот, этот фрейм будет иметь свой номер страницы типа 0,1 и забирать его надо будет так Tab1.GetDocumentByAddress("0;1").FindElementByXPath("//a[contains(@class, 'item')]", 0).InnerText;
НО, загвоздка в том что этот номер страницы не единственный вариант, а их множество на одно странице 0,1 0,2 0,3 и тд. Как сделать так чтобы выпарсить все?
Знаю что можно, например объединить несколько путей xpath через | . Но как правильно их объединять??
И может есть более универсальный способ еще?
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Ага. Провести правильный анализ страницы, и задать нужные пути
Задаётся через HtmlElementCollection
Собирается через foreach
Это все понятно, так и делаю естественно. Вопрос в другом был.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
объединить несколько путей xpath через | . Но как правильно их объединять??
Смотря что объединять. | не объединяет, а собирает или то, или другое
PHP:
string strAttribute = instance.ActiveTab.FindElementByXPath("//div[@class='follow']|//div[@class='follow_vip']",0).GetAttribute("OuterHtml");
 
  • Спасибо
Реакции: Gunjubasik

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Смотря что объединять. | не объединяет, а собирает или то, или другое
PHP:
string strAttribute = instance.ActiveTab.FindElementByXPath("//div[@class='follow']|//div[@class='follow_vip']",0).GetAttribute("OuterHtml");
Загвоздка не в самих путях Xpath, а в GetDocumentByAddress("0;1"), там при каждой подгрузке фрейма номер другой уже.

Точнее их несколько номеров (0,1; 0,2; 0,3) и если у меня стоит GetDocumentByAddress("0;1"), то соответственно другие уже не парсятся. Как можно их все задать? Вот в чем вопрос.
 

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Загвоздка не в самих путях Xpath, а в GetDocumentByAddress("0;1"), там при каждой подгрузке фрейма номер другой уже.

Точнее их несколько номеров (0,1; 0,2; 0,3) и если у меня стоит GetDocumentByAddress("0;1"), то соответственно другие уже не парсятся. Как можно их все задать? Вот в чем вопрос.
Сам путь Xpath при этом не меняется.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Как сделать так чтобы выпарсить все?
Как вариант - искать нужное во всех документах страницы:
C#:
//Перебираем в цикле все документы на странице
foreach (var doc in Tab1.AllDocuments.Documents){
    //Ищем нужные элементы в каждом документе
    var el1 = doc.FindElementByXPath("XPath1",0);
    var el2 = doc.FindElementByXPath("XPath2",0);
    //Делаем всё что нужно с ними
    //...
}
 

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Элементы на странице можно искать не только среди потомков вкладки в целом, но и среди потомков отдельного "документа" внутри сайта, обращаясь к соответствующим методам объекта Tab или объекта Document в случае необходимости. Но к сожалению мы не можем передать методу GetDocumentByAddress значение "-1", сигнализирующее о том что нам нужно содержимое всех документов. И адрес конкретного документа нам также может быть неизвестен. Как быть в этом случае? Мы можем перебрать все документы на вкладке, или найти нужные элементы во всех. Tab1.AllDocuments не адресуются через foreach, но мы можем разобрать их при помощи цикла for:

Код:
Tab Tab1 = instance.ActiveTab;

for (int i=0; i<Tab1.AllDocuments.Count; i++) {
    Document doc = Tab1.AllDocuments.GetByNumber(i);
    foreach (HtmlElement elTest in doc.FindElementsByXPath("//div[@class='test']")) {
        project.SendInfoToLog(elTest.InnerText);
    }
}
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Класс Tab имеет такие же методы для поиска элементов, но при этом ищет по всем документам на странице. Вот этот код даст тот же результат, что и код выше.
Код:
foreach (var el in instance.ActiveTab.FindElementsByXPath("//div[@class='test']"))
{
    project.SendInfoToLog(el.InnerText);
}
 

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