0

我需要从 html 中解析一个 zip 文件的链接。这个 zipfile 的名称每个月都会更改。这是我需要解析的 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”?

4

3 回答 3

1

通过使用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"价值。

它不是比正则表达式更简单吗?

于 2012-04-13T09:33:42.227 回答
0

这是一个原始的正则表达式 - 使用分支重置。
答案在捕获缓冲区 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+ (?:".*?"|'.*?'|[^>]*?)+ 
>
于 2012-04-13T00:46:46.423 回答
0

如果页面上只有一个 ZIP 链接,没问题:

Regex re = new Regex(@"http://nppes\.viva-it\.com/.+\.zip");

re.Match(html).Value // To get the matched URL

这是一个演示。

于 2012-04-12T23:54:48.193 回答