Извлечение фрагмента HTML из документа HTML - PullRequest
2 голосов
/ 08 декабря 2010

Я ищу эффективный способ извлечения html-фрагмента из html-документа.Моя первая реализация этого использовала Html Agility Pack.Это казалось разумным способом решения этой проблемы, пока я не начал выполнять извлечение больших html-документов - производительность была очень плохой для чего-то такого тривиального (полагаю, из-за количества времени, которое требовалось для разбора всего документа).

Может кто-нибудь предложить более эффективные способы достижения моей цели?

Подводя итог:

  1. Для моих целейhtml "фрагмент" определяется как все содержимое внутри тегов <body> html документа

  2. В идеале я хотел бы вернуть содержимое без изменений, если оно не былосодержит <html> или <body> (я предполагаю, что мне передали фрагмент HTML для начала)

  3. У меня есть весь документ HTML, доступный в памяти (в виде строки)Я не буду транслировать его по требованию - поэтому потенциальному решению не нужно беспокоиться об этом.

  4. Производительность имеет решающее значение, поэтому потенциальное решение должно учитывать это.

Пример ввода:

<html>
   <head>
     <title>blah</title>
   </head>
   <body>
    <p>My content</p>
   </body>
</html>

Желаемый вывод:

<p>My content</p>

Было бы приветствоваться решение на C # или VB.NET.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Большинство html не будет XHTML-совместимым.Я бы сделал HTTP запрос на получение и поиск результирующего текста для .Contains("<body>") и .Contains("</body>").Вы можете использовать эти два местоположения в качестве стартовых и конечных индексов для потока чтения.За пределами тега body вам действительно не нужно беспокоиться о соответствии XML.

0 голосов
/ 08 декабря 2010

Если я правильно помню, я делал нечто подобное в прошлом с XPathNavigator. Я думаю, это выглядело примерно так:

        XPathDocument xDoc = new System.Xml.XPath.XPathDocument(new StringReader(content));
        XPathNavigator xNav = xDoc.CreateNavigator();
        XPathNavigator node = xNav.SelectSingleNode("/body");

где вы можете изменить /body на то, что вам нужно искать.

0 голосов
/ 08 декабря 2010

Вы можете взломать его, используя элемент управления WebBrowse и воспользоваться преимуществом свойства webBrowser1.document (хотя и не знаете, чего пытаетесь достичь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...