SRC情報を取得するために、イメージタグのHTML文字列をどのように解析しますか?

StackOverflow https://stackoverflow.com/questions/138839

  •  02-07-2019
  •  | 
  •  

質問

現在、これを行うには.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");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top