HTML XPath:提取混合了多级和复杂标签的文本?

HTML XPath: Extracting text mixed in with multiple level and complex tags?

之前的相关问题:

HTML XPath: Extracting text mixed in with multiple tags?

HTML XPath: Selectively avoiding tags when extracting text

//对不起我的英语不好

我是写网络爬虫的初学者,我正在尝试通过xpath从网页(中文)中提取主要内容(虽然我了解到有传统和机器学习方法来提取的算法web 主要内容),而且我是编写 xpath 规则的初学者。

我遇到了一个网页,其中包含混合在复杂标签中的文本,我将其总结如下,其中字符(例如 A、A2)表示仅文本,'...' 表示甚至嵌套了更多标签没有 text.I 想得到 "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 代码被提取为 well.I 尝试了以下,但似乎 helpful.There 仍然没有里面有js代码。

'string(//div[@class=\"art_context\" and not(self::script)])'

以下仅获得“\r\n”。

'//div[@class=\"art_context\" and not(self::script)]/text()'

这是我的问题:

1.How 编写 xpath 规则以满足我的需要:提取 div[@id="artibody"] 中的内容,<script>[=20= 中的代码除外]

2.Is问题1的规则简单又强大?也许我会遇到更多带有 div[@id="artibody"] 的页面,但后代节点完全不同。

3.Any 对我的任务有进一步的建议吗?从一个网站提取网页内容,但主要内容位于 <div> 不同的 id,class 和后代节点结构。我 运行 蜘蛛在我的笔记本电脑(Intel corei5 3225,8G RAM)上使用机器学习算法可能会降低爬行速度 significantly.At 同时写很多 xpath 规则似乎很麻烦。

如果你能就这个问题(和我的英语)给我任何建议,我将不胜感激。

要获取除 script 内容之外的所有 descendant 文本节点,您可以使用:

//div[@class="art_context"]//*[not(self::script)]/text()

在自然语言中:“从所有 div[@class="art_context"] 元素的后代中获取所有文本节点,这些元素不是 script 元素”。

div[@class="art_context"] 之后的 // 是 select 后代所需要的,而不仅仅是 children.

相比之下,问题中的 //div[@class="art_context" and not(self::script)]/text() 表达式表示“获取所有 text-node children of all div[@class="art_context"] elements它们也不是 script 个元素。”

所以问题中表达式中的 and not(self::script) 部分是多余的,因为表达式所做的只是 selecting 只是 //div[@class="art_context"],然后是 /text() 部分 select 仅 text-node 直接 children div,这只是换行符。

此外,如果您不希望使用 XPath 获取文本节点集,而是希望使用 XPath 获取单个字符串的结果,则可以使用函数 string-join(…)normalize-space(…):

normalize-space(string-join(//div[@class="art_context"]//*[not(self::script)]/text(), ""))