2012-08-27 8 views
8

To powinno być łatwe, ale utknąłem.Scrapy - Wybierz określony link na podstawie tekstu

<div class="paginationControl"> 
    <a href="/en/overview/0-All_manufactures/0-All_models.html?page=2&amp;powerunit=2">Link Text 2</a> | 
    <a href="/en/overview/0-All_manufactures/0-All_models.html?page=3&amp;powerunit=2">Link Text 3</a> | 
    <a href="/en/overview/0-All_manufactures/0-All_models.html?page=4&amp;powerunit=2">Link Text 4</a> | 
    <a href="/en/overview/0-All_manufactures/0-All_models.html?page=5&amp;powerunit=2">Link Text 5</a> | 

<!-- Next page link --> 
    <a href="/en/overview/0-All_manufactures/0-All_models.html?page=2&amp;powerunit=2">Link Text Next ></a> 
</div> 

Próbuję użyć Scrapy (Basespider) wybierz link opartą na jego tekst łącze za:

nextPage = HtmlXPathSelector(response).select("//div[@class='paginationControl']/a/@href").re("(.+)*?Next") 

Na przykład, chcę, aby wybrać następny link do strony na podstawie faktu, że tekst to "Link Text Next". Jakieś pomysły?

Odpowiedz

14

Zastosowanie a[contains(text(),'Link Text Next')]:

nextPage = HtmlXPathSelector(response).select(
    "//div[@class='paginationControl']/a[contains(text(),'Link Text Next')]/@href") 

referencyjny: Dokumentacja na XPath contains funkcji


PS. Twój tekst Link Text Next ma spację na końcu. Aby uniknąć konieczności włączania tej przestrzeni w kodzie:

text()="Link Text Next " 

myślę użyciu contains jest nieco bardziej ogólny, a jednocześnie jest na tyle specyficzny.

+0

Dzięki chłopaki. Użyłem sugestii przez @unutbu i działało idealnie. –

+0

Więc nie ma sposobu selektora CSS, aby to zrobić? – deostroll

1

Twój xpath wybiera href, a nie tekst w tagu a. Nie wygląda to na podstawie twojego przykładu, tak jak href ma w nim next, więc nie możesz go znaleźć z RE.

4

Można użyć następującego wyrażenia XPath:

//div[@class='paginationControl']/a[text()="Link Text Next"]/@href 

to wybranie atrybutów href powiązania z tekstem "Link Text Next".

Jeśli potrzebujesz więcej kontroli, zobacz .