使用正则表达式从 HTML 字符串分析 HREF
本文关键字:HREF 字符串 HTML 正则表达式 | 更新日期: 2023-09-27 18:31:09
我需要解析一个指向 html 的 zip 文件的链接。 此压缩文件的名称每个月都会更改。 这是我需要解析的 HTML 片段:
<a href="http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip">
我需要获取的字符串是"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip",以便我可以使用WebClient下载文件。 该 zip 文件 URL 中每月保持不变的唯一部分是"http://nppes.viva-it.com/"。 有没有办法使用正则表达式从 HTML 中解析完整的 URL"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip"?
通过使用
HtmlAgilityPack:
var html = "<a href='"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip'">";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var anchor = doc.DocumentNode.SelectSingleNode("//a");
var href = anchor.GetAttributeValue("href", null);
现在href
变量保存"http://nppes.viva-it.com/NPPES_Data_Dissemination_Mar_2012.zip"
值。
它不是比正则表达式更简单吗?
如果页面上只有一个 ZIP 链接,没问题:
Regex re = new Regex(@"http://nppes'.viva-it'.com/.+'.zip");
re.Match(html).Value // To get the matched URL
这是一个演示。
这是一个原始正则表达式 - 使用分支重置。
答案在捕获缓冲区 2 中。
<a
(?='s)
(?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<='s)
href 's*=
(?|
(?> 's* (['"]) 's* (http://nppes'.viva-it'.com/ (?:(?!'g{-2}) .)+ '.zip ) 's* 'g{-2} )
| (?> (?!'s*['"]) 's* () (http://nppes'.viva-it'.com/ [^'s>]* '.zip ) (?='s|>) )
)
)
's+ (?:".*?"|'.*?'|[^>]*?)+
>
不确定 C# 是否可以执行分支重置。如果不能,则此变体有效。
答案始终是捕获缓冲区 2 与捕获缓冲区 3 匹配的结果。
<a
(?='s)
(?= (?:[^>"']|"[^"]*"|'[^']*')*? (?<='s)
href 's*=
(?:
(?> 's* (['"]) 's* (http://nppes'.viva-it'.com/ (?:(?!'g{-2}) .)+ '.zip ) 's* 'g{-2} )
| (?> (?!'s*['"]) 's* (http://nppes'.viva-it'.com/ [^'s>]* '.zip ) (?='s|>) )
)
)
's+ (?:".*?"|'.*?'|[^>]*?)+
>