示例#1
0
 def _add_value(self, field_name, value):
     value = arg_to_iter(value)
     processed_value = self._process_input_value(field_name, value)
     if processed_value:
         self._values.setdefault(field_name, [])
         if type(arg_to_iter(processed_value)) == list:
             self._values[field_name] += arg_to_iter(processed_value)
         else:
             self._values[field_name].append(arg_to_iter(processed_value))
示例#2
0
 def process_digit(values, only_digit=True):
     # Функция для приведения сток к числовым переменным
     # Если в строке содержаться недопустимые для чисел символы
     # Не останавливает выполнение программы. В случае исключения
     # сохраняет None если only_digit=True или исходную строку.
     # Всегда возвращает список
     values = arg_to_iter(values)
     for i, value in enumerate(values):
         value = value.replace(' ', '').replace(',', '.')
         if '.' in value:
             try:
                 values[i] = float(value)
             except Exception as e:
                 if only_digit:
                     print(
                         "Error in ProductsparserItem with %s value=%r error='%s: %s'"
                         %
                         ('process_digit', value, type(e).__name__, str(e)))
                     values[i] = None
         else:
             try:
                 values[i] = int(value)
             except Exception as e:
                 if only_digit:
                     print(
                         "Error in ProductsparserItem with %s value=%r error='%s: %s'"
                         %
                         ('process_digit', value, type(e).__name__, str(e)))
                     values[i] = None
     return values
示例#3
0
 def __call__(self, value, loader_context=None):
     values = arg_to_iter(value)
     if loader_context:
         context = ChainMap(loader_context, self.default_loader_context)
     else:
         context = self.default_loader_context
     wrapped_funcs = [wrap_loader_context(f, context) for f in self.functions]
     for func in wrapped_funcs:
         next_values = []
         for v in values:
             try:
                 next_values += arg_to_iter(func(v))
             except Exception as e:
                 raise ValueError("Error in MapCompose with "
                                  "%s value=%r error='%s: %s'" %
                                  (str(func), value, type(e).__name__,
                                   str(e)))
         values = next_values
     return values
示例#4
0
 def __init__(self, item=None, selector=None, parent=None, **context):
     self.selector = selector
     context.update(selector=selector)
     if item is None:
         item = self.default_item_class()
     self._local_item = item
     context['item'] = item
     self.context = context
     self.parent = parent
     self._local_values = defaultdict(list)
     # values from initial item
     for field_name, value in ItemAdapter(item).items():
         self._values[field_name] += arg_to_iter(value)
示例#5
0
    def get_value(self, value, *processors, **kw):
        """
        Process the given ``value`` by the given ``processors`` and keyword
        arguments.

        Available keyword arguments:

        :param re: a regular expression to use for extracting data from the
            given value using :meth:`~parsel.utils.extract_regex` method,
            applied before processors
        :type re: str or compiled regex

        Examples:

        >>> from itemloaders import ItemLoader
        >>> from itemloaders.processors import TakeFirst
        >>> loader = ItemLoader()
        >>> loader.get_value('name: foo', TakeFirst(), str.upper, re='name: (.+)')
        'FOO'
        """
        regex = kw.get('re', None)
        if regex:
            value = arg_to_iter(value)
            value = flatten(extract_regex(regex, x) for x in value)

        for proc in processors:
            if value is None:
                break
            _proc = proc
            proc = wrap_loader_context(proc, self.context)
            try:
                value = proc(value)
            except Exception as e:
                raise ValueError(
                    "Error with processor %s value=%r error='%s: %s'" %
                    (_proc.__class__.__name__, value, type(e).__name__,
                     str(e)))
        return value
示例#6
0
 def _get_cssvalues(self, csss, **kw):
     self._check_selector_method()
     csss = arg_to_iter(csss)
     return flatten(self.selector.css(css).getall() for css in csss)
示例#7
0
 def _get_xpathvalues(self, xpaths, **kw):
     self._check_selector_method()
     xpaths = arg_to_iter(xpaths)
     return flatten(self.selector.xpath(xpath).getall() for xpath in xpaths)
示例#8
0
 def _add_value(self, field_name, value):
     value = arg_to_iter(value)
     processed_value = self._process_input_value(field_name, value)
     if processed_value:
         self._values.setdefault(field_name, [])
         self._values[field_name] += arg_to_iter(processed_value)
示例#9
0
    def test_arg_to_iter(self):
        assert hasattr(arg_to_iter(None), '__iter__')
        assert hasattr(arg_to_iter(100), '__iter__')
        assert hasattr(arg_to_iter('lala'), '__iter__')
        assert hasattr(arg_to_iter([1, 2, 3]), '__iter__')
        assert hasattr(arg_to_iter(l for l in 'abcd'), '__iter__')

        self.assertEqual(list(arg_to_iter(None)), [])
        self.assertEqual(list(arg_to_iter('lala')), ['lala'])
        self.assertEqual(list(arg_to_iter(100)), [100])
        self.assertEqual(list(arg_to_iter(l for l in 'abc')), ['a', 'b', 'c'])
        self.assertEqual(list(arg_to_iter([1, 2, 3])), [1, 2, 3])
        self.assertEqual(list(arg_to_iter({'a': 1})), [{'a': 1}])