Ten kod otwiera adres URL i dołącza /names
na końcu, a następnie otwiera stronę i drukuje ciąg do test1.csv
:
import urllib2
import re
import csv
url = ("http://www.example.com")
bios = [u'/name1', u'/name2', u'/name3']
csvwriter = csv.writer(open("/test1.csv", "a"))
for l in bios:
OpenThisLink = url + l
response = urllib2.urlopen(OpenThisLink)
html = response.read()
item = re.search('(JD)(.*?)(\d+)', html)
if item:
JD = item.group()
csvwriter.writerow(JD)
else:
NoJD = "NoJD"
csvwriter.writerow(NoJD)
Ale otrzymuję ten wynik:
J,D,",", ,C,o,l,u,m,b,i,a, ,L,a,w, ,S,c,h,o,o,l,....
Jeśli zmienię ciąg na („JD”, „Columbia Law School” ....), otrzymam
JD, Columbia Law School...)
W dokumentacji nie mogłem znaleźć sposobu określenia separatora.
Jeśli spróbuję użyć, delimenter
pojawia się ten błąd:
TypeError: 'delimeter' is an invalid keyword argument for this function
Dzięki za pomoc.
delimiter
i niedelimeter
: docs.python.org/library/csv.htmlOdpowiedzi:
Oczekuje sekwencji (np. Listy lub krotki) ciągów. Dajesz mu pojedynczy ciąg. Ciąg jest również sekwencją ciągów, ale jest to sekwencja 1 ciągów znaków, co nie jest tym, czego chcesz.
Jeśli potrzebujesz tylko jednego ciągu na wiersz, możesz zrobić coś takiego:
To otacza JD (ciąg znaków) listą.
źródło
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])
zapisuje datę"2016-11-05 20:30:19"
2016-11-05 13:21:11
bez cytatów. Jakiej wersji Pythona używasz?Klasa csv.writer przyjmuje element iterowalny jako argument funkcji writerow; ponieważ łańcuchy w Pythonie są iterowalne po znaku, są one akceptowalnym argumentem do writerow, ale otrzymujesz powyższe dane wyjściowe.
Aby to poprawić, możesz podzielić wartość na podstawie białych znaków (zakładam, że tego chcesz)
źródło
Dzieje się tak, ponieważ gdy metoda group () instancji MatchObject zwraca tylko jedną wartość, zwraca ją jako ciąg. Gdy istnieje wiele wartości, są one zwracane jako krotka ciągów.
Jeśli piszesz wiersz, myślę, że csv.writer iteruje po obiekcie, który do niego przekazujesz. Jeśli przekażesz pojedynczy ciąg (który jest iterowalny), iteruje on po swoich znakach, dając wynik, który obserwujesz. Jeśli przekażesz krotkę ciągów, otrzyma ona rzeczywisty ciąg, a nie pojedynczy znak w każdej iteracji.
źródło