从以下代码中获取'href'值?

时间:2010-11-23 17:35:09

标签: c#-4.0

我需要从C#中获取HTML中的href值:

<td class="tl"><a href="http://facebook.com/"target="_blank"><img src="images/poput_icon.png"/></a>

有人能告诉我怎么做吗? RegEx是最好的方法吗?我需要从包含100个链接的页面中收集这些内容,但它们看起来都像上面的代码。我想忽略页面上的其他href。

提前致谢。

2 个答案:

答案 0 :(得分:1)

首先,不要使用正则表达式来解析XML。请参阅此处more detailed information on the whys and wherefores

其次,您可以使用LINQ-to-XML来实现此目的。假设您已将XML片段加载到XDocument实例中(因此,td是根元素),您可以执行以下操作:

var href = doc
    .Element("td")
    .Element("a")
    .Attribute("href")
    .Value;

答案 1 :(得分:1)

我会用正则表达式来做,是的。那么你想在表格单元格开头的img标签周围的锚标签内找到值吗?

这是用于创建Regex对象的C#代码,该对象将匹配此类链接,然后使用它,其中document是包含要搜索的整个文档的String:

Regex linkscraper = new Regex(@"<\s*td[^>]*>\s*<\s*a[^>]*href\s*=\s*""(?<link>[^""]*)""[^>]>\s*<\s*img[^>]*>\s*<\s*\/a\s*>");
MatchCollection links = linkscraper.matches(document);

匹配链接位于Links集合中的Match个对象中,组名称为“link”。

前导@将其转换为原始字符串:所有\直接传递,而不是被处理,因此我们不会强制它们加倍以允许正则表达式\行为。由于引号无法使用原始字符串中的\“转义,因此它们将以”“转义。

这是一个相当复杂的正则表达式。打破它:

  • 它散落着一堆\s*元素,大致意思是“任何空格,或者没有”。它使您的linkscraper表达式忽略HTML允许的间距变化。
  • [^>]个字符类匹配任何不是“&gt;”的字符;重复它(尾随*)表示“我们不关心的标签内的其他东西”。排除是为了防止正则表达式变得混乱并越过标签。正则表达式是贪婪的,所以如果我们不这样做,它会快速地匹配文档中第一个标记的第一部分一直到最后一个标记的结尾。
  • 解释了所有这些内容后,理解起来相对简单:
    • TD标签(可能有也可能没有空格或属性),紧接着是(对于“立即”允许任意空格的定义)
    • 一个A标签,其中href被捕获到名为“link”的捕获组中。 [^""][^"]的转义形式,匹配所有非引号字符。我们不关心标签的其余部分。
    • 一个img标签,可以包含任何想要的内容。
    • / a结束标记。

如果您对要尝试从中提取链接的文档的确切格式有更多了解,则可以收紧此正则表达式。具体来说,[^>]*组,“匹配零个或多个不是&gt;的字符”用于允许标记包含他们想要的任何内容的块应该可以用更特定于实际文档的子表达式替换。这将捕获<TD><A href=...><IMG></a>形式的任何内容,它可能匹配或不匹配超出您想要的范围。