python - Scrapy - 抓取多个项目

标签 python xpath web-scraping scrapy

对 scrapy 还很陌生,所以请多多包涵。

首先,这是我的代码:

from scrapy.spider     import BaseSpider
from scrapy.selector     import HtmlXPathSelector
from usdirectory.items    import UsdirectoryItem
from scrapy.http    import Request


class MySpider(BaseSpider):
    name         = "usdirectory"
    allowed_domains    = ["domain.com"]
    start_urls    = ["url_removed_sorry"]

    def parse(self, response):
        hxs     = HtmlXPathSelector(response)
        titles     = hxs.select('//*[@id="holder_result2"]/a[1]/span/span[1]/text()').extract()
        for title in titles:
                item = UsdirectoryItem()
                item["title"] = title
                item


        yield item

这行得通......但它只抓取第一个项目。

我注意到在我试图抓取的项目中,每一行的 Xpath 都会发生变化。例如,第一行是您在上面看到的 xpath:

//*[@id="holder_result2"]/a[1]/span/span[1]/text()

然后它递增 2,一直到 29。所以第二个结果:

//*[@id="holder_result2"]/a[3]/span/span[1]/text()

最后结果:

//*[@id="holder_result2"]/a[29]/span/span[1]/text()

所以我的问题是如何让脚本获取所有这些,我不在乎是否必须为每个项目复制和粘贴代码。所有其他页面完全相同。我只是不确定该怎么做。

非常感谢。

编辑:

import scrapy
from scrapy.item import Item, Field

class UsdirectoryItem(scrapy.Item):
    title = scrapy.Field()

最佳答案

鉴于模式与您描述的完全一样,您可以使用 XPath modulo operator moda 的位置索引上获取所有目标 a 元素:

//*[@id="holder_result2"]/a[position() mod 2 = 1]/span/span[1]/text()

要进行快速演示,请考虑以下输入 XML:

<div>
 <a>1</a>
 <a>2</a>
 <a>3</a>
 <a>4</a>
 <a>5</a>
</div>

给定此 XPath /div/a[position() mod 2 = 1],将返回以下元素:

<a>1</a>
<a>3</a>
<a>5</a>

请参阅 xpathtester.com 中的现场演示 here

关于python - Scrapy - 抓取多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35376122/

相关文章:

Python Selenium - 动态生成的数据未添加到 DOM

javascript - 在python中,如何让scrapy返回隐藏元素的内容?

python mechanize 从网站检查考试的日期/时间

php - 读取由 xpath 填充的多维数组的值

python - 如何使用 WebOb 构建文件上传 POST HTTP 请求?

python - 如何在 python 中拆分文件?

python - n 和 m 的运行时复杂度是多少?

java - 从 XML 节点 java 生成/获取 xpath

python - 类型错误 : Failed to execute 'evaluate' on 'Document' : The result is not a node set,,因此无法通过 Selenium 使用 Xpath 进行转换

python - 合并字典中的数据框