使用 html 敏捷包获取 div 信息
get div information with html agility pack
你好我想在一个html页面上处理信息,用下面的代码我可以得到信息
订单是这样收到的
new-link-1
new-link-2
new-link-3
但是到了new-link-no-title部分,就打散了,变成了
new-link-3
new-link-1
new-link-2
并且在程序结束时它因 ArgumentOutOfRangeException 错误而停止
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = await web.LoadFromWebAsync(Link);
foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex())
{
var x = item.SelectNodes("//div[@class='new-link-2']")[index].InnerText;
var xx = item.SelectNodes("//div[@class='new-link-3']//a")[index];
MessageBox.Show(item.InnerText);
MessageBox.Show(x);
MessageBox.Show(xx.Attributes["href"].Value);
}
和html
<div id="new-link">
<ul>
<li>
<div class="new-link-1"> فصل پنجم</div>
<div class="new-link-2"> تکمیل شده</div>
<div class="new-link-3">
<a href="http://dlldsubtitle.info/Serial/1397/Silicon.Valley.S05_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
</div>
</li>
<li class="new-link-no-titel">
<div class="new-link-1"> فصل ششم</div>
<div class="new-link-2"> درحال پخش</div>
<div class="new-link-3">
<i class="fa fa-arrow-down" title=حال پخش">
</i>
</div>
</li>
<li>
<divs="new-link-1"> قسمت 1</div>
<div class="new-link-2"> پخش شده</div>
<div class="new-link-3">
<a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E01_WorldSubtitle.zip">دانلودلینک مستقیم</a>
</div>
</li>
<li>
<div class="new-link-1"> قسمت 7</div>
<div class="new-link-2"> پخش شده</div>
<div class="new-link-3">
<a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E07_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
</div>
</li>
</ul>
</div>
这就是我发现您的代码存在的问题。
foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex()) //-> Gives 4 indecies for index
item.SelectNodes("//div[@class='new-link-2']") // -> This produces 4 nodes
item.SelectNodes("//div[@class='new-link-3']//a") // -> This produces only 3 nodes
问题:
当您使用 //div 搜索时,您会搜索所有节点.. 而不仅仅是您当前所在的项目。
Solution/Suggestion: 您当前的代码从根节点开始搜索所有 a 元素。如果您用点作为前缀,则只会考虑当前节点的后代。 (Excerpt from here)
foreach (HtmlNode item in doc.DocumentNode.SelectNodes(".//li"))
{
try
{
var x0 = item.SelectSingleNode(".//div[@class='new-link-1']");
var x = item.SelectSingleNode(".//div[@class='new-link-2']");
var xx = item.SelectSingleNode(".//a");
MessageBox.Show(x0.InnerText);
MessageBox.Show(x.InnerText);
if (xx.Attributes["href"] != null)
MessageBox.Show(xx.Attributes["href"].Value);
}
catch { }
}
你好我想在一个html页面上处理信息,用下面的代码我可以得到信息 订单是这样收到的
new-link-1
new-link-2
new-link-3
但是到了new-link-no-title部分,就打散了,变成了
new-link-3
new-link-1
new-link-2
并且在程序结束时它因 ArgumentOutOfRangeException 错误而停止
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = await web.LoadFromWebAsync(Link);
foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex())
{
var x = item.SelectNodes("//div[@class='new-link-2']")[index].InnerText;
var xx = item.SelectNodes("//div[@class='new-link-3']//a")[index];
MessageBox.Show(item.InnerText);
MessageBox.Show(x);
MessageBox.Show(xx.Attributes["href"].Value);
}
和html
<div id="new-link">
<ul>
<li>
<div class="new-link-1"> فصل پنجم</div>
<div class="new-link-2"> تکمیل شده</div>
<div class="new-link-3">
<a href="http://dlldsubtitle.info/Serial/1397/Silicon.Valley.S05_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
</div>
</li>
<li class="new-link-no-titel">
<div class="new-link-1"> فصل ششم</div>
<div class="new-link-2"> درحال پخش</div>
<div class="new-link-3">
<i class="fa fa-arrow-down" title=حال پخش">
</i>
</div>
</li>
<li>
<divs="new-link-1"> قسمت 1</div>
<div class="new-link-2"> پخش شده</div>
<div class="new-link-3">
<a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E01_WorldSubtitle.zip">دانلودلینک مستقیم</a>
</div>
</li>
<li>
<div class="new-link-1"> قسمت 7</div>
<div class="new-link-2"> پخش شده</div>
<div class="new-link-3">
<a href="http://dl.worldsubtitle.info/Serial/1398/Silicon.Valley.S06E07_WorldSubtitle.zip">دانلود با لینک مستقیم</a>
</div>
</li>
</ul>
</div>
这就是我发现您的代码存在的问题。
foreach ((var item, int index) in doc.DocumentNode.SelectNodes(".//div[@class='new-link-1']").WithIndex()) //-> Gives 4 indecies for index
item.SelectNodes("//div[@class='new-link-2']") // -> This produces 4 nodes
item.SelectNodes("//div[@class='new-link-3']//a") // -> This produces only 3 nodes
问题: 当您使用 //div 搜索时,您会搜索所有节点.. 而不仅仅是您当前所在的项目。
Solution/Suggestion: 您当前的代码从根节点开始搜索所有 a 元素。如果您用点作为前缀,则只会考虑当前节点的后代。 (Excerpt from here)
foreach (HtmlNode item in doc.DocumentNode.SelectNodes(".//li"))
{
try
{
var x0 = item.SelectSingleNode(".//div[@class='new-link-1']");
var x = item.SelectSingleNode(".//div[@class='new-link-2']");
var xx = item.SelectSingleNode(".//a");
MessageBox.Show(x0.InnerText);
MessageBox.Show(x.InnerText);
if (xx.Attributes["href"] != null)
MessageBox.Show(xx.Attributes["href"].Value);
}
catch { }
}