0

HTML コードから値を取得したいのですが、この C# コードを使用して、HtmlAgilityPackを使用してこの HTML コードから値を取得しています。

住所と電話番号だけ知りたい

<div class="company-info">
    <div id="o-company" class="edit-overlay-section" style="padding-top:5px; width: 400px;">
        <a href="http://www.manta.com/c/mm23df2/us-cellular" class="company-name">
            <h1 class="profile-company_name" itemprop="name">US Cellular</h1>
        </a>
    </div>      
    <div class="addr addr-co-header-gamma" itemprop="address"itemscope=""itemtype="http://schema.org/PostalAddress">
        <em>United States Cellular Corporation</em>
        <div class="company-address">   
        <div itemprop="streetAddress">2401 12th Avenue NW # 104B</div>
            <span class="addressLocality" itemprop="addressLocality">Ardmore</span>,
            <span class="addressRegion" itemprop="addressRegion">OK</span>      
            <span class="addresspostalCode" itemprop="postalCode">73401-1471</span>
        </div>
        <dl class="phone_info"><dt>Phone:</dt>
        <dd class="tel" itemprop="telephone">(580) 490-3333</dd>
...

C# コード:

private HtmlDocument ParseLink(string URL)
{ 
    HtmlDocument hDoc = new HtmlDocument();
    try
    {
        WebClient wClient = new WebClient();

        byte[] bData = wClient.DownloadData(pageurl);

        hDoc.LoadHtml(ASCIIEncoding.ASCII.GetString(bData));
        Response.Write("<table><tr><td>");

        foreach (HtmlNode hNode in hDoc.DocumentNode.SelectNodes("//div[@itemprop='company-address']"))
        {
            Response.Write(hNode.InnerText.ToString());
        }
        Response.Write("</tr></td><td>");

        foreach (HtmlNode hNode in hDoc.DocumentNode.SelectNodes("//span[@itemprop='addressLocality']"))
        {

            Response.Write(hNode.InnerText.ToString());
        }
        Response.Write("</tr></td><td>");   

        foreach (HtmlNode hNode in hDoc.DocumentNode.SelectNodes("//span[@itemprop='addressRegion']"))
        {
            Response.Write(hNode.InnerText.ToString());
        }

        Response.Write("</tr></td><td>");

        foreach (HtmlNode hNode in hDoc.DocumentNode.SelectNodes("//span[@itemprop='postalCode']"))
        {
            Response.Write(hNode.InnerText.ToString());
        }

        Response.Write("</tr></td><td>"); 

        foreach (HtmlNode hNode in hDoc.DocumentNode.SelectNodes("//dd[@itemprop='telephone']"))
        {
            Response.Write(hNode.InnerText.ToString());
        }
        Response.Write("</td>");
        Response.Write("</tr></table>");

    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
        hDoc.LoadHtml("");
    }

    return hDoc;
}

しかし、このコードをコンパイルすると、次のエラーが発生します。

"Object reference not set to an instance of an object"

私を助けてくれる人はいますか?ありがとうございました。

4

1 に答える 1

0

取得している例外に関する詳細情報を提供する必要があります (例外がスローされた行など)。

このSelectNodesメソッドは、 XPathnull式に一致する項目が見つからない場合に戻ります。つまり、ノードを反復処理する前に、戻り値があるかどうかを確認する必要があります。何かのようなもの:null

var companyAddressNodes = hDoc.DocumentNode.SelectNodes("//div[@itemprop='company-address']");

if (companyAddressNodes == null) {
    //Throw properly exception here, log the error, or do anything you want...
    throw new Exception("No company address node found. Perhaps the page layout changed?");
}

foreach (HtmlNode hNode in )
{
    Response.Write(hNode.InnerText.ToString());
}
于 2012-09-18T17:53:39.370 に答える