LINUX.ORG.RU

Наколеночный скрипт Python

 , , ,


1

1

В продолжение прошлой темы, я, как любитель K&R C Book, накропал вот такой «наколеночный» говнокод,

чтобы парсить исходники из глав (сорцы внутри тега pre).

Прошу спецов по Питону его усовершенствовать, т.к. с Цирко-Змеем практически не знаком.

Код


#!/usr/bin/python
import sys
from bs4 import BeautifulSoup

 

soup = BeautifulSoup(open(sys.argv[1],'r'))
foutput = open(sys.argv[2],'w')
y = soup.find_all('pre') 
for a in y:
	z = a.string
	foutput.write(z)
★★★★★

Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Нет, я бы не догадался до такого.

anonymous
()
Ответ на: комментарий от anonymous

Получилось такое

#!/usr/bin/python
"""
Usage: script.py (<input> <output>)...
"""
from docopt import docopt
from bs4 import BeautifulSoup

args = docopt(__doc__)
for key, value in zip(args['<input>'], args['<output>']):
	soup = BeautifulSoup(open(key, 'r'))
	foutput = open(value, 'w')
	y = soup.find_all('pre')
	for a in y:
            z = a.string
	    foutput.write(z)

Вызывается вот так

./parse3.py ch1kr.html ch1kr.c ch2kr.html ch2kr.c

И ругается, по-моему известной ошибкой

File "./parse3.py", line 16, in <module>
    foutput.write(z)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 6: ordinal not in range(128)

Я так понимаю, из-за нее скрипт не обрабатывает вторую пару аргументов?

Или я чего то не понял с вложенной итерацией по списку содержимого тегов.

Что делать?

Twissel ★★★★★
() автор топика

Неа, Суп почему-то парсит только первые несколько тегов pre

Как это дело причешем надо будет другой парсер попробовать (((

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Может он крашится из-за комментариев на русском внутри тега, в кодировке CP-1251.

Скорее всего...

Twissel ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Короче говоря, вот сама разметка https://dl.dropboxusercontent.com/u/50518517/kr_cbook.zip

Будет желание посмотри, что там не того... а на нет и суда нет, если что ;-)

А я попозже сам еще с этой фигней помучаюсь.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel
#!/usr/bin/python
"""
Usage: script.py (<input> <output>)...
"""
from docopt import docopt
from bs4 import BeautifulSoup

args = docopt(__doc__)
for key, value in zip(args['<input>'], args['<output>']):
    soup = BeautifulSoup(open(key, 'r'))

    with open(value, 'w') as output:
        for pre in soup.find_all('pre'):
            if not pre.string:
                continue

            output.write(pre.string.encode('utf-8'))
anonymous
()
Ответ на: комментарий от anonymous

Все работает.

Большое спасибо за помощь, все парсится без проблем.

Жаль, что не могу нынче помочь рублём)))

Twissel ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Просто пожелаю удачи во всех начинаниях и хорошего летнего отпуска)))

Twissel ★★★★★
() автор топика

Если кому интересно, реализуйте такой же парсер на sed, хочу глянуть как это будет выглядеть.

Действительно, кодинг на Питоне (пусть даже без необходимых знаний и под «пинками» ЛОРовцев) доставляет особое эстетическое удовольствие :-D

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.