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

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

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()
lorien
Т.е. вы запускали несколько раз на windows, потом несколько раз на linux, это всё происходило в одно и то же время. На windows все результаты совпали, на linux тоже, но были различия между windows и linux результатами. Так? Что за различия?
asphix
совершенно верно, несколько запусков на винде, несколько под никсами. Разный результат м/у платформами. В рамках одной платформы результаты между запусками одинаковые.

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

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

результат виндовый заведомо верный (проверенно вручную)
helm2004
Доступ к файлам на Линухе какой?
Soteric
Дебажить надо. Хотя бы println натыкать чтобы видеть промежуточные результаты и понять какой код косячит.
asphix
helm2004
с правами всё в порядке, скрипт выполняется в каталоге пользователя. Файлы создаются из под него же с нуля

Soteric
есть подозрение, что запросы xpath некорректные результаты возвращают под никсом.. но это тем более странно, учитывая, что разница в версиях отличается только в том, что под виндой либа x86-64, а под никсами - x86_32
lorien
Надо сократить код до минимального, воспроизводящего багу. Например, запрашивать только один документ, которые заведомо разные результаты даст. Проверить, что скачанная страница содержит один и тот же код под windows и под linux и т.д. Просто всё перебрать построчно в дебагере.
asphix
сократил код до

#!/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
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