У меня есть выбор xpath с помощью плагина firefox xpath
id('some_id')/x:ul/x:li[4]/x:span
используя html agility pack, я могу получить id('some_id')/x:ul/x:li[4]
htmlDoc.DocumentNode.SelectNodes(@"//div[@id='some_id']/ul/li[4]").FirstOrDefault();
но я не знаю, как получить это значение диапазона.
Обновить
<div id="some_id">
<ul>
<li><li>
<li><li>
<li><li>
<li>
Some text
<span>text I want to grab</span>
</li>
</ul>
</div>
Альтернативный подход (без html-agility-pack) заключается в использовании LINQ2XML . Вы можете использовать метод XDocument.Descendants, чтобы взять элемент span и принять его значение:
var xml = @" <div id=""some_id"">
<ul>
<li></li>
<li></li>
<li></li>
<li>
Some text
<span>text I want to grab</span>
</li>
</ul>
</div>";
var doc = XDocument.Parse(xml);
Console.WriteLine(doc.Root.Descendants("span").FirstOrDefault().Value);
Код может быть расширен, чтобы проверить, имеет ли элемент div соответствующий идентификатор, используя свойство XElement.Attribute :
var doc = XDocument.Parse(xml);
Console.WriteLine(doc.Elements("div").Where (e => e.Attribute("id").Value == "some_id").Descendants("span").FirstOrDefault().Value);
Одним из недостатков этого решения является то, что структура XML (HTML, XHTML) должна быть надлежащим образом закрыта, иначе синтаксический анализ завершится с ошибкой.
Вам не нужен синтаксический анализ HTML с LINQ2XML, HTMLAgilityPack для него, и получить этот узел проще:
var html = @" <div id=""some_id"">
<ul>
<li></li>
<li></li>
<li></li>
<li>
Some text
<span>text I want to grab</span>
</li>
</ul>
</div>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var value = doc.DocumentNode.SelectSingleNode("div[@id='some_id']/ul/li/span").InnerText;
Console.WriteLine(value);