使用HTMLAgilityPack </p>从Node的子项中选择所有<p>

时间:2010-01-21 17:24:05

标签: c# screen-scraping html-agility-pack

我有以下代码用于获取HTML页面。使网址绝对,然后使链接rel nofollow并在新窗口/选项卡中打开。我的问题是将属性添加到<a> s。

        string url = "http://www.mysite.com/";
        string strResult = "";            

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        if ((request.HaveResponse) && (response.StatusCode == HttpStatusCode.OK)) {
            using (StreamReader sr = new StreamReader(response.GetResponseStream())) {
                strResult = sr.ReadToEnd();
                sr.Close();
            }
        }

        HtmlDocument ContentHTML = new HtmlDocument();
        ContentHTML.LoadHtml(strResult);
        HtmlNode ContentNode = ContentHTML.GetElementbyId("content");

        foreach (HtmlNode node in ContentNode.SelectNodes("/a")) {
            node.Attributes.Append("rel", "nofollow");
            node.Attributes.Append("target", "_blank");
        }

        return ContentNode.WriteTo();

谁能看到我做错了什么?在这里试了一会儿,没有运气。此代码出现,ContentNode.SelectNodes(“/ a”)未设置为对象的实例。我想尝试将蒸汽设置为0?

干杯, 丹尼斯

1 个答案:

答案 0 :(得分:4)

ContentNode是否为空?您可能需要使用查询"//*[@id='content']"选择单个。

有关信息,"/a"表示根处的所有锚点"descendant::a"有效吗?还有HtmlElement.GetElementsByTagName可能更容易 - 即yourElement.GetElementsByTagName("a")