我需要从C#中获取HTML中的href值:
<td class="tl"><a href="http://facebook.com/"target="_blank"><img src="images/poput_icon.png"/></a>
有人能告诉我怎么做吗? RegEx是最好的方法吗?我需要从包含100个链接的页面中收集这些内容,但它们看起来都像上面的代码。我想忽略页面上的其他href。
提前致谢。
麦
答案 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;”的字符;重复它(尾随*)表示“我们不关心的标签内的其他东西”。排除是为了防止正则表达式变得混乱并越过标签。正则表达式是贪婪的,所以如果我们不这样做,它会快速地匹配文档中第一个标记的第一部分一直到最后一个标记的结尾。[^""]
是[^"]
的转义形式,匹配所有非引号字符。我们不关心标签的其余部分。如果您对要尝试从中提取链接的文档的确切格式有更多了解,则可以收紧此正则表达式。具体来说,[^>]*
组,“匹配零个或多个不是&gt;的字符”用于允许标记包含他们想要的任何内容的块应该可以用更特定于实际文档的子表达式替换。这将捕获<TD><A href=...><IMG></a>
形式的任何内容,它可能匹配或不匹配超出您想要的范围。