HTML XPATH:提取与多个级别和复杂标签混合的文本



相关问题之前:

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代码。我尝试了以下内容,但似乎没有帮助。

仍然有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(), ""))

相关内容

  • 没有找到相关文章

最新更新