如何获得长度为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查询应该是什么样的?
答案 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解析器,而不是自己滚动。