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(), ""))
之前的相关问题:
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(), ""))