如何使用 htmlagilitypack 查找锚点的下一个元素
How find next element of an anchor using with htmlagilitypack
这是我的 html 元素:
<a href="#" class="A">Sana</a>
<b><span class="B">1000</span>Dollar</b>
我想使用 htmlagilitypack 阅读 1000(价格)。
Sana
innerText 是唯一的,但 Dollar innerText 不是唯一的。
目标页面中还有许多 类,名称为 A
& B
。
我想读取一个具有 Sana
innerText 的锚点(element a
)并找到该锚点(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();
您可以尝试使用以下 XPath* 表达式:
var xpath = "//a[.='Sana']/following-sibling::b[1]/span";
string price = htmlDoc.DocumentNode
.SelectSingleNode(xpath)
.InnerText;
Console.WriteLine(price.Text);
XPath 表达式分解:
//a[.='Sana']
: 在文档 的任意位置找到具有内部文本等于'Sana'的<a>
元素
/following-sibling::b[1]
:找到第一个兄弟元素<b>
,它位于上一步找到的<a>
个元素之后
/span
:找到 <span>
元素,它是在上一步中找到的 <b>
个元素的子元素
*) 如果您不熟悉,请阅读 "XPath" 主题。这是来自 MSDN 的一个:https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx
这是我的 html 元素:
<a href="#" class="A">Sana</a>
<b><span class="B">1000</span>Dollar</b>
我想使用 htmlagilitypack 阅读 1000(价格)。
Sana
innerText 是唯一的,但 Dollar innerText 不是唯一的。
目标页面中还有许多 类,名称为 A
& B
。
我想读取一个具有 Sana
innerText 的锚点(element a
)并找到该锚点(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();
您可以尝试使用以下 XPath* 表达式:
var xpath = "//a[.='Sana']/following-sibling::b[1]/span";
string price = htmlDoc.DocumentNode
.SelectSingleNode(xpath)
.InnerText;
Console.WriteLine(price.Text);
XPath 表达式分解:
//a[.='Sana']
: 在文档 的任意位置找到具有内部文本等于'Sana'的/following-sibling::b[1]
:找到第一个兄弟元素<b>
,它位于上一步找到的<a>
个元素之后/span
:找到<span>
元素,它是在上一步中找到的<b>
个元素的子元素
<a>
元素
*) 如果您不熟悉,请阅读 "XPath" 主题。这是来自 MSDN 的一个:https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx