请原谅这个冗长的问题。我编写了一个C#应用程序,它使用WebClient.DownloadFileAsync下拉并将文件保存到客户端计算机。
这适用于pdf文件,其Internet文件夹位置不会更改。但是,我也试图下载一些扩展名为.mp3.zip的音频文件。
如果我输入这些文件的URL,我会直接进入文件下载站点,在那里我会看到一个对话框,可以选择单个文件或单击“下载所有文件”链接。
我想以编程方式下载整个.mp3.zip文件。
“下载所有文件”链接的问题在于,它似乎在其URL中包含随机文件夹命名方案。 例如,http://download.site.org/files/audio_books/ xx /zipfile.mp3.zip; xx是一个不断变化的文件夹位置。
如果音频文件的URL始终具有相同的确切位置,我可以毫无问题地使用WebClient.DownloadFileAsync。 如果我检查链接的元素,我可以手动读取外部HTML,但我发现这个(xx)每月都在变化。
如果我能找到一种方法来成功解析下载链接中的URL,我可以验证当前(xx)文件夹名称是什么,然后正常使用WebClient。
我一直在互联网上阅读大量StackOverFlow文章,例如Grabbing just the URL of an href using HTMLAgilityPack和Image scraper with C#,但没有一条建议似乎返回包含在其中的(xx)文件夹名称外部HTML。
我发现另一篇关于SOF的帖子,这似乎是我问题的最接近的答案,即 Parse inner HTML
这是我尝试过的,但它会抛出NullReferenceException。
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "GET";
req.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US))";
string source;
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
{
source = reader.ReadToEnd();
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(source);
string hrefValue = doc.DocumentNode
.Descendants("div")
.Where(x => x.Attributes["class"].Value == "flRight")
.Select(x => x.Element("a").Attributes["href"].Value)
.FirstOrDefault();
有人可以建议为什么查询class.value的where子句会抛出异常,或者需要什么?我觉得我非常接近解决这个问题,因为如果我检查下载按钮的元素,我可以在div类中看到我需要的东西。
P.S。是唯一可以提出其他问题来编辑原始帖子或限制文本评论框的方法吗?