在Python中使用Scrapy进行解析时保留换行符
我写了一个从页面中提取文本的刮擦蜘蛛。爬行器在许多页面上正确地解析和输出,但有几个页面被丢弃了。我试图在文档中维护换行符和格式。诸如的页面格式正确,如下所示: 2011年4月7日 色粉 美国东部时间下午2:03 托纳先生:各位下午好。上面有几件事, 然后我会回答你的问题。我们谴责对无辜者的袭击 以色列南部的平民也将以最强硬的方式出现 随着来自加沙的持续火箭弹发射。正如我们多次重申的那样, 没有理由以无辜平民为目标, 应对这些恐怖行为负责的人应该被拘留 负有责任的我们特别关切的是,有报告表明: 使用先进的反坦克武器攻击平民 重申所有国家都有相关法律规定的义务 联合国安全理事会关于防止非法移民的决议 贩运武器和弹药。也只是一个简短的声明-- 问题:我们能在这上面停留一秒钟吗 托纳先生:是的。去吧,马特 问:很明显,那次袭击的目标是一辆校车。是吗 增加你的愤怒 托纳先生:对无辜平民的任何攻击都是可恶的,但是 当然,袭击的性质尤其如此 虽然像这样的页面有这样的输出,但没有换行符: 2009年4月2日 罗伯特·伍德 美国东部夏令时上午11:53。伍德:大家早上好。我认为这只是 大约是早上。欢迎来到简报会。我什么都没有, 那么,长官。问题:朝鲜已经转移了加油机,或者 不管怎样,靠近现场。他们可能会也可能不会助长这一趋势 导弹。你对当时的朝鲜人有什么智慧的话 这一刻?伍德先生:嗯,马特,我不想评论你 你知道,情报很重要。但让我再说一次,我们呼吁 北朝鲜停止发射任何类型的导弹。是的 适得其反。这很有挑衅性。它进一步加剧了伊拉克的紧张局势 该地区。我们希望看到朝鲜回到六方会谈 无核化的框架和重点。是的。问题:日本也 说他们将在保安室召开紧急会议 议会,你知道,如果这次发射继续进行。这是不是 你也在寻找?伍德先生:好吧,让我们看看这个测试 发生。我们当然希望不会。再次拜访北方 不要这样做。但当然,如果测试继续进行,我们会, 我们将与我们的盟友进行讨论 我使用的代码如下所示:在Python中使用Scrapy进行解析时保留换行符,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我写了一个从页面中提取文本的刮擦蜘蛛。爬行器在许多页面上正确地解析和输出,但有几个页面被丢弃了。我试图在文档中维护换行符和格式。诸如的页面格式正确,如下所示: 2011年4月7日 色粉 美国东部时间下午2:03 托纳先生:各位下午好。上面有几件事, 然后我会回答你的问题。我们谴责对无辜者的袭击 以色列南部的平民也将以最强硬的方式出现 随着来自加沙的持续火箭弹发射。正如我们多次重申的那样, 没有理由以无辜平民为目标, 应对这些恐怖行为负责的人应该被拘留 负有责任的我们特别关切的是,有报告表明: 使
def parse_item(self, response):
self.log('Hi, this is an item page! %s' % response.url)
hxs = HtmlXPathSelector(response)
speaker = hxs.select("//span[contains(@class, 'official_s_name')]") #gets the speaker
speaker = speaker.select('string()').extract()[0] #extracts speaker text
date = hxs.select('//*[@id="date_long"]') #gets the date
date = date.select('string()').extract()[0] #extracts the date
content = hxs.select('//*[@id="centerblock"]') #gets the content
content = content.select('string()').extract()[0] #extracts the content
texts = "%s\n\n%s\n\n%s" % (date, speaker, content) #puts everything together in a string
filename = ("/path/StateDailyBriefing-" + '%s' ".txt") % (date) #creates a file using the date
#opens the file defined above and writes 'texts' using utf-8
with codecs.open(filename, 'w', encoding='utf-8') as output:
output.write(texts)
我认为问题在于页面的HTML格式。在不正确输出文本的页面上,段落由
分隔,而在正确输出文本的页面上,段落包含在
中。因此,虽然我已经确定了这一点,但我不确定如何以正确的形式一致地输出所有内容 试试这个xpath:
//*[@id="centerblock"]//text()
问题是,当您获取text()
或string()
时,
标记不会转换为换行符
解决方法-在执行XPath请求之前替换
标记。代码:
response = response.replace(body=response.body.replace('<br />', '\n'))
hxs = HtmlXPathSelector(response)
您将无法仅使用“”。join(content)
,因为文本不包含换行符,“\n”。join(content)
不仅会分割段落,还会分割…
。这是可行的,但因为需要加入列表@reclosedev有一个更干净、更简单的方法。不过,谢谢。我建议用正则表达式替换普通字符串以减少限制:response=response.replace(body=re.sub(r“”“\n”,response.body))
date = hxs.select('//*[@id="date_long"]/text()').extract()[0]