XPath для первого появления элемента с длиной текста> = 200 символов

c# html html-agility-pack xpath

Вопрос

Как получить первый элемент с внутренним текстом (обычный текст, отбрасывание других детей) длиной 200 или более символов?

Я пытаюсь создать парсер HTML, например Embed.ly, и я создал систему резервных копий, где сначала проверяю og:description , затем я буду искать это событие и только затем для метатега description .

Это связано с тем, что большинство сайтов, которые даже содержат meta description описывают свой сайт в этом теге, а не содержимое текущей страницы.

Пример:

<html>
    <body>
        <div>some characters
            <p>200 characters <span>some more stuff</span></p>
        </div>
    </body>
</html>

Какой селектор можно использовать для получения 200-символьной части этого фрагмента HTML? Я тоже не хочу, чтобы какой-то другой материал , мне все равно, какой он есть (кроме <script> или <style> ), если это первый простой текст, содержащий не менее 200 символов.

Каким должен быть запрос XPath?

Принятый ответ

Использование :

(//*[not(self::script or self::style)]/text()[string-length() > 200])[1]

Примечание . Если документ является документом XHTML (а это означает, что все элементы находятся в пространстве имен xhrml), указанное выше выражение должно быть указано как:

(//*[not(self::x:script or self::x:style)]/text()[string-length() > 200])[1]

где префикс "x:" должен быть привязан к пространству имен XHTML - "http://www.w3.org/1999/xhtml" (или как многие XPath API называют это - пространство имен должно быть « зарегистрировано » с помощью этого префикс)


Популярные ответы

Я имел в виду нечто подобное:

root.SelectNodes("html/body/.//*[(name() !='script') and (name()!='style')]/text()[string-length() > 200]")

Кажется, работает очень хорошо.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему