Найти - Пользователи
Полная версия: Grab и xpath
Начало » Python для новичков » Grab и xpath
1
aydat
Всем привет, пытаюсь спарсить отсюад: Your text to link here…

КБК, ввида

Коды бюджетной классификации;Наименование доходов
Написал, все прекрасно парсит, почти все…
Дело в том, что структура xpath немного ошибочная в документе
Проверил Коды бюджетной классификации и пути выходят такие:

 //*[@id="main"]/div[2]/table/tbody/tr[2]/td[2]/p
//*[@id="main"]/div[2]/table/tbody/tr[3]/td[2]/p[1]
//*[@id="main"]/div[2]/table/tbody/tr[4]/td[2]/p[1]
//*[@id="main"]/div[2]/table/tbody/tr[5]/td[2]/p
//*[@id="main"]/div[2]/table/tbody/tr[9]/td[2]/p[2]
//*[@id="main"]/div[2]/table/tbody/tr[7]/td[2]/p[1]
//*[@id="main"]/div[2]/table/tbody/tr[5]/td[2]/p
//*[@id="main"]/div[2]/table/tbody/tr[7]/td[2]/p[1]


Код:

 from grab import Grab, GrabError
import time
import random
g = Grab()
g.setup(log_dir='log')
kbk=open('ipkbk.txt').read().splitlines()
kbkres= open('kbk_ip.txt','w')
for x in range(len(kbk)):
    try: 
        time.sleep(random.randint(5,15))
        g.go(kbk[x])
        sp = [
        '//*[@id="main"]/div[2]/table/tbody/tr/td[2]/p',
	'//*[@id="main"]/div[2]/table/tbody/tr/td[1]/p'
        ]
        result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
        for show in zip(*result):
            print 'IP'+';'.join(show).encode('utf-8')
            print>>kbkres,'IP'+';'.join(show).encode('windows 1251')
            
    except GrabError:
        time.sleep(120)
        g.go(kbk[x])
        sp = [
        '//*[@id="main"]/div[2]/table/tbody/tr/td[2]/p',
	'//*[@id="main"]/div[2]/table/tbody/tr/td[1]/p'
        ]
        result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
        for show in zip(*result):
            print 'IP'+';'.join(show).encode('utf-8')
            print>>kbkres,'IP'+';'.join(show).encode('windows 1251')
kbkres.close()

Результат, смещенный и некоторых кбк нету
 IPКоды бюджетной классификации;Наименование доходов
IP182 1 01 02010 01 1000 110;Налог на доходы физических лиц с доходов, источником которых является налоговый агент, за исключением доходов, в отношении которых исчисление и уплата налога осуществляются в соответствии со статьями 227, 2271 и 228 Налогового кодекса Российской Федерации (сумма платежа (перерасчеты, недоимка и задолженность по соответствующему платежу, в том числе по отмененному)
IP182 1 01 02010 01 2100 110;Налог на доходы физических лиц с доходов, источником которых является налоговый агент, за исключением доходов, в отношении которых исчисление и уплата налога осуществляются в соответствии со статьями 227, 2271 и 228 Налогового кодекса Российской Федерации (пени по соответствующему платежу)
IP;Налог на доходы физических лиц с доходов, источником которых является налоговый агент, за исключением доходов, в отношении которых исчисление и уплата налога осуществляются в соответствии со статьями 227, 2271 и 228 Налогового кодекса Российской Федерации (проценты по соответствующему платежу)
IP182 1 01 02010 01 2200 110;Налог на доходы физических лиц с доходов, источником которых является налоговый агент, за исключением доходов, в отношении которых исчисление и уплата налога осуществляются в соответствии со статьями 227, 2271 и 228 Налогового кодекса Российской Федерации (суммы денежных взысканий (штрафов) по соответствующему платежу согласно законодательству Российской Федерации)
IP;Налог на доходы физических лиц с доходов, полученных от осуществления деятельности физическими лицами, зарегистрированными в качестве индивидуальных предпринимателей, нотариусов, занимающихся частной практикой, адвокатов, учредивших адвокатские кабинеты и других лиц, занимающихся частной практикой в соответствии со статьей 227 Налогового кодекса Российской Федерации (сумма платежа (перерасчеты, недоимка и задолженность по соответствующему платежу, в том числе по отмененному)
IP182 1 01 02010 01 3000 110;Налог на доходы физических лиц с доходов, полученных от осуществления деятельности физическими лицами, зарегистрированными в качестве индивидуальных предпринимателей, нотариусов, занимающихся частной практикой, адвокатов, учредивших адвокатские кабинеты и других лиц, занимающихся частной практикой в соответствии со статьей 227 Налогового кодекса Российской Федерации (пени по соответствующему платежу)
IP182 1 01 02020 01 1000 110;Налог на доходы физических лиц с доходов, полученных от осуществления деятельности физическими лицами, зарегистрированными в качестве индивидуальных предпринимателей, нотариусов, занимающихся частной практикой, адвокатов, учредивших адвокатские кабинеты и других лиц, занимающихся частной практикой в соответствии со статьей 227 Налогового кодекса Российской Федерации (проценты по соответствующему платежу)
IP182 1 01 02020 01 2100 110;Налог на доходы физических лиц с доходов, полученных от осуществления деятельности физическими лицами, зарегистрированными в качестве индивидуальных предпринимателей, нотариусов, занимающихся частной практикой, адвокатов, учредивших адвокатские кабинеты и других лиц, занимающихся частной практикой в соответствии со статьей 227 Налогового кодекса Российской Федерации (суммы денежных взысканий (штрафов) по соответствующему платежу согласно законодательству Российской Федерации)

Как быть в таких случаях?
aydat
Гуру, нужна ваша помощь
py.user.next
Разложи всё на функции. Так у тебя свалка какая-то, в которой что-нибудь изменишь, из-за этого всё остальное сломается и даже не узнаешь. Код нужно изолировать, чтобы одна часть на другую никак не влияла, тогда его и менять можно.
Здесь почитаешь про модули.
aydat
py.user.next
Разложи всё на функции. Так у тебя свалка какая-то, в которой что-нибудь изменишь, из-за этого всё остальное сломается и даже не узнаешь. Код нужно изолировать, чтобы одна часть на другую никак не влияла, тогда его и менять можно.Здесь почитаешь про модули.

Решил я свою проблему поменяв путь на :
 '//*[@id="main"]/div[2]/table/tbody/tr/td[2]/p[1]',

к модульному программированию надеюсь скоро приду
aydat
Всем привет, наконец-то поправил код, и теперь парсит от и до, (были косяки в html разметки)

Вопрос следующий, хочу 3 параметром парсить вид кбк (ИП,ФЛ,ЮЛ), сейчас я тупо добавляю его при выводе на экран
  print 'IP'+';'.join(show).encode('utf-8')
Как можно это реализовать, в ссылках есть данная информация,
https://www.nalog.ru/rn77/taxation/kbk/ip/ndfl/
https://www.nalog.ru/rn77/taxation/kbk/fl/ndfl/
https://www.nalog.ru/rn77/taxation/kbk/yul/ndfl/
или это нужно парсить из контента, тоже есть такая возможность

 # -*- coding: utf-8 -*-
from grab import Grab, GrabError
import time
import random
g = Grab()
g.setup(log_dir='log')
kbk=open('ipkbk.txt').read().splitlines()
kbkres= open('kbk_ip.txt','w')
for x in range(len(kbk)):
    try: 
        time.sleep(random.randint(5,15))
        g.go(kbk[x])
        sp = [
        '//*[@id="main"]/div[2]/table/tbody/tr[position() > 1]/td[2]',
        '//*[@id="main"]/div[2]/table/tbody/tr[position() > 1]/td[1]/p[1]'
        ]
        result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
        for show in zip(*result): 
            print 'IP'+';'.join(show).encode('utf-8')
            print>>kbkres,'IP;'+';'.join(show).encode('windows 1251')   
    except GrabError:
        time.sleep(120)
        g.go(kbk[x])
        sp = [
        '//*[@id="main"]/div[2]/table/tbody/tr[position() > 1]/td[2]',
        '//*[@id="main"]/div[2]/table/tbody/tr[position() > 1]/td[1]/p[1]'
        ]
        result = [[i.text() for i in g.doc.select(sp[j])] for j in range(len(sp))]
        for show in zip(*result):
            print 'IP'+';'.join(show).encode('utf-8')
            print>>kbkres,'IP;'+';'.join(show).encode('windows 1251')
kbkres.close()

Ап
регуляркой выпарсил вид кбк
kbk[x]=re.findall(r'https://www.nalog.ru/rn77/taxation/kbk/(.*)/.*/$', kbk[x])
Каким образом мне его теперь в список добавить?

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB