Python Scrapy返回诸如空格和换行符之类的垃圾数据。我该如何过滤这些?
我写了一个spider,它返回的数据中充满了空格和换行符。换行符还导致Python Scrapy返回诸如空格和换行符之类的垃圾数据。我该如何过滤这些?,python,scrapy,Python,Scrapy,我写了一个spider,它返回的数据中充满了空格和换行符。换行符还导致extract()方法作为列表返回。在触摸选择器之前,如何过滤这些内容?调用extract()后过滤这些内容打破了枯燥的原则,因为我需要从页面中提取大量无属性的数据,这使得解析这些数据的唯一方法是通过索引 我如何过滤这些 它返回这样的错误数据 { 'aired': ['\n ', '\n Apr 3, 2016 to Jun 26, 2016\n '], 'broadcast': [], 'duration':
extract()
方法作为列表返回。在触摸选择器之前,如何过滤这些内容?调用extract()
后过滤这些内容打破了枯燥的原则,因为我需要从页面中提取大量无属性的数据,这使得解析这些数据的唯一方法是通过索引
我如何过滤这些
它返回这样的错误数据
{ 'aired': ['\n ', '\n Apr 3, 2016 to Jun 26, 2016\n '],
'broadcast': [], 'duration': ['\n ', '\n 24 min. per ep.\n '], 'episodes': ['\n ', '\n 13\n '], 'favourites': ['\n ', '\n 22,673\n'], 'genres': ['Action', 'Comedy', 'School', 'Shounen', 'Super Power'], 'image_url': ['https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg',
'https://myanimelist.cdn-dena.com/images/anime/10/78745.jpg'], 'licensors': ['Funimation'], 'members': ['\n ', '\n 818,644\n'], 'popularity': ['\n ', '\n #21\n'], 'premiered': ['Spring 2016'], 'producers': ['Dentsu',
'Mainichi Broadcasting System',
'Movic',
'TOHO animation',
'Shueisha'], 'ranked': ['\n ', '\n #135', '\n ', '\n'], 'rating': ['\n ', '\n PG-13 - Teens 13 or older\n '], 'score': ['8.44'], 'source': ['\n ', '\n Manga\n '], 'status': ['\n ', '\n Finished Airing\n '], 'studios': ['Bones'], 'title': 'Boku no Hero Academia', 'type': ['TV']}
编辑:到源代码的链接与发布时不同,要查看代码,然后查看提交查看代码,可以尝试使用XPath规范化空间
mal_item['aired']=border_class.xpath('normalize-space(.//div[11]/text())).extract()
*未经测试,但似乎合法
对于更一般的答案,yourString.strip('someChar')
或yourString.replace('this','withThis')
效果很好(但在这种情况下,它可能不如其他方法有效)。如果原始数据中存在这些字符,则需要手动删除或跳过它们
换行符还导致extract()方法作为列表返回
导致这种行为的原因不是换行,而是节点在文档树中的显示方式。由元素节点分隔的文本节点,例如
否则,最简单的方法是:
# import re
...
def join_clean(texts):
return re.sub(r'\s+', ' ', ' '.join(texts)).strip()
...
mal_item['type'] = join_clean(border_class.xpath('.//div[8]/a/text()').extract())
请发布您的代码。请参阅源代码,它是指向该文件的直接链接。这是一个很棒的xpath函数。它解决了我的另一个问题,因为我用了另一种方法来过滤它。我使用for循环,而不是将一堆相同的语句插入到项中。唯一的问题是,如果他们在border_类上添加class=“dark_text”的新数据,它将中断。我现在可能会推送代码,所以如果你愿意,请随意查看。它看起来很难看,我将在明天折射它。我确实通过对以前的大多数代码应用DRY来解决这个问题,所以现在我在提取它们之后应用过滤器。请再看看我的代码,看看你的想法。加载器和处理器,看起来很有趣,我会玩一点。我担心它看起来比以前的版本更糟糕。你减少了行数和视觉上的“重复性”,使用了一种更难掌握的密集结构,并且在站点更改html时更难维护。另外,相信标记中存在的键将1:1与预期的项模式相关联也不是最好的主意。坦率地说,我认为在很多情况下,清晰性比干巴巴的要好,如果严格遵守设计原则,那么最终可能会花费不足够的时间来编写非常复杂但100%冗余的代码特技。如果说得有点刺耳,道歉。可能说得太快了,你这样做其实没关系。无视咆哮的语气。是的,这也是我在我的帖子中解释的,但我认为在本文中对脱衣舞的使用解释得更好。@JohnSmith,你能告诉我你为什么在第一次陈述中使用“360”吗?我同意这很难阅读,特别是如果你不参考HTML文档,我会尝试折射并添加一些注释。但是,我更喜欢这种方法,因为第一种方法使用索引,如果在最后一个子div以外的位置添加了新的子div,则会破坏它。