2017-02-10 11 views
0
私はC#でHtmlの敏捷性パックを使用して、各 <li>テキストとリンク値を取得したいと私はそれぞれ <li>リンク ABCのWebページから<div><h1>の値を必要とし、さらに

でのNULLの例外.COM/one.html & 私は、実行時にこのエラーを取得していC#とHtmlの敏捷性パック:ネストされたforeachループ

abc.com/three.html abc.com/two.html:

System.ArgumentNullException:値にnullを設定することはできません。

[ArgumentNullException: Value cannot be null. Parameter name: second] 
System.Linq.Enumerable.Zip(IEnumerable`1 first, IEnumerable`1 second, Func`3 resultSelector) +2619657 
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 
System.Web.UI.Control.OnLoad(EventArgs e) +95 
System.Web.UI.Control.LoadRecursive() +59 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +678 

HTML

<ul> 
    <li>ListOne<a href="abc.com/one.html"></a></li> 
    <li>ListTwo<a href="abc.com/two.html"></a></li> 
    <li>ListThree<a href="abc.com/three.html"></a></li> 
</ul> 

C#

string Url = "WebAddress1"; 
HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(Url); 

foreach (var item in doc.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/ul[1]/li").Zip(doc.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/ul[1]/li/a"), (a, b) => new { A = a, B = b })) 
{ 
    var a = item.A; 
    var b = item.B; 
    ListBox1.Items.Add(a.InnerText); 
    ListBox2.Items.Add(b.GetAttributeValue("href", "")); 

    string Url2 = "WebAddress1" + b.GetAttributeValue("href", ""); 
    HtmlWeb web2 = new HtmlWeb(); 
    HtmlDocument doc2 = web2.Load(Url2); 
    foreach (var item2 in doc2.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/article/div[4]/div[1]").Zip(doc2.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/article/h1"), (c, d) => new { C = c, D = d })) 
    { 
     var c = item2.C; 
     var d = item2.D; 
     ListBox3.Items.Add(c.InnerText); 
     ListBox4.Items.Add(d.InnerText); 
    } 
} 

*注:このコードは、Webページの一部の要素のたxPathで動作します。abc.com/one .html,abc.com/two.htmlおよびabc.com/three.html

+0

これをデバッグしようとしましたか?例外は、ZipメソッドのパラメータがNULLであり、サポートされていないことを示します。 –

+0

'doc2.DocumentNode.SelectNodes(" // * @ id = \ "pageContent \"]/article/h1 ")'指定された 'id'で' article'要素の 'h1'要素を抽出します。 't one。 –

+0

2番目の 'foreach'ループを最初の' foreach'ループの外側に置き、 'Url2'で同じリンクを提供していれば、その作業を行います。例外は、ネストされた 'foreach'ループを使用する場合にのみ発生します。 また、上記のネストされたコードは、ナビゲーションバーのxPath – Shady

答えて

0

解決方法が見つかりました。一部のxPathはヌル値を返します。だから私はもう1行のコードを増やすだけです。

string Url = "WebAddress1"; 
HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(Url); 
if (doc.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/ul[1‌​]/li") != null && doc.DocumentNode.SelectNodes("//*[@id=\"pageContent\"]/ul[1]‌​/li/a") != null)//Added this line 
{ foreach (...) { // } } 
関連する問題