python excel xpath web-scraping lxml

python - ¿No se pueden escribir los elementos extraídos correctamente en un archivo de Excel?



xpath web-scraping (2)

Cuando actualiza los valores en el dict de data los valores anteriores se reemplazan.

Puede solucionar esto si reemplaza esta línea:

data.update({heading.split(" ")[-4]: [[(title)]]})

Con esto (es un poco feo pero funciona):

data[heading.split(" ")[-4]] = data.get(heading.split(" ")[-4], []) + [[(title)]]

He escrito un código en Python para analizar el título y el enlace de una página web. Inicialmente, traté de analizar los enlaces de la barra del lado izquierdo y luego raspar los documentos mencionados de cada página rastreando cada uno de los enlaces. Hice esto sin problemas. Traté de guardar los documentos de diferentes enlaces en diferentes páginas en un solo archivo de Excel. Sin embargo, crea varias "Hojas de cálculo" extrayendo la porción deseada como el nombre de la hoja de la variable de encabezado de mi script. El problema al que me enfrento es que, cuando se guardan los datos, solo el último registro de cada página de los enlaces se guarda en mis hojas de Excel en lugar de en los registros completos. Aquí está el script que probé con:

import requests from lxml import html from pyexcel_ods3 import save_data web_link = "http://www.wiseowl.co.uk/videos/" main_url = "http://www.wiseowl.co.uk" def get_links(page): response = requests.Session().get(page) tree = html.fromstring(response.text) data = {} titles = tree.xpath("//ul[@class=''woMenuList'']//li[@class=''woMenuItem'']/a/@href") for title in titles: if "author" not in title and "year" not in title: get_docs(data, main_url + title) def get_docs(data, url): response = requests.Session().get(url) tree = html.fromstring(response.text) heading = tree.findtext(''.//h1[@class="gamma"]'') for item in tree.xpath("//p[@class=''woVideoListDefaultSeriesTitle'']"): title = item.findtext(''.//a'') link = item.xpath(''.//a/@href'')[0] # print(title, link) data.update({heading.split(" ")[-4]: [[(title)]]}) save_data("mth.ods", data) if __name__ == ''__main__'': get_links(web_link)


O si desea que sea más legible:

def get_docs(data, url): response = requests.Session().get(url) tree = html.fromstring(response.text) heading = tree.findtext(''.//h1[@class="gamma"]'') for item in tree.xpath("//p[@class=''woVideoListDefaultSeriesTitle'']"): title = item.findtext(''.//a'') sheetname = heading.split(" ")[-4] if sheetname in data: data[sheetname].append([title]) else: data[sheetname] = [[title]] save_data("mth.ods", data)

Editar: para insertar el link a la siguiente columna, simplemente debe agregarlo a su lista de esta manera:

if sheetname in data: data[sheetname].append([title, str(link)]) else: data[sheetname] = [[title, str(link)]]

Editar2: para tenerlos en la misma página, debe agregarlos a la misma clave, ya que la tecla representa la hoja y el valor representa las filas y las columnas en save_data . Me gusta esto:

sheetname = ''You are welcome'' for item in tree.xpath("//p[@class=''woVideoListDefaultSeriesTitle'']"): title = item.findtext(''.//a'') if sheetname in data: data[sheetname].append([title]) else: data[sheetname] = [[title]] save_data("mth.ods", data)