Python xpath用一行xpath替换循环

时间:2017-05-05 10:05:14

标签: python xpath scrapy

我从10个不一致的div元素中提取文本。有三种可能性:有时文本位于div元素中,有时它位于a的{​​{1}}元素子元素中,有时div元素中的文本具有一个a元素,用于将曲目名称与混音器分开。

现在我最好的解决方案包括使用xpath子选择所有轨道元素(b),然后为每个元素获取所有文本,如果结果有多个元素则连接成一个字符串。 这是示例页面link。 具有div class="track" s的列表来自:

div

然后我可以这样做:

response.xpath('//div[@class="track"]').extract()

['<div class="track"><a href="/tracks/548559">Magic Bazar</a></div>',
'<div class="track"><a href="/tracks/546388">Diesel</a></div>',
'<div class="track"><a href="/tracks/555897">Something Strange<br>(Filsonik remix)</a></div>',
'<div class="track"><a href="/tracks/545940">Basik Fire</a></div>',
'<div class="track">Think Twice<br>(Catz \'n Dogz)</div>',
'<div class="track">The Mothership</div>',
'<div class="track">Addiction feat. Mizbee</div>',
'<div class="track"><a href="/tracks/543113">Stash</a></div>',
'<div class="track"><a href="/tracks/555900">Voyeur Feat. Thomas Gandey<br>(Alex Niggemann)</a></div>',
'<div class="track"><a href="/tracks/484505">Remember Me</a></div>']

这给了我想要的结果:

for el in response.xpath('//div[@class="track"]'):
        track_and_remix = el.xpath('descendant-or-self::*/text()').extract()
        track = "".join(track_and_remix)

但是我认为有更好的方法来获得相同的结果。我认为可以使用一个Xpath表达式来获得所需的结果。我想答案是使用Scrapy&#39; Magic Bazar Diesel Something Strange(Filsonik remix) Basik Fire Think Twice(Catz 'n Dogz) The Mothership Addiction feat. Mizbee Stash Voyeur Feat. Thomas Gandey(Alex Niggemann) Remember Me 并使用一行xpath表达式获取数据。

解决方案应该以正确的顺序生成10个元素的列表。我知道一个单行解决方案,它将混音器(brakets中的项目)作为单独的元素返回,从而产生13个元素列表。

0 个答案:

没有答案