Проблема с Python CSV, помещая каждую букву в новое поле - PullRequest
0 голосов
/ 01 июля 2011

Я пытаюсь поместить список URL-адресов в файл CSV, который я удаляю с веб-страницы, используя urllib2 и BeautifulSoup. Я попытался написать ссылки на CSV-файл в формате Unicode, а также преобразовал в UTF-8. В обоих случаях каждая буква вставляется в новое поле.

Вот мой код (я пробовал по крайней мере эти два способа):

f = open('filename','wb')
w = csv.writer(f,delimiter=',')
for link in links:
    w.writerow(link['href'])

И

f = open('filename','wb')
w = csv.writer(f,delimiter=',')
for link in links:
    w.writerow(link['href'].encode('utf-8'))

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

[<a href="#Flyout1" accesskey="2" class="quicklinks" tabindex="1" title="Skip to content">Quick Links: Skip to main page content</a>, <a href="#search" class="quicklinks" tabindex="1" title="Skip to search">Skip to Search</a>, <a href="#News" class="quicklinks" tabindex="1" title="Skip to Section table of contents">Skip to Section Content Menu</a>, <a href="#footer" class="quicklinks" tabindex="1" title="Skip to site options">Skip to Common Links</a>, <a href="http://www.hhs.gov"><img src="/ucm/groups/fdagov-public/@system/documents/system/img_fdagov_hhs_gov.png" alt="www.hhs.gov link" style="width:112px; height:18px;" border="0" /></a>]

Не на всех ссылках есть ключ 'href', но я проверяю это в коде, который здесь не показан. В обоих случаях правильные строки записываются в файл csv, но каждая буква находится в новом поле.

Есть мысли?

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

Из документов : «Строка должна быть последовательностью строк или чисел ...» Вы передаете одну строку, а не последовательность строк, поэтому каждая буква рассматривается как элемент.Поместите вашу строку в список.

Поэтому измените w.writerow(link['href']) на w.writerow([link['href']]).

Примечание: CSV-файл с одним столбцом выглядит точно как плоский текстфайл.Может быть, вам не нужен CSV.

2 голосов
/ 01 июля 2011

Согласно документам , writerow() берет итеративный объект и, перебирая его, печатает его CSV-представление. Ваша проблема - строка итеративный объект. Если у меня есть:

mystring = 'foo'

Python позволяет мне повторяться так:

for c in mystring:
    print c

И я получу:

f
o
o

Это удобная функция, но в этом случае она работает против вас.

Вы не хотите, чтобы writerow() перебирал строку , вы хотите, чтобы она перебирала список строк - разделяя строки запятыми, а не символами , В этом случае вы захотите составить список из следующих строк:

w.writerow([link['href']])
2 голосов
/ 01 июля 2011

Я думаю, что под "каждой буквой, вставленной в новое поле", вы подразумеваете что-то вроде этого, верно?

h,t,t,p,:,/,/,w,w,w,.,g,o,o,g,l,e,.,c,o,m

Если это так, то writerow() выполняет итерацию по символам в вашей строке и интерпретируетте, как отдельные столбцы.Попробуйте вместо этого использовать writerow([link['href']]).

Редактировать : Похоже, @Steven Rumbalski превзошел меня в этом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...