相关问题之前:
html xpath:提取与多个标签混合的文本?
html xpath:提取文本时有选择地避免使用标签
//对不起我的英语
我是撰写Web Crawler的初学者,我正在尝试从XPath的网页(以中文)提取主要内容(尽管我了解到有一些算法taditional和Machine Learning方法来提取Web Main内容),我是编写XPath规则的初学者。
我面对一个包含复杂标签的文本的网页,我将其总结如下,其中字符(例如a,a2)仅表示文本,'...'意味着更多的标签,甚至没有文本嵌套我想获得" aa2bb2cdefghijklmnop"
...
<div id="artibody" class="art_context">
<div align="center">...</div>
<div align="center"><font>A</font>A2</div>
<div align="left"><br><br><strong>B</strong>B2</div>
<div align="left">
<p>C<a>D</a>E</p>
<p>F<a>G</a>H<a>I</a>J</p>K
</div>
<div align="center">...</div>
<div align="center"><font>L</font></div>
<p>M</p><!--M contains only text luckly-->
<p>N</p>
<p>O</p>
<p>P<span>...</span><div class="shareBox">...</div>
</p>
<span id="arctTailMark"></span>
<script>
var page_navigation = document.getElementById('page_navigation');
...
</script>
<div style="padding:10px 0 30px 0">...</div>
</div>
感谢您以前的问题,我写了一条规则
'string(//div [@class = " art_context "])'
我在没有标签的情况下以纯文本获取所有内容,但也提取了<script>
中的JS代码。我尝试了以下内容,但似乎没有帮助。
'string(//div [@class = " art_context "而不是(self :: script)])'
以下一个获得" r n"。
'//div [@class = " art_context "而不是(self :: :: script)]/text()'
这是我的问题:
1.如何编写XPATH规则以满足我的需求:在Div [@ID =" Artibody"]中提取内容,除了<script>
2.问题1的规则简单而强大?也许我会遇到更多的页面[@ID =" artibody"],但后代节点完全不同。
3.关于我的任务的进一步建议吗?从一个网站中提取Web内容,但主要内容置于<div>
中,具有不同的ID,类和后代节点结构。我在使用机器学习算法的同时,在笔记本电脑(Intel Corei5 3225,8G RAM)上运行蜘蛛可能会大大降低爬网速度。在同一时间编写许多XPath规则似乎很困扰。
如果您能给我这个问题(和我的英语)的任何建议,我会很感激。
获得所有 descendant 文本节点,除了 script
内容,您可以使用以下内容:
//div[@class="art_context"]//*[not(self::script)]/text()
在自然语言中:"从所有不是script
元素的div[@class="art_context"]
元素的后代获取所有文本节点"。
需要//
之后的CC_7选择后代,而不仅仅是孩子。
相比,该问题中的//div[@class="art_context" and not(self::script)]/text()
表达式说"获取所有div[@class="art_context"]
元素的所有文本节点儿童也不是script
元素。"
因此,问题表达式中的 and not(self::script)
零件是多余的,因为无论如何,所有表达式都在选择//div[@class="art_context"]
,然后/text()
部分仅选择该div
的文本节点直接的孩子,这只是行休息。
另外,如果您不使用XPath仅获取文本节点集,则需要使用XPath作为单个字符串将结果获取,您可以使用函数string-join(…)
和normalize-space(…)
:
normalize-space(string-join(//div[@class="art_context"]//*[not(self::script)]/text(), ""))