Форум сайта python.su
0
Написал парсер для сайта, экспотирующий в csv-файлики результаты. Писал и отлаживал под виндой в среде Wing IDE. Использовал Python 3.2.2 и lxml-2.3.4.win-amd64.
Результат удовлетворил, но.. перенёс 1:1 скрипт на unix-платформу (Python 3.2.3, lxml-2.3.4) и результат экспорта оказался совсем иным. В чём прикол?
Офлайн
Телепаты в отпуске. Учитесь вопросы составлять правильно.
Офлайн
0
Вот код парсера. По неопытности, причин, кроме кодировки и разных версий питона не вижу, но что-то мне подсказывает, что дело не в этом..
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()
Офлайн
Т.е. вы запускали несколько раз на windows, потом несколько раз на linux, это всё происходило в одно и то же время. На windows все результаты совпали, на linux тоже, но были различия между windows и linux результатами. Так? Что за различия?
Офлайн
0
совершенно верно, несколько запусков на винде, несколько под никсами. Разный результат м/у платформами. В рамках одной платформы результаты между запусками одинаковые.
Различия в количестве распарсенных элементов. Некоторые файлы совершенно пустые.
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
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
Офлайн
9
Доступ к файлам на Линухе какой?
Офлайн
20
Дебажить надо. Хотя бы println натыкать чтобы видеть промежуточные результаты и понять какой код косячит.
Офлайн
0
helm2004
с правами всё в порядке, скрипт выполняется в каталоге пользователя. Файлы создаются из под него же с нуля
Soteric
есть подозрение, что запросы xpath некорректные результаты возвращают под никсом.. но это тем более странно, учитывая, что разница в версиях отличается только в том, что под виндой либа x86-64, а под никсами - x86_32
Офлайн
Надо сократить код до минимального, воспроизводящего багу. Например, запрашивать только один документ, которые заведомо разные результаты даст. Проверить, что скачанная страница содержит один и тот же код под windows и под linux и т.д. Просто всё перебрать построчно в дебагере.
Офлайн
0
сократил код до
#!/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))
Отредактировано asphix (Июнь 19, 2012 14:28:00)
Офлайн