Tengo un script Python básico que puede almacenar la salida en un archivo. Este archivo es difícil de analizar. ¿Hay alguna otra forma de escribir datos raspados en un archivo que pueda leerse fácilmente en Python para su análisis?

import requests
from bs4 import BeautifulSoup as BS
import json
data='C:/test.json'
url="http://sfbay.craigslist.org/search/sby/sss?sort=rel&query=baby" 

r=requests.get(url)
soup=BS(r.content)
links=soup.find_all("p")
#print soup.prettify()

for link in links:
    connections=link.text
    f=open(data,'a')
    f.write(json.dumps(connections,indent=1))
    f.close()

El archivo de salida contiene esto: "$ 25 Sep 5 Porcelana Baby Deer $ 25 (sunnyvale) pic artículos para el hogar - por el propietario" "$ 7500 Sep 5 GEORGE STECK BABY GRAND PLAYER PIANO $ 7500 (morgan hill) instrumentos musicales del mapa - por

0
Amrita Sawant 5 sep. 2014 a las 21:36

4 respuestas

La mejor respuesta

Parece que su pregunta es más sobre cómo analizar los datos raspados que obtiene de craigslist, en lugar de cómo manejar los archivos. Una forma es tomar cada elemento <p> y tokenizar la cadena por espacios. Por ejemplo, tokenizar la cadena

"$ 25 Sep 5 Porcelana Baby Deer $ 25 (sunnyvale) pic artículos para el hogar - por el propietario"

Se puede hacer usando split:

s = " $25 Sep 5 Porcelain Baby Deer $25 (sunnyvale) pic household items - by owner "
L = s.strip().split(' ') #remove whitespace at ends and break string apart by spaces

L ahora es una lista con los valores

['$25', 'Sep', '5', 'Porcelain', 'Baby', 'Deer', '$25', '(sunnyvale)', 'pic', 'household', 'items', '-', 'by', 'owner']

Desde aquí, puede intentar determinar el significado de los elementos de la lista por el orden en que aparecen. L[0] siempre puede mantener el precio, L[1] el mes, L[2] el día del mes, etc. Si está interesado en escribir estos valores para archivarlos y analizarlos nuevamente más tarde, considere leer en el csv módulo.

0
A--- 5 sep. 2014 a las 19:47
import requests
from bs4 import BeautifulSoup as bs
url="http://sfbay.craigslist.org/baa/"
r=requests.get(url)
soup=bs(r.content)
import re
s=soup.find_all('a', class_=re.compile("hdrlnk")) 
for i in s:
  col=i.text
  scol=str(col)
  print scol

s1=soup.find_all('span', class_=re.compile("price")) ### Price
0
Amrita Sawant 11 sep. 2014 a las 05:01
  1. Decide qué datos quieres realmente. ¿Precios? Descripciones? Lista de fechas?
  2. Decida una buena estructura de datos para guardar esta información. Recomiendo una clase que contenga campos pertinentes o listas.
  3. Raspe los datos que NECESITA usando expresiones regulares o uno de muchos otros métodos.
  4. Tira lo que NO NECESITAS

5a. Escriba el contenido de la lista en un archivo en un formato que pueda usar fácilmente más tarde (XML, delimitado por comas, etc.)

O

5b. Seleccione los objetos según lo recomendado por Mike Ounsworth arriba.

Si aún no se siente cómodo con el análisis XML, simplemente escriba una sola línea por enlace y delimite los campos que desea con un carácter que puede usar más adelante para dividir. p.ej.:

import re #I'm going to use regular expressions here

link_content_matcher = re.compile("""\$(?P<price>[1-9]{1,4})\s+(?P<list_date>[A-Z]{1}[a-z]{2}\s+[0-9]{1,2})\s+(?P<description>.*)\((?P<location>.*)\)""")

some_link = "$50    Sep 5 Baby Carrier - Black/Silver (san jose)"

# Grab the matches
matched_fields = link_content_matcher.search(some_link)

# Write what you want to a file using a delimiter that 
# probably won't exist in the description. This is risky,
# but will do in a pinch.
output_file = open('results.txt', 'w')
output_file.write("{price}^{date}^{desc}^{location}\n".format(price=matched_fields.group('price'),
    date=matched_fields.group('list_date'),
    desc=matched_fields.group('description'),
    location=matched_fields.group('location')))
output_file.close()

Cuando desee volver a visitar estos datos, agárrelos línea por línea del archivo y analícelos con la división.

input_contents = open('results.txt', 'r').readlines()

for line in input_contents:
    price, date, desc, location = line.split('^')
    # Do something with this data or add it to a list
0
Community 23 may. 2017 a las 11:44

Si desea escribirlo desde python a un archivo y leerlo en python más tarde, puede usar Pickle - Tutorial de encurtidos.

Los archivos Pickle están en binario y no serán legibles para el ser humano, si eso es importante para usted, entonces podría mirar yaml, lo cual admitiré que tiene un poco de curva de aprendizaje, pero produce archivos con un formato agradable.

import yaml

f = open(filename, 'w')
f.write( yaml.dump(data) )
f.close()

...


stream = open(filename, 'r')
data = yaml.load(stream)
1
Mike Ounsworth 5 sep. 2014 a las 18:47