Как найти следующий элемент якоря с помощью htmlagilitypack - PullRequest
0 голосов
/ 14 марта 2019

Вот мои html элементы:

<a href="#" class="A">Sana</a>
<b><span class="B">1000</span>Dollar</b>

Я хочу прочитать 1000 (цену), используя с htmlagilitypack.
Sana innerText в уникальном, но Dollar innerText не уникален.
Также на целевой странице есть много классов с именем A & B.
Я хочу прочитать якорь (element a), который имеет Sana innerText и найти следующий элемент этого якоря (element b)& прочитайте innerText этого.
Вот мои коды:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create("goal web site");
req.Method = "GET";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36";
req.ContentType = "text/html; charset=utf-8";
req.Referer = "";
req.KeepAlive = true;
req.Timeout = 25000;
req.AllowAutoRedirect = true;

CookieContainer cookieJar1 = new CookieContainer();
req.CookieContainer = cookieJar1;

HttpWebResponse res = (HttpWebResponse) req.GetResponse();

foreach(Cookie cookie in res.Cookies) {
    cookieJar1.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), "/", cookie.Domain));
}

Stream Stream = res.GetResponseStream();
StreamReader reader = new StreamReader(Stream);
string reader_str = reader.ReadToEnd();

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(reader_str);

Вот что я должен сделать, чтобы прочитать цену 1000?

reader.Close();
Stream.Close();
res.Close();

1 Ответ

1 голос
/ 14 марта 2019

Вы можете попробовать использовать следующее выражение XPath *:

var xpath = "//a[.='Sana']/following-sibling::b[1]/span";
string price = htmlDoc.DocumentNode
                      .SelectSingleNode(xpath)
                      .InnerText;
Console.WriteLine(price.Text);

demo

Выражение выражения XPath:

  • //a[.='Sana']: найти <a> элементов с внутренним текстом, равным 'Sana' в любом месте документа
  • /following-sibling::b[1]: найдите первый родной элемент <b>, который расположен после <a> элементов, найденных на предыдущем шаге
  • /span: найти <span> элемент, который является дочерним по отношению к <b> элементам, найденным на предыдущем шаге

*) Читайте тему «XPath», если вы с ней не знакомы.Это один из MSDN: https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx

...