使用Scrapy时获取空的JSON条目

时间:2017-02-26 04:13:49

标签: python json scrapy

很难描述我在标题中遇到的问题,所以我为它含糊不清而道歉。我正在抓取HackerNews帖子的标题,但是当我将结果写入JSON文件时我遇到了问题,因为其他所有条目都是空的"标题"宾语。我的输出样本:

{"title": []},
{"title": ["Buffett Assails Money-Manager Fees as Berkshire Reports Profit Rise"]},
{"title": []},
{"title": ["Linus on Git and SHA-1"]},
{"title": []},
{"title": ["Machine Learning from scratch: Bare bones implementations in Python"]},
{"title": []},
{"title": ["The Future of Not Working"]},
{"title": []},
...

正如您所看到的,我成功检索了链接的标题,但其他每个链接似乎都是空的。我为什么会这样做有点困惑,因为这样做的代码非常简单(但我也是Scrapy的新手,所以我可能会遗漏一些东西)。这是我的代码:

    def parse(self,response):
    for title in response.css('td.title'):
        yield {
            'title' : title.css('a.storylink::text').extract(),
        }

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您正确诊断出XPath选择器错误。 HackerNews在TR实体中拥有两个TD的头衔,第一个是等级。你想要每个TR的第二个。

10.104.0.1可能不会大大改善问题,因为它会扩大选择范围,因此您之后需要进行更多细化。

您应该尝试修改XPath添加,例如一个<?php //GET HOSTNAME INFO $hostname = $_SERVER['SERVER_NAME']; //VERIFY WHICH ENVIRONMENT THE APP IS RUNNING switch ($hostname) { case 'development.dev': define('WP_ENV', 'development'); define('WP_DEBUG', true); break; case 'staging.mywebsite.com': define('WP_ENV', 'staging'); define('WP_DEBUG', true); break; case 'www.mywebsite.com': define('WP_ENV', 'production'); define('WP_DEBUG', false); break; default: define('WP_ENV', 'production'); define('WP_DEBUG', false); } ?> 选择器,或者你可以修改你的Python循环,使它忽略所有奇怪的TD。

(你也可以在刮掉后过滤掉空的物品。)

答案 1 :(得分:-1)

看起来我对CSS条目犯了错误。我本应该进入

for title in response.css('tr.athing'):

而不是

for title in response.css('td.title'):

看起来HN还有其他一些具有相同名称的类。