Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 19, 2012 10:42:56

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

разный результат под разными платформами

Написал парсер для сайта, экспотирующий в csv-файлики результаты. Писал и отлаживал под виндой в среде Wing IDE. Использовал Python 3.2.2 и lxml-2.3.4.win-amd64.

Результат удовлетворил, но.. перенёс 1:1 скрипт на unix-платформу (Python 3.2.3, lxml-2.3.4) и результат экспорта оказался совсем иным. В чём прикол?

Офлайн

#2 Июнь 19, 2012 11:26:06

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

разный результат под разными платформами

Телепаты в отпуске. Учитесь вопросы составлять правильно.

Офлайн

#3 Июнь 19, 2012 12:03:31

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

разный результат под разными платформами

Вот код парсера. По неопытности, причин, кроме кодировки и разных версий питона не вижу, но что-то мне подсказывает, что дело не в этом..

import lxml.html
import re
#----------------------------------------------------------------------
def parse(p_url):
    x_path = "//*[starts-with(@id, 'pr2cart_')]/td/div[2]"
    
    HTMLtree = lxml.html.parse(p_url)
   
    articles = HTMLtree.xpath(x_path + "/p[1]/text()")
    titles = HTMLtree.xpath(x_path + "/span/a/text()")
    counts = HTMLtree.xpath(x_path + "/p[2]/span/@title")
    prices = HTMLtree.xpath(x_path + "/*//td[1]/b/text()")
    descrs = HTMLtree.xpath("//*[starts-with(@id, 's_desc_')]")
    
    s_lines = []
    
    for cod, prod, price, count, descr in zip(articles, titles, prices, counts, descrs):
        s_lines.append("{0};{1};{2};{3};{4}\n".format(re.findall('([0-9]+)', cod)[0],
                                                      ' '.join(prod.split()),
                                                      re.findall('([0-9.]+)\s', price)[0],
                                                      re.findall('([0-9]+)', count)[0],
                                                      re.sub('[\r\n\t]', '', descr.text_content())))
    return s_lines
#----------------------------------------------------------------------
def save_csv(p_filename, p_data):
    F = open('csv\{0}.csv'.format(p_filename), 'w', encoding='utf-8')
    for line in p_data:
        F.write(line)
    F.close()
#----------------------------------------------------------------------
def main():
    """ variables """
    url = "http://www.url.ru/position~{0}.html"
    cameras = {'pos1':62,
               'pos2':69,
               'pos3':157,
               'pos4':44,
               'pos5':19,
               'pos6':2,
               'pos7':45,
               'pos8':11,
               'pos9':1}
    """ code """
    for cam in cameras:
        s_lines = parse(url.format(cameras[cam]))
        save_csv("{0}_{1}".format(cam, len(s_lines)), s_lines)
#----------------------------------------------------------------------
if __name__ == "__main__":
    main()

Офлайн

#4 Июнь 19, 2012 12:59:25

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

разный результат под разными платформами

Т.е. вы запускали несколько раз на windows, потом несколько раз на linux, это всё происходило в одно и то же время. На windows все результаты совпали, на linux тоже, но были различия между windows и linux результатами. Так? Что за различия?

Офлайн

#5 Июнь 19, 2012 13:14:04

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

разный результат под разными платформами

совершенно верно, несколько запусков на винде, несколько под никсами. Разный результат м/у платформами. В рамках одной платформы результаты между запусками одинаковые.

Различия в количестве распарсенных элементов. Некоторые файлы совершенно пустые.

Unix:

pos1_113.csv   
pos2_0.csv      
pos3_6.csv     
pos4_77.csv    
pos5_68.csv  
pos6_60.csv
pos7_0.csv    
pos8_0.csv   
pos9_58.csv

Windows:
pos1_113.csv   
pos2_72.csv      
pos3_6.csv     
pos4_77.csv    
pos5_68.csv  
pos6_60.csv
pos7_16.csv    
pos8_35.csv   
pos9_40.csv

результат виндовый заведомо верный (проверенно вручную)

Офлайн

#6 Июнь 19, 2012 13:17:43

helm2004
От: Украина, Винница
Зарегистрирован: 2008-02-27
Сообщения: 630
Репутация: +  9  -
Профиль   Отправить e-mail  

разный результат под разными платформами

Доступ к файлам на Линухе какой?

Офлайн

#7 Июнь 19, 2012 13:30:57

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

разный результат под разными платформами

Дебажить надо. Хотя бы println натыкать чтобы видеть промежуточные результаты и понять какой код косячит.



Офлайн

#8 Июнь 19, 2012 14:07:45

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

разный результат под разными платформами

helm2004
с правами всё в порядке, скрипт выполняется в каталоге пользователя. Файлы создаются из под него же с нуля

Soteric
есть подозрение, что запросы xpath некорректные результаты возвращают под никсом.. но это тем более странно, учитывая, что разница в версиях отличается только в том, что под виндой либа x86-64, а под никсами - x86_32

Офлайн

#9 Июнь 19, 2012 14:13:35

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

разный результат под разными платформами

Надо сократить код до минимального, воспроизводящего багу. Например, запрашивать только один документ, которые заведомо разные результаты даст. Проверить, что скачанная страница содержит один и тот же код под windows и под linux и т.д. Просто всё перебрать построчно в дебагере.

Офлайн

#10 Июнь 19, 2012 14:27:25

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

разный результат под разными платформами

сократил код до

#!/usr/local/bin/python3
from lxml import html
HTMLtree = html.parse("http://www.url.ru/index.html")
name = HTMLtree.xpath("//h1[@class='disableH1']/text()")
print("name={0}".format(name))

в итоге под виндовс результат выводит, а под юниксом нет
полагаю, что дело в lxml

Отредактировано asphix (Июнь 19, 2012 14:28:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version