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

use*_*057 5 python scrapy web-scraping

我写了一个Scrapy蜘蛛,它从页面中提取文本.蜘蛛在许多页面上正确地解析和输出,但是被一些页面抛弃了.我正在尝试在文档中维护换行符和格式.诸如http://www.state.gov/r/pa/prs/dpb/2011/04/160298.htm等页面的格式正确如下:

2011年4月7日

Mark C. Toner

美国东部时间下午2:03

先生.TONER:大家下午好.顶部有几件事情,然后我会问你的问题.我们谴责以最强烈的措辞袭击以色列南部的无辜平民,并谴责来自加沙的持续火箭弹袭击事件.正如我们多次重申的那样,没有理由以无辜平民为目标,应对追究这些恐怖主义行为的人负责.我们特别关切的是有报告表明在攻击平民方面使用先进的反坦克武器,并重申所有国家都有联合国安全理事会有关决议规定的义务,以防止非法贩运武器和弹药.也只是一个简短的声明 -

问题:我们可以坚持一秒钟吗?

先生.TONER:是的.来吧,马特.

问题:显然,目标是校车.这会增加你的愤怒吗?

先生.TONER:嗯,对无辜平民的任何攻击都是令人憎恶的,但攻击的性质肯定是如此.

虽然像http://www.state.gov/r/pa/prs/dpb/2009/04/121223.htm这样的页面输出如下,但没有换行符:

2009年4月2日

罗伯特伍德

上午11:53 EDTMR.伍德:大家早上好.我想,它还在上午.欢迎来到简报.我没有,有什么,所以,先生.问题:朝鲜人已经开始为靠近现场的油轮或其他东西提供燃料.他们可能会也可能不会为这种导弹提供燃料.你现在对朝鲜人有什么智慧之词?伍德:嗯,马特,我,我不会评论,你知道,情报很重要.但是,我再说一次,我们呼吁朝鲜停止发射任何类型的导弹.这会适得其反.它具有挑衅性.它进一步加剧了该地区的紧张局势.我们希望看到朝鲜重新回到六方框架并专注于无核化.是的.问:日本也表示他们将要求安理会召开紧急会议,你知道,如果这次会议继续进行的话.这也是你要找的东西吗?MR.伍德:嗯,让我们看看这个测试是否发生了.我们当然希望它没有.再次呼吁北方不要这样做.但当然,我们会,"如果测试确实进展,我们将与我们的盟友进行讨论.

我正在使用的代码如下:

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)
Run Code Online (Sandbox Code Playgroud)

我认为他们的问题在于页面HTML的格式化.在输出文本不正确的页面上,段落由分隔<br> <p></p>,而在正确输出的页面上包含段落<p align="left" dir="ltr">.所以,虽然我已经确定了这一点,但我不确定如何以正确的形式一致地输出所有内容.

rec*_*dev 6

问题是,当你获得text()or时string(),<br>标签不会转换为换行符.

解决方法 - <br>在执行XPath请求之前替换标记.码:

response = response.replace(body=response.body.replace('<br />', '\n')) 
hxs = HtmlXPathSelector(response)
Run Code Online (Sandbox Code Playgroud)

让我给些建议,如果你知道,只有一个节点,你可以使用text(),而不是string():

date = hxs.select('//*[@id="date_long"]/text()').extract()[0]
Run Code Online (Sandbox Code Playgroud)