从HTML中检索特定的href链接C#
我对如何从HTML页面提取特定的href
链接感到困惑。当然有很多例子,但是它们似乎涵盖了当页面上只有一个页面时收集href
或收集所有链接。从HTML中检索特定的href链接C#
因此,我目前使用HttpWebRequest
,HttpWebResponse
和StreamReader
将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">
是页I负载范围内的节点:
var div = html.DocumentNode.SelectNodes("//div[@class='acTrigger']");
下一个问题是我如何得到<div>
标签内,并进入<a>
标签,然后检索href
价值,并存储它。
我不建议手动解析文本文件,而是建议将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元素。
看看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();