2014-06-27 20 views
5

Mam sytuacji gdzie mam dużo <b> tagi:Get XPath(), aby powrócić pustych wartości

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

Jak widać, przedostatni znacznik jest pusty. Kiedy zadzwonić:

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

co daje mi:

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

chciałbym posiadać:

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

Czy istnieje sposób, aby uzyskać wartość pusta?


Moja obecna praca wokół jest zadzwonić:

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

A następnie analizowania przez każdy tag HTML sobie (puste znaczniki są tutaj, co jest, co chcę).

+1

Nie jestem pewien, że to obejście * * Myślę, że to, co masz do zrobienia. Rysujesz rozróżnienie między '' i '', a XML nie ma znaczenia dla rozróżnienia. Pusty element 'b' istnieje, ale w żadnym przypadku nie ma anonimowego węzła tekstu. – kojiro

+0

Naprawdę trudno jest znaleźć dokumentację, która dowodzi, że czegoś nie ma. :( – kojiro

Odpowiedz

2

To jest miejsce, w którym można ręcznie rozebrać znaczniki i uzyskać tekst. Można użyć remove_tags() funkcji dostarczanych przez w3lib:

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

Zauważ, że w3lib jest Scrapy dependency i jest używany wewnętrznie. Nie trzeba instalować go osobno.

Również lepiej byłoby użyć tutaj Scrapy Input and Output Processors. Kontynuuj używanie sel.xpath('b') i określ procesor wejściowy. Na przykład, można zdefiniować dla poszczególnych Field s dla klasy Item:

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

To jest bardziej eleganckie rozwiązanie niż to, co robiłem, dziękuję, – Tyler

+2

wszystkie rozwiązanie XPath będzie "[e.xpath (" string() "). Extract() [0] dla e w sel.xpath ("// b")] ' –

Powiązane problemy