12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- # -*- coding: utf-8 -*-
- import BeautifulSoup
- import datetime
- import dateutil.parser
- import dingguo
- import email.message
- import ioex
- import pytz
- import re
- def parse_order_confirmation_mail(mail):
- assert isinstance(mail, email.message.Message)
- html = mail.get_payload()[1].get_payload(decode = True).decode('utf-8')
- if not u'订单详情' in html:
- raise Exception()
- doc = BeautifulSoup.BeautifulSoup(html)
- for br in doc.findAll('br'):
- br.replaceWith('\n')
- def get_text(tag):
- return u''.join([c if type(c) is BeautifulSoup.NavigableString else get_text(c) for c in tag.contents])
- order = dingguo.Order(
- platform = u'amazon.cn',
- order_id = doc.find(text = re.compile(u'订单号')).findNext().text,
- order_date = dateutil.parser.parse(mail['date']),
- )
- article_table = doc.find(text = re.compile(u'订购日期')).findNext('table')
- for a in article_table.find('tbody').findChildren(recursive = False):
- image_col_tag, details_tag, price_tag = a.findAll('td', recursive = False)
- name_tag = details_tag.find('a')
- order.items.append(dingguo.Article(
- name = name_tag.text.strip(),
- price_brutto = dingguo.Sum.parse_text(price_tag.text),
- quantity = 1,
- reseller = name_tag.findNext(text = re.compile(u'由')).findNext().text,
- ))
- with ioex.setlocale('zh_CN.utf-8'):
- estimated_arrival_date_start = pytz.timezone('Asia/Shanghai').localize(
- datetime.datetime.strptime(
- doc.find(text = re.compile(u'预计送达日期:')).findNext('b').text.encode('utf-8'),
- '%A, %m/%d',
- ).replace(year = order.order_date.year)
- )
- assert estimated_arrival_date_start >= order.order_date
- order.items.append(dingguo.Shipping(
- name = doc.find(text = re.compile(u'送货方式:')).findNext('b').text,
- price_brutto = dingguo.Sum.parse_text(
- doc.find(text = re.compile(u'配送费:')).findNext().text
- ),
- estimated_arrival_time = ioex.datetimeex.Period(
- start = estimated_arrival_date_start,
- end = (estimated_arrival_date_start + datetime.timedelta(days = 1)),
- ),
- destination_point = '\n'.join([l.strip() for l in
- get_text(
- doc.find(text = re.compile(u'您的订单发送至:')).findNext('b')
- ).split('\n')
- ]),
- ))
- return [order]
|