Scrapy - 根据文本选择特定链接

时间:2012-08-27 15:37:48

标签: python web-crawler scrapy

这应该很容易,但我被卡住了。

<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>

我正在尝试使用Scrapy(Basespider)根据它的链接文本选择链接:

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

例如,我想根据文本为“Link Text Next”的事实选择下一页链接。有什么想法吗?

3 个答案:

答案 0 :(得分:14)

使用a[contains(text(),'Link Text Next')]

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

参考:关于XPath contains函数的文档


PS。您的文字Link Text Next最后有一个空格。为了避免在代码中包含该空格:

text()="Link Text Next "

我认为使用contains会更加通用,但仍具有足够的特异性。

答案 1 :(得分:4)

您可以使用以下XPath表达式:

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

这会选择带有文字href的链接的"Link Text Next"属性。

如果您需要更多控制权,请参阅XPath string functions

答案 2 :(得分:1)

您的xpath正在选择href,而不是a标记中的文本。从你的例子中看,href中没有next,所以你找不到RE。