链接示例:
<img src="https://thumbs.com/thumbs/test.mp4/test1.mp4-3.jpg" alt="This is the description i want to get too" >
以及我用来解析html下载源文件中链接的方法:
public List<string> GetLinks(string message)
{
List<string> list = new List<string>();
string txt = message;
foreach (Match item in Regex.Matches(txt, @"(http|ftp|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"))
{
if (item.Value.Contains("thumbs"))
{
int index1 = item.Value.IndexOf("mp4");
string news = ReplaceLastOccurrence(item.Value, "thumbs", "videos");
if (index1 != -1)
{
string result = news.Substring(0, index1 + 3);
if (!list.Contains(result))
{
list.Add(result);
}
}
}
}
return list;
}
但这将只给予我想要得到的链接,在这个例子中也给出链接描述:
这是个考验
然后使用它:
string[] files = Directory.GetFiles(@"D:\Videos\");
foreach (string file in files)
{
foreach(string text in GetLinks(File.ReadAllText(file)))
{
if (!videosLinks.Contains(text))
{
videosLinks.Add(text);
}
}
}
下载链接时:
private async void btnStartDownload_Click(object sender, EventArgs e)
{
if (videosLinks.Count > 0)
{
for (int i = 0; i < videosLinks.Count; i++)
{
string fileName = System.IO.Path.GetFileName(videosLinks[i]);
await DownloadFile(videosLinks[i], @"D:\Videos\videos\" + fileName);
}
}
}
但fileName是每个链接的描述。
3条答案
按热度按时间brc7rcf01#
您可以使用Html Agility Pack,这是一个用C#编写的HTML解析器来读/写DOM,并支持纯XPATH或XSLT。在下面的示例中,您可以在
alt
属性和其他属性中检索描述。实作:
示范:
https://dotnetfiddle.net/nAAZDL
输出:
vxqlmq5t2#
Ibrahim's answer说明了使用适当的HTML解析器可以非常简单地完成这一任务,但我认为,如果您只想从单个页面中提取单个标记,或者不想使用外部依赖项,那么正则表达式并不是不合理的,特别是如果您可以对要匹配的HTML进行某些假设的话。
**请注意,下面的模式和代码仅用于演示目的,并不意味着是一个健壮的、详尽的标记解析器;读者可以根据需要对它们进行扩充,以处理他们在各种各样的Web中可能遇到的各种HTML怪癖和特点。**例如,该模式将不匹配属性值用单引号括起来或根本不带引号的图像标记,如果标记具有多个同名属性,则代码将抛出异常。
我会用一个模式来完成这个任务,这个模式将匹配一个
<img />
标记和它的所有属性对......然后您可以通过查询找到您关心的属性。您可以使用该模式将图像属性提取到
Dictionary<string, string>
中,如下所示...给定
SO74133924.html
......您将使用每个标记的属性字典,如下所示...
...输出此...
nsc4cvqm3#
如果你使用regex的代码,它会占用更多的CPU周期,执行速度很慢。使用一些像angleSharp的库。
我试着用AngleSharp写你的代码。我就是这么做的。