我有一个网页。从那里我想找到所有IMG标签并获得那些IMG标签的SRC。
执行此操作的正则表达式是什么。
一些解释:
我在抓一个网页。除图像外,所有数据都正确显示。 要解决这个问题,哇我有一个想法,找到SRC并替换它:例如
/images/header.jpg
并将其替换为
www.stackoverflow/images/header.jpg
答案 0 :(得分:12)
您不需要正则表达式,您需要解析器。 From this question:
class Program
{
static void Main(string[] args)
{
var web = new HtmlWeb();
var doc = web.Load("http://www.stackoverflow.com");
var nodes = doc.DocumentNode.SelectNodes("//img[@src]");
foreach (var node in nodes)
{
Console.WriteLine(node.src);
}
}
}
答案 1 :(得分:2)
正如所指出的那样,正则表达式并不是一个完美的解决方案,但你通常可以构建一个足以胜任这项工作的解决方案。这就是我要用的:
string newHtml = Regex.Replace(html,
@"(?<=<img\s+[^>]*?src=(?<q>['""]))(?<url>.+?)(?=\k<q>)",
m => "http://www.stackoverflow.com" + m.Value);
它将匹配由单引号或双引号分隔的src属性。
当然,你必须改变lambda / delegate来做你自己的替换逻辑,但你明白了:)
答案 2 :(得分:0)
我必须同意这个解析器人群。为了增加输入复杂性,我选择的层次结构是:
虽然正则表达式可以处理比简单子字符串操作更复杂的输入,但是当面对自由格式标记语言真正多毛的输入可能时,它们往往很容易barf。
XML DOM解析器将是解决此问题的最简单方法。
你可以使用正则表达式(如果你限制输入格式,它们会工作得相当好,比如确保img标签不跨越边界等等),但基于解析器的解决方案的简单性将会破坏正则表达式在多用于任意顺序的DOM标签中的多行属性。
答案 3 :(得分:0)
请记住,源代码可以通过javascript生成,因此您可能无法“只”为img src执行正则表达式替换。
在ruby中使用Mechanize / Hpricot / Nokogiri:
require 'mechanize'
agent = WWW::Mechanize.new
page = agent.get('http://www.google.com')
(page/"img").each { |img| puts img['src'] = "http://www.yahoo.com" + img['src'] }
你完成了!
答案 4 :(得分:0)
/// <summary>
/// Gets the src from an IMG tag
/// Assigns proper values to link and name, if the htmlId matches the pattern
/// </summary>
/// <param name="htmlTd">Html containing IMG tag</param>
/// <param name="link">Contains the src contents</param>
/// <param name="name">Contains img element content</param>
/// <returns>true if success, false otherwise</returns>
public static bool TryGetImgDetails(string htmlTd, out string link, out string name)
{
link = null;
name = null;
string pattern = "<img\\s*src\\s*=\\s*(?:\"(?<link>[^\"]*)\"|(?<link>\\S+))\\s*>(?<name>.*)\\s*</img>";
if (Regex.IsMatch(htmlTd, pattern))
{
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
link = r.Match(htmlTd).Result("${link}");
name = r.Match(htmlTd).Result("${name}");
return true;
}
else
return false;
}