加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

如何选择所有子文本但使用Scapy的XPath排除标记?

发布时间:2020-12-14 22:58:08 所属栏目:资源 来源:网络整理
导读:我有这个HTML: 我想获取 中的所有文字在Scrapy中使用XPath但不包括 的内容,因此预期结果如下: Title 1Sub-Title 1Descripton 1.Descripton 2.Sub-Title 2Descripton 1.Descripton 2. 但是我还没有达到排除部分,我仍然在努力从 中获取文本. 我试过这个: re

我有这个HTML:

我想获取< div id =“content”>中的所有文字在Scrapy中使用XPath但不包括< div class =“infobox”>的内容,因此预期结果如下:

Title 1


Sub-Title 1


Descripton 1.

Descripton 2.


Sub-Title 2


Descripton 1.
Descripton 2.

但是我还没有达到排除部分,我仍然在努力从< div id =“content”>中获取文本.

我试过这个:

response.xpath('//*[@id="content"]/text()').extract()

但它只从子标题返回描述1.和描述2.

然后我尝试了:

response.xpath('//*[@id="content"]//*/text()').extract()

它仅返回标题1,子标题1,子标题2,信息标题和长信息文本.

所以这里有两个问题:

>我如何从内容div中获取所有儿童文本?
>如何从选择中排除信息框div?

最佳答案
使用descendant :: axis查找后代文本节点,并明确声明这些文本节点的父节点不能是div [@ class =’infobox’]元素.

将上述内容转换为XPath表达式:

//div[@id = 'content']/descendant::text()[not(parent::div/@class='infobox')]

然后,结果类似于(我使用在线XPath工具测试)以下内容.如您所见,div [@ class =’infobox’]的文本内容不再出现在结果中.

-----------------------
Title 1
-----------------------
-----------------------
Sub-Title 1
-----------------------
-----------------------
Description 1.
-----------------------
Description 2.
-----------------------
-----------------------
Sub-Title 2
-----------------------
-----------------------
Description 1
-----------------------
Description 2
-----------------------
-----------------------
-----------------------

你的方法有什么问题?

你的第一次尝试:

//*[@id="content"]/text()

用简单的英语表示:

Look for any element (not necessarily a div) anywhere in the document,that has an attribute @id,its value being “content”. For this element,return all its immediate child text nodes.

问题:您正在丢失不是外部div的直接子节点的文本节点,因为它们位于该div的子元素内.

你的第二次尝试:

//*[@id="content"]//*/text()

翻译为:

Look for any element (not necessarily a div) anywhere in the document,find any descendant element node and return all text nodes of that descendant element.

问题:您正在丢失div的直接子文本节点,因为您只查看作为div后代的元素的子节点的文本节点.

编辑:

回应你的评论:

//div[@id = 'content']/descendant::text()[not(ancestor::div/@class='infobox')]

对于您将来的问题,请确保您显示的HTML代表您的实际问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读