拥有网页的HTML,获取通讯页面上可见文本的最简单策略是什么?我想到了<a>..</a>
和<p>...</p>
之间的所有内容,但效果不佳。
请记住,这是针对学校项目的,我不允许使用任何类型的外部库(我的想法是必须自己进行解析)。此外,这将在下载页面的HTML时实现,也就是说,我不能假设我已经下载了整个HTML页面。它必须在下载HTML时显示提取的可见单词。
此外,它不一定适用于所有情况,只是为了满足大多数时间。
答案 0 :(得分:3)
我不允许使用任何类型的外部库
这对“软件架构”课程的要求很低。解析HTML 非常困难在课程练习的范围之外正确地做 - 当然方式。你提出的涉及正则表达式黑客攻击的任何天真的方法都会在常见的网页上严重崩溃。
在这里做的软件架构正确的事情是使用已经解决了解析HTML问题的外部库(例如,对于.NET,HTML Agility Pack),然后迭代它生成的文档对象对于不在“隐身”元素中的文本节点,如<script>
。
如果从网页抓取数据的任务是您自己选择的,为了展示其他一些原则,那么我建议您选择一个不同的挑战,一个可以有效解决的挑战。例如,只需将输入从HTML更改为XML,就可以使用内置的XML解析器。
答案 1 :(得分:1)
字面上所有可见的文字听起来像是对学校项目的大问题,因为它不仅取决于HTML本身,还取决于任何页内或外部样式。一种解决方案是简单地从输入中删除HTML标记,但这并不像您所说的那样严格满足您的要求。
假设足够接近足够好,您可以进行第一次传递以去除您知道不可见的整个元素的内容(例如script
,style
),以及第二遍,以删除剩余的标签。
答案 2 :(得分:0)
我会考虑编写正则表达式来删除所有的html标签,你应该留下你想要的文字。这可以在Javascript中完成,不需要任何特殊内容。
答案 3 :(得分:0)
我知道这不是你要求的,但可以使用正则表达式来完成:
//javascript code
//should (could) work in C# (needs escaping for quotes) :
h = h.replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,'');
此RegExp将删除HTML标记,但请注意,您首先需要删除脚本,链接,样式,...标记。
如果您决定采用这种方式,我可以帮助您使用所需的正则表达式。
答案 4 :(得分:0)
HTML 5包含how to build a parser的详细说明。它可能比您正在寻找的更复杂,但它是推荐的方式。
答案 5 :(得分:0)
您需要解析文本的每个DOM元素,然后检测该DOM元素是否可见(el.style.display == 'block'
或'inline'
),然后您需要检测该元素是否是以这样的方式定位,使得它不在页面的可视区域之外。然后,您需要检测每个元素的z-index
和每个元素的背景,以便检测是否有任何重叠隐藏了某些文本。
基本上,这在一个月的时间内是不可能的。