Сохранение разрывов строк при разборе с Scrapy в Python - PullRequest
5 голосов
/ 05 января 2012

Я написал паука Scrapy, который извлекает текст со страницы. Паук анализирует и выводит правильно на многих страницах, но некоторые сбрасывают. Я пытаюсь сохранить разрывы строк и форматирование в документе. Страницы типа http://www.state.gov/r/pa/prs/dpb/2011/04/160298.htm правильно отформатированы следующим образом:

7 апреля 2011 г.

Марк С. Тонер

2: 03 вечера EDT

MR. ТОНЕР: Добрый день всем. Пара вещей наверху, и тогда я отвечу на ваши вопросы. Мы осуждаем нападение на невинных гражданские лица на юге Израиля в самых сильных условиях, а также как продолжающийся ракетный обстрел из Газы. Как мы повторяли много раз, нет оправдания преследованию ни в чем не повинных гражданских лиц, и виновные в этих террористических актах должны быть задержаны ответственности. Мы особенно обеспокоены сообщениями, которые указывают использование современного противотанкового оружия при нападении на мирных жителей и подтвердить, что все страны имеют обязательства по соответствующим Резолюции Совета Безопасности ООН по предотвращению незаконных незаконный оборот оружия и боеприпасов. Также просто краткое заявление -

ВОПРОС: Можем ли мы остановиться на этом хотя бы на одну секунду?

MR. ТОНЕР: Да. Давай, Мэтт.

ВОПРОС: Очевидно, целью этого был школьный автобус. Это делает добавить к вашему безобразию?

MR. ТОНЕР: Ну, любое нападение на ни в чем не повинных гражданских лиц отвратительно, но безусловно, характер атаки особенно таков.

В то время как страницы типа http://www.state.gov/r/pa/prs/dpb/2009/04/121223.htm имеют такой вывод без разрывов строк:

2 апреля 2009

Роберт Вуд

11: 53 утра EDTMR. ВУД: Доброе утро всем. Я думаю, что это просто о еще утром. Добро пожаловать на брифинг. У меня ничего нет, так что, сэр. ВОПРОС: Северные корейцы перевезли топливозаправщики, или что угодно, близко к сайту. Они могут или не могут подпитывать это ракета. Какие слова мудрости у вас есть для северных корейцев в этот момент? WOOD: Ну, Мэтт, я не буду комментировать, вы знаете, интеллект имеет значение. Но позвольте мне еще раз сказать, мы призываем Север воздерживаться от запуска любого типа ракет. Это было бы контрпродуктивным. Это провокационно. Это еще больше разжигает напряженность в область. Мы хотим, чтобы Север вернулся к Шестисторонней рамки и сосредоточиться на денуклеаризации. Да. ВОПРОС: Япония также сказали, что собираются созвать экстренное совещание в Службе безопасности. Совет, вы знаете, если этот запуск состоится. Это то, что вы бы тоже искали? WOOD: Хорошо, давайте посмотрим, будет ли этот тест случается. Мы, конечно, надеемся, что это не так. Опять призыв на север не делать этого Но, конечно, мы будем - если этот тест будет идти вперед, у нас будут переговоры с нашими союзниками.

Код, который я использую, выглядит следующим образом:

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 страницы. На страницах, которые выводят текст неправильно, абзацы разделены <br> <p></p>, а на страницах, которые выводят правильно, абзацы содержатся в <p align="left" dir="ltr">. Так что, хотя я и определил это, я не уверен, как заставить все выводить последовательно в правильной форме.

Ответы [ 2 ]

6 голосов
/ 05 января 2012

Проблема в том, что при получении text() или string() теги <br> не преобразуются в новую строку.

Обходной путь - замените теги <br> перед выполнением запросов XPath. Код:

response = response.replace(body=response.body.replace('<br />', '\n')) 
hxs = HtmlXPathSelector(response)

И позвольте мне дать несколько советов, если вы знаете, что есть только один узел, вы можете использовать text() вместо string():

date = hxs.select('//*[@id="date_long"]/text()').extract()[0]
3 голосов
/ 05 января 2012

Попробуйте этот xpath:

//*[@id="centerblock"]//text()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...