Using Xpath axes to extract preceding element
我正试图从下面这个结构的站点中获取数据。我想从每个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <ul class="html-winners"> <li id="category"> Redaktionell Print - Dagstidning <ul> <li id="entry"> <img src="bilder/tumme10/4.jpg" width="110" height="147"> <span class="gold">Guld: Svenska Dagbladet</span> Designer: Anna W Thurfjell och SvD:s medarbetare Motivering:"Konsekvent design som ?r l?tt igenk?nningsbar. Sm? f?r?ndringar f?rnyar st?ndigt och blldmotiven utnyttjas f?red?mligt." </li> <li id="entry"> <img src="bilder/tumme10/3.jpg" width="110" height="147"> <span class="silver">Silver: K2 - Kristianstadsbladet</span> </li> </ul> </li> |
我用一个带有以下代码的剪贴画:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | start_urls = [ "http://www.designpriset.se/vinnare.php?year=2010" ] rules = ( Rule(LinkExtractor(allow ="http://www.designpriset.se/", restrict_xpaths=('//*[@class="html-winners"]')), callback='parse_item'), ) def parse(self, response): for sel in response.xpath('//*[@class="entry-info"]'): item = ByrauItem() annons_list = sel.xpath('//span[@class="gold"]/text()|//span[@class="silver"]/text()').extract() byrau_list = sel.xpath('//div/text()').extract() kategori_list = sel.xpath('/preceding::h2/text()').extract() for x in range(0,len(annons_list)): item['Annonsrubrik'] = annons_list[x] item['Byrau'] = byrau_list[x] item['Kategori'] = kategori_list[x] yield item |
号
Annons'u List和Byrau'u List的工作非常完美,它们使用xpath从起点
正如@kjhughes在comment中提到的,您需要在EDOCX1或EDOCX1之前添加EDOCX1,使您的xpath表达式相对于当前上下文元素。否则,表达式将被视为相对于根文档。这就是表达式EDOCX1没有返回任何内容的原因。
对于EDOCX1,您还可以将其从xpath表达式的开头删除,作为使其相对于当前上下文元素的替代方法:
ZZU1请注意,EDOCX1-5将返回位于EDOCX1-7之前的所有EDOCX1-6元素。根据发布的HTML,我认为下面的xpath表达式可以更安全地返回不需要的EDOCX1-6元素(误报):
ZZU1