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

  • Автор темы Автор темы sanchessam
  • Дата начала Дата начала

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 через | . Но как правильно их объединять??
И может есть более универсальный способ еще?
 
И может есть более универсальный способ еще?
Ага. Провести правильный анализ страницы, и задать нужные пути
Задаётся через HtmlElementCollection
Собирается через foreach
 
Ага. Провести правильный анализ страницы, и задать нужные пути
Задаётся через HtmlElementCollection
Собирается через foreach
Это все понятно, так и делаю естественно. Вопрос в другом был.
 
объединить несколько путей xpath через | . Но как правильно их объединять??
Смотря что объединять. | не объединяет, а собирает или то, или другое
PHP:
Развернуть Свернуть Копировать
string strAttribute = instance.ActiveTab.FindElementByXPath("//div[@class='follow']|//div[@class='follow_vip']",0).GetAttribute("OuterHtml");
 
  • Спасибо
Реакции: The_vAe
Смотря что объединять. | не объединяет, а собирает или то, или другое
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"), то соответственно другие уже не парсятся. Как можно их все задать? Вот в чем вопрос.
 
Загвоздка не в самих путях Xpath, а в GetDocumentByAddress("0;1"), там при каждой подгрузке фрейма номер другой уже.

Точнее их несколько номеров (0,1; 0,2; 0,3) и если у меня стоит GetDocumentByAddress("0;1"), то соответственно другие уже не парсятся. Как можно их все задать? Вот в чем вопрос.
Сам путь Xpath при этом не меняется.
 
Как сделать так чтобы выпарсить все?
Как вариант - искать нужное во всех документах страницы:
C#:
Развернуть Свернуть Копировать
//Перебираем в цикле все документы на странице
foreach (var doc in Tab1.AllDocuments.Documents){
    //Ищем нужные элементы в каждом документе
    var el1 = doc.FindElementByXPath("XPath1",0);
    var el2 = doc.FindElementByXPath("XPath2",0);
    //Делаем всё что нужно с ними
    //...
}
 
Элементы на странице можно искать не только среди потомков вкладки в целом, но и среди потомков отдельного "документа" внутри сайта, обращаясь к соответствующим методам объекта 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);
    }
}
 
Класс Tab имеет такие же методы для поиска элементов, но при этом ищет по всем документам на странице. Вот этот код даст тот же результат, что и код выше.
Код:
Развернуть Свернуть Копировать
foreach (var el in instance.ActiveTab.FindElementsByXPath("//div[@class='test']"))
{
    project.SendInfoToLog(el.InnerText);
}
 

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