读取嵌套的 HtmlAgilityPack 问题 html
HtmlAgilityPack Issue in reading nested html
我在使用 HtmlAgilityPack 读取嵌套 HTML 节点时遇到问题。
我想读取 div 标签内的所有字体节点并处理所有 p 标签。
我的逻辑:
我 select 所有 p 标签,现在使用 foreach loop.Then 处理它 我正在 select 当前项目的第一个节点。
问题:
但它似乎是 select 从 html.
的根开始的第一个节点
我想要:
有什么方法可以从当前项目(节点)中获取 select 标签吗?
我有 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);
}
}
提前致谢
问题是,由于 //
,您在每个循环中搜索整个文档数据,因此 foreach 似乎是 'not working'
替换为
var v = item.SelectSingleNode(".//font[1]");
现在它应该只检查 foreach
循环 item
变量内部的数据
我在使用 HtmlAgilityPack 读取嵌套 HTML 节点时遇到问题。 我想读取 div 标签内的所有字体节点并处理所有 p 标签。
我的逻辑: 我 select 所有 p 标签,现在使用 foreach loop.Then 处理它 我正在 select 当前项目的第一个节点。
问题: 但它似乎是 select 从 html.
的根开始的第一个节点我想要: 有什么方法可以从当前项目(节点)中获取 select 标签吗?
我有 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);
}
}
提前致谢
问题是,由于 //
,您在每个循环中搜索整个文档数据,因此 foreach 似乎是 'not working'
替换为
var v = item.SelectSingleNode(".//font[1]");
现在它应该只检查 foreach
循环 item
变量内部的数据