Я думаю, что ваш лучший вариант - использовать легкий анализатор HTML ( что-то вроде Majestic 12 , который, по моим тестам, примерно на 50-100% быстрее, чем HTML Agility Pack), и обрабатывать только узлыкоторый вас интересует (что-нибудь между <body>
и </body>
).Majestic 12 немного сложнее в использовании, чем HTML Agility Pack, но если вы ищете производительность, то она определенно вам поможет!
Это поможет вам приблизиться к тому, о чем вы просите, но вывсе равно придется скачать всю страницу.Я не думаю, что есть способ обойти это.То, на что вы сэкономите , фактически создаст DOM-узлы для всего остального контента (кроме тела).Вам придется их анализировать, но вы можете пропустить все содержимое узла, который вы не заинтересованы в обработке.
Вот хороший пример использования синтаксического анализатора M12.
У меня нет готового примера того, как захватить тело, но у меня есть один из способов, как захватить только ссылки, и с небольшими изменениями он попадет туда.Вот примерная версия:
GrabBody(ParserTools.OpenM12Parser(_response.BodyBytes));
Вам необходимо открыть анализатор M12 (в примере проекта, поставляемого с M12, есть комментарии, подробно описывающие, как все эти параметры влияют на производительность, И ОНИ ДЕЛАЮТ !!!):
public static HTMLparser OpenM12Parser(byte[] buffer)
{
HTMLparser parser = new HTMLparser();
parser.SetChunkHashMode(false);
parser.bKeepRawHTML = false;
parser.bDecodeEntities = true;
parser.bDecodeMiniEntities = true;
if (!parser.bDecodeEntities && parser.bDecodeMiniEntities)
parser.InitMiniEntities();
parser.bAutoExtractBetweenTagsOnly = true;
parser.bAutoKeepScripts = true;
parser.bAutoMarkClosedTagsWithParamsAsOpen = true;
parser.CleanUp();
parser.Init(buffer);
return parser;
}
Разбор тела:
public void GrabBody(HTMLparser parser)
{
// parser will return us tokens called HTMLchunk -- warning DO NOT destroy it until end of parsing
// because HTMLparser re-uses this object
HTMLchunk chunk = null;
// we parse until returned oChunk is null indicating we reached end of parsing
while ((chunk = parser.ParseNext()) != null)
{
switch (chunk.oType)
{
// matched open tag, ie <a href="">
case HTMLchunkType.OpenTag:
if (chunk.sTag == "body")
{
// Start generating the DOM node (as shown in the previous example link)
}
break;
// matched close tag, ie </a>
case HTMLchunkType.CloseTag:
break;
// matched normal text
case HTMLchunkType.Text:
break;
// matched HTML comment, that's stuff between <!-- and -->
case HTMLchunkType.Comment:
break;
};
}
}
Сгенерировать узлы DOM сложно, но класс Majestic12ToXml поможет вам сделать это. Как я уже сказал,это ни в коем случае не эквивалентно 3-строчкам, которые вы видели с пакетом гибкости HTML, но как только вы получите инструменты, вы сможете получить именно то, что вам нужно, за небольшую долю затрат на производительность и, возможно, столько же строк кода..