我从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个元素列表。