使用xPath选择器时,无法抓取指向下一页的链接,返回空。 (使用Scrapy)

时间:2018-02-24 21:14:49

标签: python web-scraping scrapy

我正在使用Scrapy并尝试抓取this网址,当我在页面上请求有关产品的任何数据时,我就会把它拿出来。但是具有paginator类和id = paginator1的div返回为空,即使它是一个引用下一页的表。我已经尝试过为表和css选择器使用xPath选择器,但两者都返回空。 这是我尝试过的,使用css

In [29]: response.css('span a::attr(href)').extract() Out[29]: ['/registration/formregistration/new', '/', '/catalog/solntsezaschitnye_ochki', 'http://wezom.com.ua/prodvizhenie']

In [31]: response.xpath('//*[@id="paginator1"]/table/tbody/tr[1]/td[2]/span') Out[31]: []

2 个答案:

答案 0 :(得分:1)

使用JavaScript生成分页,如HTML中所示:

<div class="paginator" id="paginator1"></div>
<div class="paginator_pages">Страниц: 14</div>
<script type="text/javascript">
/*pag1 = new Paginator("id div", vsego stranic, kol-vo na stranice, tekuchay stranica, "url");*/
pag1 = new Paginator("paginator1", 14, 10, 1, "/catalog/s_o_u_l_/page/", "/catalog/s_o_u_l_");
</script>

您可以从<script>块中提取所有相关信息:

import ast

script = response.xpath('//script[contains(text(), "paginator1")]/text()').extract()[0].strip()
paginator = script.splitlines()[1].strip().split('new Paginator')[1].rstrip(';')

paginatorHolderId, pagesTotal, pagesSpan, pageCurrent, baseUrl = ast.literal_eval(paginator)

然后,您可以根据the pagination script中的逻辑构建分页网址(或只查看网址的内容)。

答案 1 :(得分:0)

如果您查看实际的html源代码(response.text),您会看到以下内容:

<div class="paginator" id="paginator1"></div>
<div class="paginator_pages">Страниц: 14</div>
<script type="text/javascript">
/*pag1 = new Paginator("id div", vsego stranic, kol-vo na stranice, tekuchay stranica, "url");*/
pag1 = new Paginator("paginator1", 14, 10, 1, "/catalog/s_o_u_l_/page/", "/catalog/s_o_u_l_");
</script>

正如您所看到的,div确实是空的,并通过javascript填充。

您可以通过两种方式获取这些链接:

  1. 自己生成(应该相当容易)
  2. 使用某些东西为您运行javascript(例如无头浏览器)