2016-05-22 1 views
0

enter image description hereКак использовать XPath, чтобы найти текстовый узел

Я использую лом, чтобы получить информацию пользователя на переполнение стека. И я пытаюсь использовать //h2[@class="user-card-name"]/text()[1], чтобы получить это имя. Тем не менее, я получаю это:

['\n       Ignacio Vazquez-Abrams\n       \n 

Кому-то помощь плз.

+1

Это один определенно @ IgnacioVazquez- Проблема Абрамса. – alecxe

ответ

1

Вы должны быть в состоянии очистить окружающий пробельные из результата легко с помощью strip() функции языка Python:

In [2]: result = response.xpath('//h2[@class="user-card-name"]/text()[1]').extract() 

In [3]: [r.strip() for r in result] 
Out[3]: [u'Ignacio Vazquez-Abrams'] 
1

Рекомендуемый способ при обходе неструктурированных данных с Scrapy является использование ItemLoaders и scrapylib предлагает некоторые очень хорошие default_input_processor и default_output_processor.

items.py

from scrapy import Item, Field 
from scrapy.loader import ItemLoader 
from scrapylib.processors import default_input_processor 
from scrapylib.processors import default_output_processor 

class MyItem(Item): 
    field1 = Field() 
    field2 = Field() 

class MyItemLoader(ItemLoader): 
    default_item_class = MyItem 

    default_input_processor = default_input_processor 
    default_output_processor = default_output_processor 

теперь на вашем коде паука, заполнить ваши детали с:

from myproject.items import MyItemLoader 


... 
... # on your callback 


    loader = MyItemLoader(response=response) 
    loader.add_xpath('field1', '//h2[@class="user-card-name"]/text()[1]') 

    ... keep populating the loader 

    yield loader.load_item() # to return an item 
0

Попробуйте это:

result = response.xpath('//h2[@class="user-card-name"]/text()').extract() 
result = result[0].strip() if result else ''