Scrapy:在Xpath中处理Abbr标记的问题

时间:2016-02-13 19:56:50

标签: xpath scrapy scrapy-spider

我对Scrapy有点新意,我在处理(或者更确切地说,我认为问题在于处理)abbr标签时遇到了问题,但我不是100%一定。

我试图从下面的html中获取abbr标题:

<div class="meta">
        Post by: <a href="index.php?members/18862/" class="username" dir="auto">Eric</a>,
        <abbr title="Feb 13, 2016 at 1:45 PM" class="DateTime" data-time="1455389113" data-diff="3240" data-datestring="Feb 13, 2016" data-timestring="1:45 PM">54 minutes ago</abbr>
        in forum: <a href="index.php?forums/154/">Forum Games</a>
    </div>

我在这里处理的问题是当我为蜘蛛使用以下代码时:

def parse(self, response):
    for sel in response.xpath('//h3[@class="title"]'):
        item = ZqItem()
        item['user'] = sel.xpath('../../div[@class="meta"]/a[@class="username"]/text()').extract()
        item['date'] = sel.xpath('../../div[@class="meta"]/abbr[@class="DateTime"]/@title').extract()

        yield item

我无法获得日期(scrapy返回&#39; date&#39;:[],在powershell中)。然而,用户被罚款让我觉得它可能是abbr标签给我一个问题。

此外,我尝试在不同但相似的html片段上使用我的代码,它代替abbr,并且它有效(成功返回标题)。 (请记住,html中还存在其他一些差异 - 也许这就是问题的原因?)

<div class="meta">
        Post by: <a href="index.php?members/18862/" class="username" dir="auto">Eric</a>,
        <span class="DateTime" title="Feb 4, 2016 at 9:37 AM">Feb 4, 2016</span>
        in forum: <a href="index.php?forums/8/">General</a>
    </div>

蜘蛛为:

def parse(self, response):
for sel in response.xpath('//h3[@class="title"]'):
    item = ZqItem()
    item['user'] = sel.xpath('../../div[@class="meta"]/a[@class="username"]/text()').extract()
    item['date'] = sel.xpath('../../div[@class="meta"]/span[@class="DateTime"]/@title').extract()

    yield item

有人可以就这个问题传播一些看法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我们假设日期不是使用javascript动态生成的 你可以这样做:

def parse(self, response):
    for sel in response.xpath('//div[@class="meta"]/a[@class="username"]'):

        date = sel.xpath('../span[@class="DateTime"]/@title').extract()
        date += sel.xpath('../abbr[@class="DateTime"]/@title').extract()

        item = ZqItem()
        item['user'] = sel.xpath('./text()').extract()
        item['date'] = date

        yield item