現在、これを行うために.Netを使用WebBrowser.Document.Images()
しています。Webrowser
ドキュメントをロードするには が必要です。面倒で、リソースを消費します。
この質問によると、 XPath は正規表現より優れています。
C#でこれを行う方法を知っている人はいますか?
入力文字列が有効な XHTML である場合は、xml として扱うことができ、それを xmldocument にロードし、XPath マジックを実行します :) しかし、常にそうとは限りません。
それ以外の場合は、 HtmlSource からすべての画像リンクを返すこの関数を試すことができます。
public List<Uri> FetchLinksFromSource(string htmlSource)
{
List<Uri> links = new List<Uri>();
string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
foreach (Match m in matchesImgSrc)
{
string href = m.Groups[1].Value;
links.Add(new Uri(href));
}
return links;
}
そして、次のように使用できます。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
using(StreamReader sr = new StreamReader(response.GetResponseStream()))
{
List<Uri> links = FetchLinksFromSource(sr.ReadToEnd());
}
}
HTML 解析の大きな問題は、「整形式」の部分です。あなたはそこにあるがらくた HTML を見てきました - 本当に適切に形成されているのはどれくらいですか? 同様のことをする必要がありました - ドキュメント内のすべてのリンクを解析して (そして私の場合は) 書き換えられたリンクでそれらを更新します。CodePlex でHtml Agility Packを見つけました。それは揺るぎません (そして不正な HTML を処理します)。
ドキュメント内のリンクを反復処理するためのスニペットを次に示します。
HtmlDocument doc = new HtmlDocument();
doc.Load(@"C:\Sample.HTM");
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a/@href");
Content match = null;
// Run only if there are links in the document.
if (linkNodes != null)
{
foreach (HtmlNode linkNode in linkNodes)
{
HtmlAttribute attrib = linkNode.Attributes["href"];
// Do whatever else you need here
}
}
必要なのは画像だけの場合は、正規表現を使用します。このような何かがうまくいくはずです:
Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
有効な xhtml である場合は、次のようにすることができます。
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");