从html C#中检索某些href链接

时间:2017-02-23 17:28:48

标签: c# html parsing web-crawler href

我对如何从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,这让人很困惑。据我所知,这将检索我加载的页面中<div class="acTrigger">的所有节点:

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

接下来的问题是我如何进入<div>标记并进入<a>标记,然后检索href值并存储它。

2 个答案:

答案 0 :(得分:0)

我建议不要尝试手动解析文本文件,而是将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元素。

答案 1 :(得分:0)

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