Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.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
Html 从直接子对象的XPath获取文本_Html_Xpath_Scrapy - Fatal编程技术网

Html 从直接子对象的XPath获取文本

Html 从直接子对象的XPath获取文本,html,xpath,scrapy,Html,Xpath,Scrapy,我正在尝试从以下标记检索产品名称: 2.0.0 我想知道产品的名称。我目前正在使用以下xpath: //a[@class="link-cover"]//parent::div/h2/a/text() 但我得到的结果也在span标记内。这是不需要的 [<Selector xpath='.//text()' data='AIT Themes'>, <Selector xpath='.//text()' data=' Solitudo '>, <Selector x

我正在尝试从以下标记检索产品名称:


2.0.0
我想知道产品的名称。我目前正在使用以下xpath:

//a[@class="link-cover"]//parent::div/h2/a/text()
但我得到的结果也在span标记内。这是不需要的

[<Selector xpath='.//text()' data='AIT Themes'>, <Selector xpath='.//text()' data=' Solitudo '>, <Selector xpath='.//text()' data='WordPress Theme'>]
[<Selector xpath='.//text()' data='AIT Themes'>, <Selector xpath='.//text()' data=' Spa '>, <Selector xpath='.//text()' data='WordPress Theme'>]
[<Selector xpath='.//text()' data='AIT Themes'>, <Selector xpath='.//text()' data=' SportClub '>, <Selector xpath='.//text()' data='WordPress Theme'>]
[<Selector xpath='.//text()' data='AIT Themes'>, <Selector xpath='.//text()' data=' Sushi '>, <Selector xpath='.//text()' data='WordPress Theme'>]
但是这并不很好,因为这个特定的站点有不同格式的页面,但是产品的名称总是在a标签中

我尝试使用“not”xpath操作符,但没有返回任何内容

//a[@class="link-cover"]//parent::div/h2/a/not(span)/text()
编辑: 作为参考,我通过scrapy调用xpath,如下所示:

def parse_产品(自我,响应):
products=response.xpath('//a[@class=“link cover”]///parent::div/h2/a')
对于产品中的产品:
name=product.xpath('.//text()')[1].get()
link=product.xpath(“./@href”).get()
屈服{
“产品名称”:名称,
“产品链接”:链接,
“产品开发者”:response.request.meta['developer'],
“产品类别”:response.request.meta['category']
}
下一页=response.xpath(
'//nav[@class=“navigation pagination”]/div[@class=“nav links”]/a[@class=“next page number”]/@href').get()
如果下一页:
产生scrapy.Request(url=next\u page,callback=self.parse\u products,meta={
“开发者”:response.request.meta['developer'],
“category”:response.request.meta['category']
})
只需使用
//h2/a/text()[normalize-space()]
。网站的完整XPath表达式:

//div[@class="new-post-display new-posts2"]//h2/a/text()[normalize-space()]
输出:

 Anchor 
 Aqua 
 Architect 
 Arctica 
 Aspiration 
 BandZone 
 Barcelona 
 BeachClub 
 Brick 
 BusinessFinder+
 ...
编辑:XPath表达式在scrapy shell中工作

获取数据:

我认为问题在于你的蜘蛛代码。因此,您发布了以下内容:

[<Selector xpath='.//text()' data='AIT Themes'>,...

产品名称是“Anchor”吗?你没有说过…我说过我不想要标签里面的东西,为了消除,只剩下“锚”。实际上,不是“锚”,而是“锚”和大量空白。我一直得到相同的结果。我在使用scrapy的网络爬虫中使用这个xpath表达式。我应该把最小可复制代码和问题放在一起吗?我最初没有把它放进去,因为对于问题的范围,关于xpath,我放进去的信息足够了,因为问题是关于xpath的,而不是scrapy。另一个问题,在这种情况下,规范化空间为什么能解决这个问题?根据MDN Firefox的定义:“normalize space函数从字符串中去掉前导和尾随空格,用单个空格替换空格字符序列,并返回结果字符串。”实际上有很多不必要的空格,但这不是我在问题中提出的真正问题。问题是忽略标记,只捕获作为.OK属性直接插入的文本。我已经编辑了我的答案<代码>规范化空格只是为了防止忽略空白节点。我不确定我是否理解你的答案。我试图更改代码,但收到以下错误:ValueError:XPath错误:在.text()中的表达式无效查看第7行:编辑:我在第7行中犯了一个小错误,但错误仍然相同:
[<Selector xpath='.//text()' data='AIT Themes'>,...
response.xpath('//a[@class="link-cover"]//parent::div/h2/a/text()[1]')