Как я могу прочитать HTML-документ в C #, если у меня есть источник веб-страницы, хранящийся в строковой переменной? - PullRequest
2 голосов
/ 25 ноября 2011

Я пытался сделать это самостоятельно, но не смог.

У меня есть HTML-документ, и я пытаюсь извлечь адреса для всех изображений в нем в коллекцию ac #, и яЯ не уверен в синтаксисе.Я использую HTMLAgilityPack ... Вот что у меня есть.Пожалуйста, сообщите.

Код HTML следующий:

<div style='padding-left:12px;' id='myWeb123'>
<b>MyWebSite Pics</b>
<br /><br />
<img src="http://myWebSite.com/pics/HHTR_01.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_02.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_03.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_04.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_05.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_06.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_07.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_08.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_09.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<img src="http://myWebSite.com/pics/HHTR_10.jpg" alt='myWebSitePics' title='myWebSitePics' /><br /><br />
<a href="http://www.myWebSite.com/" target="_blank" rel="nofollow">Source</a>
</div>

И код c # следующий:

HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();

document.Load("FileName.html");

// Targets a specific node
HtmlNode someNode = document.GetElementbyId("myWeb123");

//HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//a[@href]");

HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//div[@id='myWeb123']");

if (linkNodes != null)
{
    int count = 0;
    foreach(HtmlNode linkNode in linkNodes)
    {

        string linkTitle = linkNode.GetAttributeValue("src", string.Empty);

        Debug.Print("linkTitle = " + linkTitle);

        if (linkTitle == string.Empty)
        {
            HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
            if (imageNode != null)
            {
                Debug.Print("imageNode = " + imageNode.Attributes.ToString());
            }
        }
        count++;
        Debug.Print("count = " + count);
    }
}

Я пыталсяиспользовать документацию HtmlAgilityPack, но в этом пакете отсутствуют примеры, а информацию о его методах и классах мне очень трудно понять без примеров.

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

попробуйте это, извините, если это не будет доступно для сборки, я переписал наш код в вашу ситуацию

List<string> result = new List<string>();
foreach (HtmlNode link in document.DocumentNode.SelectNodes("//img[@src]"))
{
    HtmlAttribute att = link.Attributes["src"];

    string temp = att.Value;
    string urlValue;
    do
    {
        urlValue = temp;
        temp = HttpUtility.UrlDecode(HttpUtility.HtmlDecode(urlValue));
    } while (temp != urlValue);

    result.Add(temp);
}
2 голосов
/ 25 ноября 2011

Вы можете использовать перегрузку Load, которая принимает TextReader:

document.Load(new StringReader(text));

(я не просмотрел остальную часть кода, но это касается "что мне делатьесли у меня уже есть HTML в строке? "часть.)

0 голосов
/ 25 ноября 2011

Использование Xpath, как это будет дорого, если размер страницы увеличивается.Лучше всего десериализовать HTML-объект.Вам также не нужно использовать ссылку на Htmlagility, которую вы используете.Загрузите HTML с помощью Streamreader и используйте Xmlserializer. Используйте инструмент XSD, сначала для преобразования в xsd, а затем сгенерируйте класс из инструмента xsd

1)
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd /c /language:CS c:\xtest.xml

Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 9.0\VC\xtest.xsd'.

2)
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd /c  xtest.xsd
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\Program Files\Microsoft Visual Studio 9.0\VC\xtest.cs'.

Импортируйте этот класс в ваше решение

html col = new html();
StreamReader reader = new StreamReader("c:\\test.html"); 
XmlSerializer ser = new XmlSerializer(typeof(html));
col = (html)ser.Deserialize(reader); 

Затем объект col будет содержать все src тегов img за один снимок.

0 голосов
/ 25 ноября 2011

В этой строке:

HtmlNodeCollection linkNodes = document.DocumentNode.SelectNodes("//div[@id='myWeb123']");

вы выбираете узел <div>, а не узлы <img> под ним. Попробуйте это, чтобы выбрать эти узлы img:

HtmlNodeCollection linkNodes = document.DocumentNode
     .SelectNodes("//div[@id='myWeb123']/img");

Что касается синтаксиса выбора, он идентичен XPath, который используется в XML. Поэтому ищите XPath, если вы хотите примеры выбора.

В этом случае:

  • ведущий / начинает поиск в корне документа (а не в каком-то "узле")
  • // означает, что следующее совпадение может быть на любой глубине, а не непосредственно под корнем
  • div[@id='myWeb123'] ищет узел <div> с атрибутом 'id', который имеет значение 'myWeb123'
  • /img ищет узел img непосредственно под соответствующим узлом div.
...