在Python中使用Scrapy进行解析时保留换行符

在Python中使用Scrapy进行解析时保留换行符,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我写了一个从页面中提取文本的刮擦蜘蛛。爬行器在许多页面上正确地解析和输出,但有几个页面被丢弃了。我试图在文档中维护换行符和格式。诸如的页面格式正确,如下所示: 2011年4月7日 色粉 美国东部时间下午2:03 托纳先生:各位下午好。上面有几件事, 然后我会回答你的问题。我们谴责对无辜者的袭击 以色列南部的平民也将以最强硬的方式出现 随着来自加沙的持续火箭弹发射。正如我们多次重申的那样, 没有理由以无辜平民为目标, 应对这些恐怖行为负责的人应该被拘留 负有责任的我们特别关切的是,有报告表明: 使

我写了一个从页面中提取文本的刮擦蜘蛛。爬行器在许多页面上正确地解析和输出,但有几个页面被丢弃了。我试图在文档中维护换行符和格式。诸如的页面格式正确,如下所示:

2011年4月7日

色粉

美国东部时间下午2:03

托纳先生:各位下午好。上面有几件事, 然后我会回答你的问题。我们谴责对无辜者的袭击 以色列南部的平民也将以最强硬的方式出现 随着来自加沙的持续火箭弹发射。正如我们多次重申的那样, 没有理由以无辜平民为目标, 应对这些恐怖行为负责的人应该被拘留 负有责任的我们特别关切的是,有报告表明: 使用先进的反坦克武器攻击平民 重申所有国家都有相关法律规定的义务 联合国安全理事会关于防止非法移民的决议 贩运武器和弹药。也只是一个简短的声明--

问题:我们能在这上面停留一秒钟吗

托纳先生:是的。去吧,马特

问:很明显,那次袭击的目标是一辆校车。是吗 增加你的愤怒

托纳先生:对无辜平民的任何攻击都是可恶的,但是 当然,袭击的性质尤其如此

虽然像这样的页面有这样的输出,但没有换行符:

2009年4月2日

罗伯特·伍德

美国东部夏令时上午11:53。伍德:大家早上好。我认为这只是 大约是早上。欢迎来到简报会。我什么都没有, 那么,长官。问题:朝鲜已经转移了加油机,或者 不管怎样,靠近现场。他们可能会也可能不会助长这一趋势 导弹。你对当时的朝鲜人有什么智慧的话 这一刻?伍德先生:嗯,马特,我不想评论你 你知道,情报很重要。但让我再说一次,我们呼吁 北朝鲜停止发射任何类型的导弹。是的 适得其反。这很有挑衅性。它进一步加剧了伊拉克的紧张局势 该地区。我们希望看到朝鲜回到六方会谈 无核化的框架和重点。是的。问题:日本也 说他们将在保安室召开紧急会议 议会,你知道,如果这次发射继续进行。这是不是 你也在寻找?伍德先生:好吧,让我们看看这个测试 发生。我们当然希望不会。再次拜访北方 不要这样做。但当然,如果测试继续进行,我们会, 我们将与我们的盟友进行讨论

我使用的代码如下所示:

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]