Как вы разбираете строку HTML для тегов изображений, чтобы получить информацию SRC?
В настоящее время я использую .Net WebBrowser.Document.Images()
для этого. Для загрузки документа требуется Webrowser
. Это беспорядочно и требует ресурсов.
В соответствии с этот вопрос XPath лучше, чем регулярное выражение.
Кто-нибудь знает, как это сделать на С#?
Ответы
Ответ 1
Если ваша строка ввода действительна, XHTML можно рассматривать как xml, загружать ее в xmldocument и делать XPath magic:) Но это не всегда так.
В противном случае вы можете попробовать эту функцию, которая вернет все ссылки на изображение из 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());
}
}
Ответ 2
Большая проблема с любым анализом 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
}
}
Оригинальная запись в блоге
Ответ 3
Если вам нужны только изображения, я бы просто использовал регулярное выражение. Что-то вроде этого должно сделать трюк:
Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);
Ответ 4
Если он действителен xhtml, вы можете сделать это:
XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");