XPath到第一次出现的文本长度为> = 200个字符的元素

时间:2012-03-06 01:11:12

标签: c# html xpath html-agility-pack

如何获得长度为200个或更多字符的内部文本(纯文本,丢弃其他子项)的第一个元素?

我正在尝试创建一个像Embed.ly这样的HTML解析器,我已经设置了一个回退系统,我首先检查og:description,然后我会搜索这个事件,然后才会description元标记。

这是因为大多数甚至包含meta description的网站都会在该标记中描述其网站,而不是当前网页的内容。

示例:

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

我可以使用哪个选择器来获取该HTML片段的 200个字符部分?我不想要更多东西,我不关心它是什么元素(<script><style>除外),只要它是第一个平原文本至少包含200个字符。

XPath查询应该是什么样的?

3 个答案:

答案 0 :(得分:7)

使用

(//*[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称之为 - 名称空间必须是“已注册”这个前缀)

答案 1 :(得分:2)

我的意思是这样的:

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

似乎工作得很好。

答案 2 :(得分:0)

HTML不是XML。您不应该使用XML解析器来解析HTML周期。它们完全是两个不同的东西,当你第一次看到那些格式不正确的XML时,你的解析器会窒息。

您应该找到一个开源HTML解析器,而不是自己滚动。