2016-11-28 3 views
0

Использование Python библиотеки Scrapy, я следующее:Как получить текст ссылки из этого XPath?

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 

Оттуда я хотел бы получить индивидуальную ссылку + текст каждого возвращенного элемента:

response.xpath('//div[@class="title-and-desc"]/a') 

Однако, только ссылки в настоящее время а не текст. Вот пример того, что вернулся:

response.xpath('//div[@class="title-and-desc"]/a') 
[<Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://www.brpr'>, <Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://www.dive'>, <Selector xpath='//div[@class="title-and-desc"]/a' data=u'<a target="_blank" href="http://rhodesmi'>, 

я могу перебрать выше результатов, где i является переменной для каждой итерации:

i.xpath("text()").extract_first(), 
i.xpath("@href").extract_first() 

Но только @href значения возвращаются. Это происходит потому, что нет ничего для text() для получения результатов. Что нужно изменить, чтобы я мог получить сопроводительный текст ссылки?

Для справки, полный пример Scrapy исходит отсюда: Scrapy Tutorial Example.

ответ

0

Это потому, что текст, который вы ищете в дочернем узле div:

<div class="title-and-desc"> 
    <a target="_blank" href="http://www.network-theory.co.uk/python/intro/"> 
    <div class="site-title">An Introduction to Python </div> 
    </a> 
<div> 

Вы можете получить весь текст узла (с текстом из его детей), предваряя // к нему, т.е. //text() вместо text() или просто пойти с явным xpath a/div/text().

Try:

links = response.xpath('//div[@class="title-and-desc"]/a') 
for l in links: 
    # url: 
    print(l.xpath('@href').extract_first()) 
    # text with explicit xpath: 
    print(l.xpath('div/text()').extract_first()) 
    # or with all text elements with relative //text: 
    print(''.join(l.xpath('.//text()').extract()).strip()) 
+0

Это не решает проблему, так как получать только текст означает не получить URL. Я попробовал 'i.xpath (" // text() "). Extract_first()', но это не сработало. – 4thSpace

+0

@ 4thSpace это действительно работает, см. Мое редактирование для примера. – Granitosaurus

+1

Другим полезным вариантом является использование «string()' или 'normalize-space()' '' '' '' '' '' '' '' '' '' '' 'для l в ссылках: print (l.xpath ('normalize-space (.)'). Extract_first(), l. XPath ('@ HREF'). extract_first()) ' –

Смежные вопросы