我遇到使用HtmlAgilityPack读取嵌套HTML节点的问题。 我想读取div标签内的所有字体节点,并希望处理所有p标签。
我的逻辑: 我选择了所有p标签,现在使用foreach循环处理它。然后我从当前项目中选择第一个节点。
问题: 但它接下来就是从html的根目录中选择第一个节点。
我想: 有没有办法从当前项目(节点)中选择标签?
我正在使用这样的HTML代码
<font>State</font>
<div>
<p>
<font>text1</font>
<a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
</p>
<p>
<font>text2</font>
<a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
</p>
<p>
<font>text3</font>
<a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
</p>
<p>
<font>text4</font>
<a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
</p>
<p>
<font>text5</font>
<a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
</p>
</div>
我的C#阅读代码是:
Console.WriteLine("Enter A Url :");
var ur = Console.ReadLine();
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(ur));
request.Method = WebRequestMethods.Http.Get;
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
request.UserAgent = "Foo";
request.Accept = "*/*";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
response.Close();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(responseString);
var topLevelItems = doc.DocumentNode.Descendants().Where(n => n.Name.ToLower() == "p").ToList();
foreach (var item in topLevelItems)
{
var v = item.SelectSingleNode("//font[1]");
if(v!=null)
{
Console.WriteLine("Results : "+v.InnerText);
}
}
提前致谢
答案 0 :(得分:1)
问题在于,由于//
,您在每个循环中搜索整个文档数据,因此foreach似乎“无法正常工作”
替换为
var v = item.SelectSingleNode(".//font[1]");
现在它应该仅检查item
循环
foreach
变量内的数据