很难描述我在标题中遇到的问题,所以我为它含糊不清而道歉。我正在抓取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(),
}
提前感谢您的帮助!
答案 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还有其他一些具有相同名称的类。