Форум сайта python.su
0
Всем здрасьте! Я в питоне новичок, так что не судите строго. За советы заранее спасибо!
Цель - построить простой скрейпер. Конкретнее, имеется задача - используя mechanize зайти на украиноязычный сайт (сайт Верховной Рады, но думаю детали тут не так важны), используя BeautifulSoup вытащить из таблицы текст (только из одного столбца), немного его обработать (убрать HTML тэги и т.п.) и записать его с помощью модуля csv в файл.
Вот мой код:
from BeautifulSoup import BeautifulSoup from mechanize import Browser import csv url = 'http://w1.c1.rada.gov.ua/pls/zweb2/webproc4_1?pf3511=48671' br = Browser() br.open(url) soup = BeautifulSoup(br.response()) div = soup.find('div', attrs={'class':'zp-info'}) content = div.findAll('dd') output = [] for d in content: output.append(d.text.strip().split(',')) outfile = open('test_out.txt', 'w') writer = csv.writer(outfile) writer.writerows(output)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-7: ordinal not in range(128)
print output
proper = repr(output).decode('raw_unicode_escape') print proper
Офлайн
31
# coding: cp1251 import csv rows=[[u'\xca\xe0\xe1\xb3\xed\xe5\xf2 '], [u'3 \xf1\xe5\xf1\xb3\xff VII \xf1\xea\xeb\xe8\xea\xe0\xed\xed\xff']] outfile = open('test_out.txt', 'w') writer = csv.writer(outfile) for i in rows: result = ''.join(i) print result.encode('ISO 8859-1') writer.writerows(result.encode('ISO 8859-1')) s = u'\xf1' print s.encode('ISO 8859-1')
Отредактировано sanodin (Окт. 16, 2013 12:07:27)
Офлайн
0
sanodinSanodin, большое спасибо! Но, к сожалению, проблему не решило.rows==output# coding: cp1251 import csv rows=[[u'\xca\xe0\xe1\xb3\xed\xe5\xf2 '], [u'3 \xf1\xe5\xf1\xb3\xff VII \xf1\xea\xeb\xe8\xea\xe0\xed\xed\xff']] outfile = open('test_out.txt', 'w') writer = csv.writer(outfile) for i in rows: result = ''.join(i) print result.encode('ISO 8859-1') writer.writerows(result.encode('ISO 8859-1')) s = u'\xf1' print s.encode('ISO 8859-1')
print output
[[u'3424 \u0432\u0456\u0434 14.10.2013'], [u'3 \u0441\u0435\u0441\u0456\u044f VII \u0441\u043a\u043b\u0438\u043a\u0430\u043d\u043d\u044f'],...
print output.encode('ISO 8859-1')
AttributeError: 'list' object has no attribute 'encode'
print output
for d in content: output.append(d.text.strip().split(','))
type(result)
<type 'list'>
Отредактировано roloyar (Окт. 16, 2013 17:29:39)
Офлайн
31
Все работает…не понимаю, объясните что нужно
from BeautifulSoup import BeautifulSoup from mechanize import Browser import csv url = 'http://w1.c1.rada.gov.ua/pls/zweb2/webproc4_1?pf3511=48671' br = Browser() br.open(url) soup = BeautifulSoup(br.response()) div = soup.find('div', attrs={'class':'zp-info'}) content = div.findAll('dd') output = [] for d in content: output.append(d.text.strip().split(',')) outfile = open('test_out.txt', 'w') writer = csv.writer(outfile) for i in output: result = ''.join(i) print result.encode('ISO 8859-1') writer.writerows(result.encode('ISO 8859-1'))
Отредактировано sanodin (Окт. 16, 2013 18:03:16)
Офлайн
47
csv модуль из python2 напрямую не работает с unicode, поэтому ему надо отдавать закодированную информацию
Офлайн
0
sanodinУ меня если запустить скрипт в чистом виде (как у вас) то выдает ошибку:
Все работает…не понимаю, объясните что нужно
from BeautifulSoup import BeautifulSoup
from mechanize import Browser
import csv
url = 'http://w1.c1.rada.gov.ua/pls/zweb2/webproc4_1?pf3511=48671'
br = Browser()
br.open(url)
soup = BeautifulSoup(br.response())
div = soup.find('div', attrs={'class':'zp-info'})
content = div.findAll('dd')
output =
for d in content:
output.append(d.text.strip().split(','))
outfile = open('test_out.txt', ‘w’)
writer = csv.writer(outfile)
for i in output:
result = ‘'.join(i)
print result.encode(’ISO 8859-1')
writer.writerows(result.encode('ISO 8859-1'))
единственное, записывает в файл по одному символу в строке, ну это Вы и сами переделаете
Офлайн
0
bismigalisЗакодированную в каком виде?
csv модуль из python2 напрямую не работает с unicode, поэтому ему надо отдавать закодированную информацию
Офлайн
31
а просто в cp1251 ?
это
u'3424 \u0432\u0456\u0434 14.10.2013'
u=u'3424 \u0432\u0456\u0434 14.10.2013' print u.encode('cp1251')
Отредактировано sanodin (Окт. 16, 2013 18:30:59)
Офлайн
0
sanodin
а просто в cp1251 ?
это
u'3424 \u0432\u0456\u0434 14.10.2013'
u=u'3424 \u0432\u0456\u0434 14.10.2013'
print u.encode('cp1251')
Офлайн
31
у вас список списков, переделать в строку и все
а в моем коде вы так делали ?
.encode('cp1251')
.decode('cp1251')
Отредактировано sanodin (Окт. 16, 2013 19:00:23)
Офлайн