从HTML中检索特定的href链接 C#

4

我有点困惑如何从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>

基本上,我正在尝试创建一个文本爬取程序/采集器来检索链接。目前我正在处理的页面从一个主页开始,有一个导航栏旁边的链接。导航栏中的这些链接是我想要获取的,以便我可以下载每个页面的内容,然后检索我要查找的实际数据。所以这就是一个大型的解析任务,而我很拙于解析。如果我能够弄清楚如何解析这个第一个主页面,那么我将能够解析子页面。

我不希望任何人只是给我答案,我只想知道在这种情况下解析的好方法是什么。也就是说,如何缩小解析范围以仅限于这些标签,然后什么是一种良好的动态存储这些链接的方法,以便我以后可以访问它们?我希望这讲得清楚。

编辑:现在我正在尝试使用HtmlAgilityPack,但感到非常困惑。据我所知,这将检索出我加载的页面中所有的 <div class="acTrigger"> 节点:

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

下一个问题是如何进入<div>标签并进入<a>标签,然后检索href值并存储它。
2个回答

0

0

看一下Selenium Web Driver库。然后根据需要获取URL。

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接