我对如何从HTML页面中提取特定的href
链接感到困惑。当然有大量的例子,但它们似乎涵盖了在页面上只有一个时收集href
,或收集所有链接。
所以我目前使用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">
的所有节点:
var div = html.DocumentNode.SelectNodes("//div[@class='acTrigger']");
接下来的问题是我如何进入<div>
标记并进入<a>
标记,然后检索href
值并存储它。
答案 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();