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]')