Python 如何从两个不同的部分刮取物品?

Python 如何从两个不同的部分刮取物品?,python,mysql,xpath,web-scraping,scrapy,Python,Mysql,Xpath,Web Scraping,Scrapy,我是一个新的刮擦和网页爬行,我一直在网页www.mercadolibre.com.mx上工作,我必须(从起始页)获得一些关于那里显示的产品的数据(描述和价格)。这是我的items.py: from scrapy.item import Item, Field class PruebaMercadolibreItem(Item): producto = Field() precio = Field() 这是我的蜘蛛: from scrapy.spider import Base

我是一个新的刮擦和网页爬行,我一直在网页www.mercadolibre.com.mx上工作,我必须(从起始页)获得一些关于那里显示的产品的数据(描述和价格)。这是我的items.py:

from scrapy.item import Item, Field

class PruebaMercadolibreItem(Item):
    producto = Field()
    precio = Field()
这是我的蜘蛛:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from prueba_mercadolibre.items import PruebaMercadolibreItem

class MLSpider(BaseSpider):
    name = "mlspider"
    allowed_domains = ["mercadolibre.com"]
    start_urls = ["http://www.mercadolibre.com.mx"]

    def parse (self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//div[@class='item-data']")
        items = []
        for titles in titles:
            item = PruebaMercadolibreItem()
            item["producto"] = titles.select("p[@class='tit    le']/@title").extract()
            item["precio"] = titles.select("span[@class='ch-price']/text()").extract()
            items.append(item)
        return items
问题是,当我更改此行时,在中得到相同的结果:

    titles = hxs.select("//div[@class='item-data']")
为此:

    titles = hxs.select("//div[@class='item-data'] | //div[@class='item-data item-data-mp']")
我得到的数据与我使用第一行时的数据不一样

有人能帮我吗?我的xPath选择中有错误吗


另外,我也找不到一个好的教程来使用MySQL与scrapy,我将感谢任何帮助。Thx

如果要获取包含
项目数据的所有
div
标记,请更好地使用
包含
类:

titles = hxs.select("//div[contains(@class, 'item-data')]")
此外,spider中还有其他问题:

  • 在循环中,您正在覆盖
    标题
  • producto
    xpath中的类名应该是
    title
    ,而不是
    title
  • 您可能不希望在
    字段中有列表
    值,请从ed列表中取出第一个项目
  • HtmlXPathSelector
    已弃用,请改用
  • select()
    已弃用,请改用
  • BaseSpider
    已重命名为
以下是经过修改的代码:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.item import Item, Field
from prueba_mercadolibre.items import PruebaMercadolibreItem    


class MLSpider(Spider):
    name = "mlspider"
    allowed_domains = ["mercadolibre.com"]
    start_urls = ["http://www.mercadolibre.com.mx"]

    def parse (self, response):
        hxs = Selector(response)
        titles = hxs.xpath("//div[contains(@class, 'item-data')]")
        for title in titles:
            item = PruebaMercadolibreItem()
            item["producto"] = title.xpath("p[@class='title']/@title").extract()[0]
            item["precio"] = title.xpath("span[@class='ch-price']/text()").extract()[0]
            yield item
输出中的示例项:

{'precio': u'$ 35,000', 'producto': u'Cuatrimoto, Utv De 500cc 4x4 ,moto , Motos, Atv ,'}
{'precio': u'$ 695', 'producto': u'Reloj Esp\xeda Camara Oculta Video Hd 16 Gb! Sony Compara.'}

好的,thx的提示,我不知道很多东西,但是,我这里真正的问题是,我是否可以从不同的来源获得数据,例如,我需要来自“//div[contains(@class,'item data')]”和//div[contains(@class,'item data item data mp')]的数据,我该怎么做?@AlexLezama我发布的代码已经在这样做了。它在
contains
的帮助下处理这两种情况。我仍然有一些疑问,在www.mercadolibre.com.mx页面上,我可以看到超过24个项目,而这个代码总是只返回我24个,你知道为什么吗?@AlexLezama是的,我现在知道了。情况有点复杂,
item data mp
items不存在于html scrapy-get中,因为构建web页面时涉及到一个javascript函数。我担心从页面上获取其他项目(使用
itemdatamp
class)并不容易。如果你不知道怎么做,那么我现在就无法解决这个问题,你知道我在哪里可以找到一个关于如何将信息从这个蜘蛛传递到MySQL数据库的好教程吗?我是新来的scrapy,我不习惯所有的辛塔克斯和我在其他地方读过的东西,我真的希望得到任何帮助。顺便说一句,我使用的是Windows8