【问题标题】:Retrieving certain href links from html C#从 html C# 中检索某些 href 链接
【发布时间】:2025-12-10 04:45:01
【问题描述】:

我对如何从 HTML 页面中提取特定的 href 链接有点困惑。当然有很多示例,但它们似乎涵盖了在页面上只有一个时收集 href 或收集所有链接。

因此,我目前使用 HttpWebRequestHttpWebResponseStreamReader 将 HTML 文档推送到文本文件中。

这是我正在使用的小示例,它只是下载我选择的 URL 并将其保存到文本文件中。

protected void btnURL_Click(object sender, EventArgs e)
{
    string url = txtboxURL.Text;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());
    //lblResponse.Text = sr.ReadToEnd();
    string urldata = sr.ReadToEnd();

    if (File.Exists(@"C:\Temp\test.txt"))
    {
        File.Delete(@"C:\Temp\test.txt");
    }
    File.Create(@"C:\Temp\test.txt").Close();
    File.WriteAllText(@"C:\Temp\test.txt", urldata);


    sr.Close();
    response.Close();
} 

我可以在整个文本文件中搜索href,但是每个页面上都有很多,而我正在寻找的那些被划分在<nav>标签中,然后它们都在<div> 同一个类的标签,大概是这样的:

<nav class="deptVertNav>
        <div class="acTrigger">
                <a href="*this is what I need to get*" ....
                ....
                </a>
        </div>
        <div class="acTrigger">
                <a href="*etc*" ....
                ....
                </a>
        </div>
        <div class="acTrigger">
                <a href="*etc*" ....
                ....
                </a>
        </div>
</nav>

基本上我正在尝试创建一个文本爬虫/抓取工具来检索链接。我正在使用的当前页面从主页开始,导航栏的侧面有链接。导航栏中的那些链接是我想要访问的,所以我可以下载每个页面的内容,然后检索我正在寻找的真实数据。所以这只是一项大的解析工作,我在解析方面很糟糕。如果我能弄清楚如何解析第一个主页面,那么我将能够解析子页面。

我不想让任何人只给我答案,我只想知道在这种情况下有什么好的解析方法。 IE 如何将解析范围缩小到仅这些标签,然后有什么好的动态方法来存储这些链接以便我以后可以访问它们?我希望这是有道理的。

编辑:嗯,我现在尝试使用 HtmlAgilityPack,但很困惑。据我所知,这将检索我加载的页面中的所有 &lt;div class="acTrigger"&gt; 节点:

var div = html.DocumentNode.SelectNodes("//div[@class='acTrigger']");

下一个问题是我如何进入&lt;div&gt; 标记和&lt;a&gt; 标记,然后检索href 值并存储它。

【问题讨论】:

    标签: c# html parsing web-crawler href


    【解决方案1】:

    我建议不要尝试手动解析文本文件,而是将 HTML 放在 HtmlDocument 控件 (https://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument(v=vs.110).aspx) 或 WebBrowser 控件 (https://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser(v=vs.110).aspx) 中。这允许您访问已解析的元素。从那里您可以轻松找到所有具有适当类的 DIV 元素,然后是其中的 A 元素。

    【讨论】:

      【解决方案2】:

      看看Selenium Web Driver 库。然后根据需要抓取网址。

      IWebElement anchorUrl1 = driver.FindElement(By.XPath("//nav[@class='deptVertNav']/div[1]/a[1]"));
      string urlText1 = anchorUrl1.Text;
      IWebElement anchorUrl2 = driver.FindElement(By.XPath("//nav[@class='deptVertNav']/div[2]/a[1]"));
      string urlText2 = anchorUrl2.Text;
      

      如果您只想点击它们,那么:

      driver.FindElement(By.XPath("//nav[@class='deptVertNav']/div[1]/a[1]")).Click();
      

      【讨论】: