Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 抓取:从网站上抓取所有文本,但不包括超链接文本_Python_Xpath_Scrapy - Fatal编程技术网

Python 抓取:从网站上抓取所有文本,但不包括超链接文本

Python 抓取:从网站上抓取所有文本,但不包括超链接文本,python,xpath,scrapy,Python,Xpath,Scrapy,我在这里找到了一些有用的链接,解释如何从正文中提取所有文本: 然而,在提取所有文本的过程中,它也会刮去我不想要的超链接的文本。例如,在抓取网站时: 我使用了以下提取器: text = re.sub(' +',' ',re.sub('\n|\t|\r','',' '.join(response.selector.xpath('//body/descendant-or-self::*[not( self::script | self::style)]/text()').extract()))).st

我在这里找到了一些有用的链接,解释如何从正文中提取所有文本:

然而,在提取所有文本的过程中,它也会刮去我不想要的超链接的文本。例如,在抓取网站时:

我使用了以下提取器:

text = re.sub(' +',' ',re.sub('\n|\t|\r','',' '.join(response.selector.xpath('//body/descendant-or-self::*[not( self::script | self::style)]/text()').extract()))).strip()
我得到了以下结果:

“引用刮登录查看标签:幽默”的人,是吗 对一本好小说不感兴趣的先生或女士,一定是 愚蠢得让人无法忍受

“登录”一词来自超链接的文本部分

<a href="/login">Login</a>

来自超链接的文本的另一个示例是:

<a href="#" data-toggle="tab" class="login-tab-links2 toplogin">KFN PUBlIC INVESTORS<small>K1 AND TAX INFO</small></a></li>

其中“KFN公共投资者”和“K1和税务信息”也被删除

如何避免超链接中的文本也被刮去


非常感谢

您可以检查节点
父节点
祖先节点
是否是您不想要的节点

例如:
此xpath将查找非
节点的子节点的所有文本:

//text()[not(parent::a)]
或者,您可以使用
祖先
,检查是否有任何祖先是
节点(这意味着父母、祖父母、外祖父母等):


谢谢你的快速回复!我尝试使用两种形式的[not(parent::a)]范式
'//身体/后代或自我::*[非(自我::脚本|自我::风格|祖先::a)]/text()'
以及
'//身体/后代或自我::*[非(自我::脚本|自我::风格)]/text()[非(祖先::a)]
,但两者都不起作用。最后,我尝试了一种简单的方法
'//body//text()[not(parent::a)])
,但这也不起作用。有没有什么是我做错了(我尝试了父母和祖先的两种组合)?@BenedictLim你所说的不起作用是什么意思?它捕获
节点下的文本?你能详细说明一下你想要表达什么结果吗?实际上我尝试了
//身体/后代或自我::*[不是(self::script | self::style | self::a)]/text(),
,但是用self替换祖先,大部分都有效!我认为,如果我一直排除这种格式中的元素,应该能够减少我想要避免的文本类型。谢谢
//text()[not(ancestor::a)]