Как вы анализируете HTML-строку для тегов изображения, чтобы получить информацию SRC? - PullRequest
25 голосов
/ 26 сентября 2008

В настоящее время я использую .Net WebBrowser.Document.Images() для этого. Требуется Webrowser для загрузки документа. Это грязно и занимает ресурсы.

Согласно этот вопрос XPath лучше, чем регулярное выражение в этом.

Кто-нибудь знает, как это сделать в C #?

Ответы [ 4 ]

53 голосов
/ 26 сентября 2008

Если ваша входная строка является допустимым 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());
    }
}
11 голосов
/ 27 сентября 2008

Большой проблемой при любом разборе HTML является «правильно сформированная» часть. Вы видели дерьмо HTML там - насколько он действительно хорошо сформирован? Мне нужно было сделать нечто подобное - разобрать все ссылки в документе (и в моем случае) обновить их переписанной ссылкой. Я обнаружил Html Agility Pack в CodePlex. Это качает (и обрабатывает искаженный 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
    }
}

Оригинальное сообщение в блоге

4 голосов
/ 26 сентября 2008

Если вам нужны только изображения, я бы использовал регулярное выражение. Нечто подобное должно сработать:

Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
0 голосов
/ 26 сентября 2008

Если это правильный xhtml, вы можете сделать это:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...