2014-06-27 7 views
5

ich eine Situation, wo ich eine Menge <b> Tags haben:Get xpath(), um leere Werte zurück

<b>12</b> 
<b>13</b> 
<b>14</b> 
<b></b> 
<b>121</b> 

Wie Sie sehen können, der zweite letzte Tag ist leer. Als ich nennen:

sel.xpath('b/text()').extract() 

Was mich gibt:

['12', '13', '14', '121'] 

ich haben möchte:

['12', '13', '14', '', '121'] 

Gibt es einen Weg, um den leeren Wert zu bekommen?


Meine aktuelle Arbeit ist um zu nennen:

sel.xpath('b').extract() 

Und dann durch die einzelnen HTML-Analyse selbst markieren (die leeren Tags hier, sind das, was ich will).

+1

Ich bin nicht sicher, das ist eine * Abhilfe *, ich glaube, es ist das, was Sie zu tun haben. Sie zeichnen einen Unterschied zwischen '' und '', und XML hat keine Semantik für die Unterscheidung. Das leere Element "b" existiert, hat aber in keinem Fall einen anonymen Textknoten. – kojiro

+0

Es ist wirklich schwierig, nach Dokumenten zu suchen, die beweisen, dass etwas nicht existiert. :( – kojiro

Antwort

2

Hier ist es in Ordnung, die Tags manuell zu entfernen und den Text zu erhalten. Sie können remove_tags() Funktion von w3lib bereitgestellt verwenden:

>>> from w3lib.html import remove_tags 
>>> map(remove_tags, sel.xpath('//b').extract()) 
[u'12', u'13', u'14', u'', u'121'] 

Beachten Sie, dass w3lib ein Scrapy dependency ist und verwendet wird, intern. Keine Notwendigkeit, es separat zu installieren.

Auch hier wäre es besser, Scrapy Input and Output Processors hier zu verwenden. Verwenden Sie weiterhin sel.xpath('b') und definieren Sie einen Eingangsprozessor. Zum Beispiel können Sie es für bestimmte Field s für die Item Klasse definieren:

from scrapy.contrib.loader.processor import MapCompose 
from scrapy.item import Item, Field 
from w3lib.html import remove_tags 

class MyItem(Item): 
    my_field = Field(input_processor=MapCompose(remove_tags)) 
+0

Dies ist eine elegantere Lösung als das, was ich tat, danke. – Tyler

+2

eine alle XPath-Lösung wäre '[e.xpath ('string()'). Extract() [0] für e in sel.xpath ("// b")] ' –