2016-04-05 3 views
1

Я пишу код Python, используя lxml, urllib и csv, чтобы очистить речи в a Brazil government site.Извлечение даты и других данных из скребковых элементов

Мне удалось найти название и ссылку для каждой речи, используя XPath, но не точный день, так как для даты речи нет определенного тега.

Когда я использую XPath '//span[@class="summary-view-icon"]/text(), скребок возвращает день, час и слово «Página» (страница, на португальском языке). Я знаю, что этот Xpath не прав, но я не знаю, как выбрать только день.

Даже с этой ошибкой я смог преобразовать сломанный контент в список и редактировать, чтобы удалить все, кроме дней. Проблема в том, что в конечном списке, как вы можете видеть ниже, есть другие символы, которые я не могу удалить.

Здесь, по-видимому, есть два решения: получить право XPath или отредактировать другие символы в списке. Как я могу сделать любой из них?

['\ n 18/12/2015 \ n', '\ n 21/12/2015 \ n', '\ n 21/12/2015 \ n', '\ n 22/12/2015 \ n ',' \ n 22/12/2015 \ n ',' \ n 22/12/2015 \ n ',' \ n 11/01/2016 \ n ',' \ n 19/01/2016 \ n ' , '\ n 21/01/2016 \ n', '\ n 26/01/2016 \ n', '\ n 27/01/2016 \ n', '\ n 27/01/2016 \ n', ' \ n 28/01/2016 \ n ',' \ n 01/02/2016 \ n ',' \ n 01/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 02/02/2016 \ n ',' \ n 03/02/2016 \ n ',' \ n 03/02/2016 \ n ',' \ n 19/02/2016 \ n ',' \ n 1 9/02/2016 \ n ',' \ n 22/02/2016 \ n ',' \ n 26/02/2016 \ n ',' \ n 26/02/2016 \ n ',' \ n 02/03/2016 \ n ',' \ n 03/03/2016 \ n ',' \ n 04/03/2016 \ n ',' \ n 07/03/2016 \ n ',' \ n 04/02/2016 \ n ',' \ n 08/03/2016 \ n ',' \ n 09/03/2016 \ n ',' \ n 17/03/2016 \ n ',' \ n 18/03/2016 \ n ',' \ n 22/03/2016 \ n ',' \ n 23/03/2016 \ n ',' \ n 23/03/2016 \ n ',' \ n 30/03/2016 \ n ' , '\ n 31/03/2016 \ n', '\ n 01/04/2016 \ n']

+1

Просто раздеться белые пространства вокруг '[d.strip() для г в йз]' –

ответ

1

Попробуйте followin XPath, чтобы сузить результат только даты:

//span[@class="summary-view-icon"][i/@class="icon-day"]/text()[normalize-space()] 

Последний бит выше XPath (text()[normalize-space()]) возвращает только непустые текстовые узлы.Отсюда, вам все еще нужно удалить ненужные пробелы с помощью strip():

query = '//span[@class="summary-view-icon"][i/@class="icon-day"]/text()[normalize-space()]' 
dates = root.xpath(query) 
result = [date.strip() for date in dates] 
1

Вы можете удалить все символы и пробелы новой строки из элементов в списке, используя strip:

new_list = [item.strip() for item in old_list] 

Edit: Вы сказали, что вы были в состоянии преобразовать результаты в список в вашем вопросе в этом случае можно просто отогнать элементы там.

1

Вот с помощью regular expression:

dates = [re.search(r'\d{2}/\d{2}/\d{4}', item, re.MULTILINE).group(0) for item in old_list] 

Дает:

['18/12/2015', '21/12/2015', '21/12/2015', '22/12/2015', '22/12/2015', 
'22/12/2015', '11/01/2016', '19/01/2016', '21/01/2016', '26/01/2016', 
'27/01/2016', '27/01/2016', '28/01/2016', '01/02/2016', '01/02/2016', 
'02/02/2016', '02/02/2016', '02/02/2016', '03/02/2016', '03/02/2016', 
'19/02/2016', '19/02/2016', '22/02/2016', '26/02/2016', '26/02/2016', 
'02/03/2016', '03/03/2016', '04/03/2016', '07/03/2016', '04/02/2016', 
'08/03/2016', '09/03/2016', '17/03/2016', '18/03/2016', '22/03/2016', 
'23/03/2016', '23/03/2016', '30/03/2016', '31/03/2016', '01/04/2016'] 

Это может помочь с данными, имеющие больше дисперсии или неожиданное форматирование.

3

Это поможет вам, что вы хотите:

items = response.xpath('//div[@id="content-core"]//div[contains(@class, "tileItem")]') 
for item in items: 
    date = item.xpath('normalize-space(.//span[@class="summary-view-icon"][i[@class="icon-day"] ]//text()[normalize-space()])') 

Использование нормализуют-пространства дважды лишит удалить пустые результаты + раздеться все непечатаемые конечного результата.

1

Вы можете использовать регулярное выражение для извлечения даты в нужном вам формате без дополнительных символов.

Основываясь на структуре страницы я разработал скребок, используя повторно, чтобы показать, как я хотел бы сделать это:

import requests, re 
from lxml import etree 


def get_speeach_data(item): 
    title = item.xpath('.//h2[@class="tileHeadline"]/a/text()')[0] 

    sidebar = item.xpath('./span[@class="documentByLine"]')[0] 
    sidebar_html = etree.tostring(sidebar) 

    m = re.search(r'(\d+/\d+/\d+)', sidebar_html) 
    date = m.group(1) 

    m = re.search(r'(\d+h\d+)', sidebar_html) 
    hour = m.group(1) 

    return { 'title' : title, 'date' : date, 'hour' : hour } 



if __name__ == '__main__': 
    url = 'http://www2.planalto.gov.br/acompanhe-o-planalto/discursos/discursos-da-presidenta?b_start:int=0' 

    r = requests.get(url) 

    if r.status_code == 200: 
     page = etree.HTML(r.content) 

     raw_speeaches = page.xpath('//*[@id="content-core"]/div') 
     speeaches = map(get_speeach_data, raw_speeaches) 
     print speeaches 
+0

Большой! Спасибо за вашу помощь –

Смежные вопросы