А в чем там собственно проблема то.
ТС надо вытащить инфу со страницы. Так понимаю не с одной страницы.
Т.е. это парсер. Соответственно он должен работать быстро, чтобы прокачивать большой объем инфы.
И тут вариант только один - делать через запросы. Можно конечно и через браузер, но какбы это помоему извращение.
Соответственно по ссылке было показано, как через запросы брать html страницу, а потом через xpath используя HtmlAgilityPack вытащить нужную инфу.
Вот тут и надо воткнуть xpath выражение, в списке будут все ссылки.
var list= doc.DocumentNode
.SelectNodes("".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]"") // взяли нужные узлы
.Select(n => n.GetAttributeValue("href", "")) //взяли значение атрибута href
.ToList();
Если через браузер, то в зенке уже есть встроенные методы для работы с xpath.
var hrefs = instance
.ActiveTab
.GetDocumentByAddress("0")
.FindElementsByXPath(".//div[@class='a-row a-spacing-none']/a[contains(@class, 'a-link-normal s-access-detail-page')]")
.Select(h => h.GetAttribute("href"))
.ToList();
foreach(var href in hrefs)
{
project.SendInfoToLog(href, true);
}
А вообще в xpath ничего сложного нет. Не надо лезть в дебри xpath и разбираться с конструкциями, которые посути нах не нужны.
Ну по крайней мере для начала.
В 90% случаев достаточно понимать две конструкции.
тэг[@атрибут='значение атрибута')]
тэг[contains(@атрибут, 'значение атрибута')]
Тэг может быть или какой то конкретный, скажем div, a, span и т.д. или любой, обозначается *.
Также * можно обозначить любой атрибут.
То что в скобках, не обязательно, это условие поиска нужной ноды, если например просто указать div, то будут взяты все ноды с таким тегом.
/ — корневой узел
// — множество узлов удовлетворяющих следющему условию
* — любые символы
@ — атрибут
[] — задает условие
Все. Вот эти пять элементов понимать, и как их собирать в конструкцию, и этого хватит в большинстве случаев.
По двум конструкциям.
Первый вариант, это строгое условие.
Второй - "содержит", значение атрибута содержит какой то текст.
Например есть вот такие ноды
<li class="serp-item" data-16sh="" data-sb8j="" data-cid="1">
<li class="serp-item serp-item_keyboard-shortcuts-ignore_yes" data-cid="4">
Как взять именно такие ноды? Вот тут и нужен
contains.
бла-бла-бла/li[contains(@class, 'serp-item']
Т.к. serp-item есть в значении атрибута class в обеих нодах, то такие ноды и возьмутся.
А дальше все просто, путь до нужных нод указывается как путь к какой то папке на компе, через слэш - / .
//тэг[@атрибут='значение атрибута')]/тэг[@атрибут='значение атрибута')]/тэг/тэг[contains(@атрибут, 'значение атрибута')]
Вложенность может быть любая. Основная трабла, это в каждом конкретном случает приходится поломать голову, как спуститься до нужной ноды.
В firefox есть удобная штука - плаги FirePath, как дополнение к другому плагину - FireBug.
C помощью него очень удобно конструировать/тестить xpath выражения.
Аналогичная возможность есть и в других браузерах. Но я привык к firefox, и юзаю в нем.
Надеюсь данная памятка поможет осилить xpath.