Узлы поиска XPath HTML

Я использую HtmlAgilityPack, чтобы попытаться найти узлы HTML 'A', которые имеют атрибут href, содержащий определенную строку, в моем случае строку '/ groups /':

HtmlNodeCollection groups = source.DocumentNode.SelectNodes("//a[contains(@href, '/groups/')]");

Хотя исходный код содержит около 20 таких узлов, мой приведенный выше код не возвращает ни одного, что наводит меня на мысль, что, возможно, я делаю это неправильно.

Правильно ли то, что я делаю, и если нет, как я могу выбрать узлы, у которых есть определенный атрибут, значение которого содержит определенную строку?


person James Jeffery    schedule 01.03.2013    source источник
comment
Пожалуйста, добавьте xml, на который вы нацеливаетесь   -  person JWiley    schedule 01.03.2013


Ответы (1)


Ваше выражение мне кажется правильным.

Вы не публикуете исходный документ (или хотя бы его часть). Итак, я буду гадать.

Дело в том, что xpath не круто для сравнения без учета регистра. Если у вас есть тег <a> с атрибутом href, который содержит, например, /Groups/ или /GROUPS/, совпадения не будут. Для этого есть обходной путь:

//a[contains(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '/groups/')]

В качестве другого варианта вы можете использовать LINQ с StringComparison.OrdinalIgnoreCase:

source.DocumentNode.Descendants("a")
    .Where(a => a.GetAttributeValue("href", string.Empty)
                   .IndexOf("/groups/", StringComparison.OrdinalIgnoreCase) != -1
);
person Alex    schedule 01.03.2013