Xpath contains text — ошибки

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Добра всем!

Имеется такой набор — переменная с DOM, HtmlAgilityPack, списки с текстами, динамическое xpath-выражение и необходимость парсинга инфы.

Вот пример html, чтобы было понятно, почему не атрибуты а текст:
HTML:
<ul>
    <li>...</li>
    <li>...</li>
    <li>...</li>
    <li>...</li>
    <li>...</li>
    <li>...</li>
    <li>
             <a href="/catalog/oborudovanie/st-nakonechnikiw-h/">Наконечники W&H</a>
    </li>
</ul>
Xpath получается такой: @//a[contains(text(),'"+catL1+"')]/following::ul/li/a[contains(text(),'"+catL2+"')]
И он работает ровно до тех пор, пока в тексте не появляются всевозможные символы & ( ) . и т.д. Как только они появляются — кирдык, agility не находит ноду.
Пробовал реплейсить "&" на "" — не помогает, видимо такой текст уже отличается от исходного.
Удалять все что после злополучного спецсимвола не подходит, возможно появление чего-то типа "НаконечникиW&BV".
И вот как с этим жить?
Буду признателен за идею зеркалирования этого безобразия.
 

daVinchi

Client
Регистрация
11.01.2019
Сообщения
59
Благодарностей
66
Баллы
18
Может я не так понял задачу...
Но наличие символов & ( ) не мешают найти url:

C#:
string response = project.Variables["html"].Value; // пример html
string catL1 = "Наконечники W&H";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(response);

string url = doc.DocumentNode.SelectSingleNode("//a[contains(text(),'"+catL1+"')]").Attributes["href"].Value;
return url;
 
  • Спасибо
Реакции: semafor

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
400
Баллы
63
Может я не так понял задачу...
Но наличие символов & ( ) не мешают найти url:

C#:
string response = project.Variables["html"].Value; // пример html
string catL1 = "Наконечники W&H";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(response);

string url = doc.DocumentNode.SelectSingleNode("//a[contains(text(),'"+catL1+"')]").Attributes["href"].Value;
return url;
Блин, это наверное называется утро вечера мудренее...
Мой код кроме как имен переменных и xpath, который я привел выше, ничем не отличается от вашего (что не удивительно).
Вчера ошибка воспроизводилась с любым из символов ( ) & . в catL1, возвращая ошибку:

Выполнение действия CSharp OwnCode. [Строка: 10; Cтолбец: 0] Ссылка на объект не указывает на экземпляр объекта.

Как только я убирал вручную спецсимвол и все что за ним — получал нужный элемент, т.е. грешить на то что в переменной отсутствовали элементы нельзя, да и проверял я html в notepad++
Сегодня все работает.
Х.з. что это было...
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Блин, это наверное называется утро вечера мудренее...
Мой код кроме как имен переменных и xpath, который я привел выше, ничем не отличается от вашего (что не удивительно).
Вчера ошибка воспроизводилась с любым из символов ( ) & . в catL1, возвращая ошибку:

Выполнение действия CSharp OwnCode. [Строка: 10; Cтолбец: 0] Ссылка на объект не указывает на экземпляр объекта.

Как только я убирал вручную спецсимвол и все что за ним — получал нужный элемент, т.е. грешить на то что в переменной отсутствовали элементы нельзя, да и проверял я html в notepad++
Сегодня все работает.
Х.з. что это было...
возможно это не связано конкретно с тем кодом с которым вы работаете. эта ошибка сейчас бич отладки в проджект мейкере. у меня вчера рабочий кубик c# такое же выдавал, а как оказалось просто забыл убрать точку останова в общем коде. причем точка стояла вообще в другой функции.
 
  • Спасибо
Реакции: semafor

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