如何从指定的alt标记字符串抓取URL

本文关键字:字符串 抓取 URL alt | 更新日期: 2023-09-27 18:10:47

我想从下面的字符串中提取"http://www.somewebsite.com/wanted.jpg",其中alt设置为"thumbnail",并避免抓取http://www.somewebsite.com/notwanted.jpg:

<span>Some information here
  <div> 
    <img src="http://www.somewebsite.com/notwanted.jpg" width="15" height="15" alt="emoticon"> 
    <img src="http://www.somewebsite.com/wanted.jpg" alt="thumbnail"> 
  </div>
</span>

最简单的方法是什么?

如何从指定的alt标记字符串抓取URL

尽管有关于使用regex解析html的所有警告,但这个c# regex将匹配您想要的url:

(?<=src=")[^"]+(?="[^">]*?alt="thumbnail")

看演示。

在c#中测试:

var myRegex = new Regex("(?<=src='")[^'"]+(?='"[^'">]*?alt='"thumbnail'")");
string resultString = myRegex.Match(s1).Value;
Console.WriteLine(resultString);
输出:

http://www.somewebsite.com/wanted.jpg

  • 后面的(?<=src=")断言前面的是src="
  • [^"]+匹配所有不是"的字符(这就是我们想要的)
  • 前向(?="[^">]*?alt="thumbnail")断言后面是引号,任何不是引号或>后面跟着' alt="thumbnail"的字符

参考

  • 零长度断言的前向和后向
  • 掌握向前看和向后看

假设你的字符串是在htmlText,你可以很容易地加载它与htmllagilitypack,然后执行select:

 HtmlDocument html = new HtmlDocument();
 html.LoadHtml(htmlText);
 var src = html.DocumentNode
     .SelectSingleNode("//img[@alt='thumbnail']").GetAttributeValue("src","");

您可以使用下面的正则表达式来获取img src,其中alt被设置为thumbnail

'"[^'"]*'"(?='s*alt='"thumbnail'")

演示

如果您不希望在输出中出现双引号,您可以尝试下面的正则表达式,

'"'K[^'"]*(?='"'s*alt='"thumbnail'")

演示

解释:

  • '"'K 'K丢弃先前匹配的字符,在我们的例子中,它丢弃先前的"标记。
  • [^'"]*匹配零次或多次双引号以外的字符。
  • (?='"'s*alt='"thumbnail'")正向前看用于检查紧接在"之后的字符串必须是"'s*alt="thumbnail"