diff --git a/.gitignore b/.gitignore
new file mode 100755
index 0000000..e3d7cd0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,74 @@
+### Linux template
+*~
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+### Python template
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+*.pyc
+*.egg
+*.egg-info
+*.dmp
+*.zip
+.DS_Store
diff --git a/.travis.yml b/.travis.yml
new file mode 100755
index 0000000..e002ddb
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,25 @@
+language: python
+sudo: false
+python:
+ - '3.6'
+ - '3.7'
+matrix:
+ allow_failures:
+ - python: '3.7'
+deploy:
+ provider: pypi
+ user: beni
+ password:
+ secure: XfUbc5Tnjq8mUHnv/rrQvcQ5m+k7mvk2sAwhS1Hzi2NFXaiPQF0YR2er0BDDQOFYba+MBd57l4zHdyti8Y39uVI2ZfY10c5KYio3VzXDU2doycLf7hY8cqKs8UioabVehrPU96GErVEUyA2Jj1cqrsIUX7Smj8qby0DfX+igJtM=
+ on:
+ tags: true
+ repo: abenassi/Google-Search-API
+install:
+- pip install -r requirements.txt
+- python setup.py install
+- pip install coveralls
+script:
+- nosetests
+after_success: coveralls
+os:
+- linux
diff --git a/BeautifulSoup.py b/BeautifulSoup.py
deleted file mode 100644
index 4b17b85..0000000
--- a/BeautifulSoup.py
+++ /dev/null
@@ -1,2014 +0,0 @@
-"""Beautiful Soup
-Elixir and Tonic
-"The Screen-Scraper's Friend"
-http://www.crummy.com/software/BeautifulSoup/
-
-Beautiful Soup parses a (possibly invalid) XML or HTML document into a
-tree representation. It provides methods and Pythonic idioms that make
-it easy to navigate, search, and modify the tree.
-
-A well-formed XML/HTML document yields a well-formed data
-structure. An ill-formed XML/HTML document yields a correspondingly
-ill-formed data structure. If your document is only locally
-well-formed, you can use this library to find and process the
-well-formed part of it.
-
-Beautiful Soup works with Python 2.2 and up. It has no external
-dependencies, but you'll have more success at converting data to UTF-8
-if you also install these three packages:
-
-* chardet, for auto-detecting character encodings
- http://chardet.feedparser.org/
-* cjkcodecs and iconv_codec, which add more encodings to the ones supported
- by stock Python.
- http://cjkpython.i18n.org/
-
-Beautiful Soup defines classes for two main parsing strategies:
-
- * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific
- language that kind of looks like XML.
-
- * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid
- or invalid. This class has web browser-like heuristics for
- obtaining a sensible parse tree in the face of common HTML errors.
-
-Beautiful Soup also defines a class (UnicodeDammit) for autodetecting
-the encoding of an HTML or XML document, and converting it to
-Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser.
-
-For more than you ever wanted to know about Beautiful Soup, see the
-documentation:
-http://www.crummy.com/software/BeautifulSoup/documentation.html
-
-Here, have some legalese:
-
-Copyright (c) 2004-2010, Leonard Richardson
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- * Neither the name of the the Beautiful Soup Consortium and All
- Night Kosher Bakery nor the names of its contributors may be
- used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT.
-
-"""
-from __future__ import generators
-
-__author__ = "Leonard Richardson (leonardr@segfault.org)"
-__version__ = "3.2.0"
-__copyright__ = "Copyright (c) 2004-2010 Leonard Richardson"
-__license__ = "New-style BSD"
-
-from sgmllib import SGMLParser, SGMLParseError
-import codecs
-import markupbase
-import types
-import re
-import sgmllib
-try:
- from htmlentitydefs import name2codepoint
-except ImportError:
- name2codepoint = {}
-try:
- set
-except NameError:
- from sets import Set as set
-
-#These hacks make Beautiful Soup able to parse XML with namespaces
-sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
-markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match
-
-DEFAULT_OUTPUT_ENCODING = "utf-8"
-
-def _match_css_class(str):
- """Build a RE to match the given CSS class."""
- return re.compile(r"(^|.*\s)%s($|\s)" % str)
-
-# First, the classes that represent markup elements.
-
-class PageElement(object):
- """Contains the navigational information for some part of the page
- (either a tag or a piece of text)"""
-
- def setup(self, parent=None, previous=None):
- """Sets up the initial relations between this element and
- other elements."""
- self.parent = parent
- self.previous = previous
- self.next = None
- self.previousSibling = None
- self.nextSibling = None
- if self.parent and self.parent.contents:
- self.previousSibling = self.parent.contents[-1]
- self.previousSibling.nextSibling = self
-
- def replaceWith(self, replaceWith):
- oldParent = self.parent
- myIndex = self.parent.index(self)
- if hasattr(replaceWith, "parent")\
- and replaceWith.parent is self.parent:
- # We're replacing this element with one of its siblings.
- index = replaceWith.parent.index(replaceWith)
- if index and index < myIndex:
- # Furthermore, it comes before this element. That
- # means that when we extract it, the index of this
- # element will change.
- myIndex = myIndex - 1
- self.extract()
- oldParent.insert(myIndex, replaceWith)
-
- def replaceWithChildren(self):
- myParent = self.parent
- myIndex = self.parent.index(self)
- self.extract()
- reversedChildren = list(self.contents)
- reversedChildren.reverse()
- for child in reversedChildren:
- myParent.insert(myIndex, child)
-
- def extract(self):
- """Destructively rips this element out of the tree."""
- if self.parent:
- try:
- del self.parent.contents[self.parent.index(self)]
- except ValueError:
- pass
-
- #Find the two elements that would be next to each other if
- #this element (and any children) hadn't been parsed. Connect
- #the two.
- lastChild = self._lastRecursiveChild()
- nextElement = lastChild.next
-
- if self.previous:
- self.previous.next = nextElement
- if nextElement:
- nextElement.previous = self.previous
- self.previous = None
- lastChild.next = None
-
- self.parent = None
- if self.previousSibling:
- self.previousSibling.nextSibling = self.nextSibling
- if self.nextSibling:
- self.nextSibling.previousSibling = self.previousSibling
- self.previousSibling = self.nextSibling = None
- return self
-
- def _lastRecursiveChild(self):
- "Finds the last element beneath this object to be parsed."
- lastChild = self
- while hasattr(lastChild, 'contents') and lastChild.contents:
- lastChild = lastChild.contents[-1]
- return lastChild
-
- def insert(self, position, newChild):
- if isinstance(newChild, basestring) \
- and not isinstance(newChild, NavigableString):
- newChild = NavigableString(newChild)
-
- position = min(position, len(self.contents))
- if hasattr(newChild, 'parent') and newChild.parent is not None:
- # We're 'inserting' an element that's already one
- # of this object's children.
- if newChild.parent is self:
- index = self.index(newChild)
- if index > position:
- # Furthermore we're moving it further down the
- # list of this object's children. That means that
- # when we extract this element, our target index
- # will jump down one.
- position = position - 1
- newChild.extract()
-
- newChild.parent = self
- previousChild = None
- if position == 0:
- newChild.previousSibling = None
- newChild.previous = self
- else:
- previousChild = self.contents[position-1]
- newChild.previousSibling = previousChild
- newChild.previousSibling.nextSibling = newChild
- newChild.previous = previousChild._lastRecursiveChild()
- if newChild.previous:
- newChild.previous.next = newChild
-
- newChildsLastElement = newChild._lastRecursiveChild()
-
- if position >= len(self.contents):
- newChild.nextSibling = None
-
- parent = self
- parentsNextSibling = None
- while not parentsNextSibling:
- parentsNextSibling = parent.nextSibling
- parent = parent.parent
- if not parent: # This is the last element in the document.
- break
- if parentsNextSibling:
- newChildsLastElement.next = parentsNextSibling
- else:
- newChildsLastElement.next = None
- else:
- nextChild = self.contents[position]
- newChild.nextSibling = nextChild
- if newChild.nextSibling:
- newChild.nextSibling.previousSibling = newChild
- newChildsLastElement.next = nextChild
-
- if newChildsLastElement.next:
- newChildsLastElement.next.previous = newChildsLastElement
- self.contents.insert(position, newChild)
-
- def append(self, tag):
- """Appends the given tag to the contents of this tag."""
- self.insert(len(self.contents), tag)
-
- def findNext(self, name=None, attrs={}, text=None, **kwargs):
- """Returns the first item that matches the given criteria and
- appears after this Tag in the document."""
- return self._findOne(self.findAllNext, name, attrs, text, **kwargs)
-
- def findAllNext(self, name=None, attrs={}, text=None, limit=None,
- **kwargs):
- """Returns all items that match the given criteria and appear
- after this Tag in the document."""
- return self._findAll(name, attrs, text, limit, self.nextGenerator,
- **kwargs)
-
- def findNextSibling(self, name=None, attrs={}, text=None, **kwargs):
- """Returns the closest sibling to this Tag that matches the
- given criteria and appears after this Tag in the document."""
- return self._findOne(self.findNextSiblings, name, attrs, text,
- **kwargs)
-
- def findNextSiblings(self, name=None, attrs={}, text=None, limit=None,
- **kwargs):
- """Returns the siblings of this Tag that match the given
- criteria and appear after this Tag in the document."""
- return self._findAll(name, attrs, text, limit,
- self.nextSiblingGenerator, **kwargs)
- fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x
-
- def findPrevious(self, name=None, attrs={}, text=None, **kwargs):
- """Returns the first item that matches the given criteria and
- appears before this Tag in the document."""
- return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs)
-
- def findAllPrevious(self, name=None, attrs={}, text=None, limit=None,
- **kwargs):
- """Returns all items that match the given criteria and appear
- before this Tag in the document."""
- return self._findAll(name, attrs, text, limit, self.previousGenerator,
- **kwargs)
- fetchPrevious = findAllPrevious # Compatibility with pre-3.x
-
- def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs):
- """Returns the closest sibling to this Tag that matches the
- given criteria and appears before this Tag in the document."""
- return self._findOne(self.findPreviousSiblings, name, attrs, text,
- **kwargs)
-
- def findPreviousSiblings(self, name=None, attrs={}, text=None,
- limit=None, **kwargs):
- """Returns the siblings of this Tag that match the given
- criteria and appear before this Tag in the document."""
- return self._findAll(name, attrs, text, limit,
- self.previousSiblingGenerator, **kwargs)
- fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x
-
- def findParent(self, name=None, attrs={}, **kwargs):
- """Returns the closest parent of this Tag that matches the given
- criteria."""
- # NOTE: We can't use _findOne because findParents takes a different
- # set of arguments.
- r = None
- l = self.findParents(name, attrs, 1)
- if l:
- r = l[0]
- return r
-
- def findParents(self, name=None, attrs={}, limit=None, **kwargs):
- """Returns the parents of this Tag that match the given
- criteria."""
-
- return self._findAll(name, attrs, None, limit, self.parentGenerator,
- **kwargs)
- fetchParents = findParents # Compatibility with pre-3.x
-
- #These methods do the real heavy lifting.
-
- def _findOne(self, method, name, attrs, text, **kwargs):
- r = None
- l = method(name, attrs, text, 1, **kwargs)
- if l:
- r = l[0]
- return r
-
- def _findAll(self, name, attrs, text, limit, generator, **kwargs):
- "Iterates over a generator looking for things that match."
-
- if isinstance(name, SoupStrainer):
- strainer = name
- # (Possibly) special case some findAll*(...) searches
- elif text is None and not limit and not attrs and not kwargs:
- # findAll*(True)
- if name is True:
- return [element for element in generator()
- if isinstance(element, Tag)]
- # findAll*('tag-name')
- elif isinstance(name, basestring):
- return [element for element in generator()
- if isinstance(element, Tag) and
- element.name == name]
- else:
- strainer = SoupStrainer(name, attrs, text, **kwargs)
- # Build a SoupStrainer
- else:
- strainer = SoupStrainer(name, attrs, text, **kwargs)
- results = ResultSet(strainer)
- g = generator()
- while True:
- try:
- i = g.next()
- except StopIteration:
- break
- if i:
- found = strainer.search(i)
- if found:
- results.append(found)
- if limit and len(results) >= limit:
- break
- return results
-
- #These Generators can be used to navigate starting from both
- #NavigableStrings and Tags.
- def nextGenerator(self):
- i = self
- while i is not None:
- i = i.next
- yield i
-
- def nextSiblingGenerator(self):
- i = self
- while i is not None:
- i = i.nextSibling
- yield i
-
- def previousGenerator(self):
- i = self
- while i is not None:
- i = i.previous
- yield i
-
- def previousSiblingGenerator(self):
- i = self
- while i is not None:
- i = i.previousSibling
- yield i
-
- def parentGenerator(self):
- i = self
- while i is not None:
- i = i.parent
- yield i
-
- # Utility methods
- def substituteEncoding(self, str, encoding=None):
- encoding = encoding or "utf-8"
- return str.replace("%SOUP-ENCODING%", encoding)
-
- def toEncoding(self, s, encoding=None):
- """Encodes an object to a string in some encoding, or to Unicode.
- ."""
- if isinstance(s, unicode):
- if encoding:
- s = s.encode(encoding)
- elif isinstance(s, str):
- if encoding:
- s = s.encode(encoding)
- else:
- s = unicode(s)
- else:
- if encoding:
- s = self.toEncoding(str(s), encoding)
- else:
- s = unicode(s)
- return s
-
-class NavigableString(unicode, PageElement):
-
- def __new__(cls, value):
- """Create a new NavigableString.
-
- When unpickling a NavigableString, this method is called with
- the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be
- passed in to the superclass's __new__ or the superclass won't know
- how to handle non-ASCII characters.
- """
- if isinstance(value, unicode):
- return unicode.__new__(cls, value)
- return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING)
-
- def __getnewargs__(self):
- return (NavigableString.__str__(self),)
-
- def __getattr__(self, attr):
- """text.string gives you text. This is for backwards
- compatibility for Navigable*String, but for CData* it lets you
- get the string without the CData wrapper."""
- if attr == 'string':
- return self
- else:
- raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr)
-
- def __unicode__(self):
- return str(self).decode(DEFAULT_OUTPUT_ENCODING)
-
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- if encoding:
- return self.encode(encoding)
- else:
- return self
-
-class CData(NavigableString):
-
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- return "" % NavigableString.__str__(self, encoding)
-
-class ProcessingInstruction(NavigableString):
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- output = self
- if "%SOUP-ENCODING%" in output:
- output = self.substituteEncoding(output, encoding)
- return "%s?>" % self.toEncoding(output, encoding)
-
-class Comment(NavigableString):
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- return "" % NavigableString.__str__(self, encoding)
-
-class Declaration(NavigableString):
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- return "" % NavigableString.__str__(self, encoding)
-
-class Tag(PageElement):
-
- """Represents a found HTML tag with its attributes and contents."""
-
- def _invert(h):
- "Cheap function to invert a hash."
- i = {}
- for k,v in h.items():
- i[v] = k
- return i
-
- XML_ENTITIES_TO_SPECIAL_CHARS = { "apos" : "'",
- "quot" : '"',
- "amp" : "&",
- "lt" : "<",
- "gt" : ">" }
-
- XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS)
-
- def _convertEntities(self, match):
- """Used in a call to re.sub to replace HTML, XML, and numeric
- entities with the appropriate Unicode characters. If HTML
- entities are being converted, any unrecognized entities are
- escaped."""
- x = match.group(1)
- if self.convertHTMLEntities and x in name2codepoint:
- return unichr(name2codepoint[x])
- elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS:
- if self.convertXMLEntities:
- return self.XML_ENTITIES_TO_SPECIAL_CHARS[x]
- else:
- return u'&%s;' % x
- elif len(x) > 0 and x[0] == '#':
- # Handle numeric entities
- if len(x) > 1 and x[1] == 'x':
- return unichr(int(x[2:], 16))
- else:
- return unichr(int(x[1:]))
-
- elif self.escapeUnrecognizedEntities:
- return u'&%s;' % x
- else:
- return u'&%s;' % x
-
- def __init__(self, parser, name, attrs=None, parent=None,
- previous=None):
- "Basic constructor."
-
- # We don't actually store the parser object: that lets extracted
- # chunks be garbage-collected
- self.parserClass = parser.__class__
- self.isSelfClosing = parser.isSelfClosingTag(name)
- self.name = name
- if attrs is None:
- attrs = []
- elif isinstance(attrs, dict):
- attrs = attrs.items()
- self.attrs = attrs
- self.contents = []
- self.setup(parent, previous)
- self.hidden = False
- self.containsSubstitutions = False
- self.convertHTMLEntities = parser.convertHTMLEntities
- self.convertXMLEntities = parser.convertXMLEntities
- self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities
-
- # Convert any HTML, XML, or numeric entities in the attribute values.
- convert = lambda(k, val): (k,
- re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);",
- self._convertEntities,
- val))
- self.attrs = map(convert, self.attrs)
-
- def getString(self):
- if (len(self.contents) == 1
- and isinstance(self.contents[0], NavigableString)):
- return self.contents[0]
-
- def setString(self, string):
- """Replace the contents of the tag with a string"""
- self.clear()
- self.append(string)
-
- string = property(getString, setString)
-
- def getText(self, separator=u""):
- if not len(self.contents):
- return u""
- stopNode = self._lastRecursiveChild().next
- strings = []
- current = self.contents[0]
- while current is not stopNode:
- if isinstance(current, NavigableString):
- strings.append(current.strip())
- current = current.next
- return separator.join(strings)
-
- text = property(getText)
-
- def get(self, key, default=None):
- """Returns the value of the 'key' attribute for the tag, or
- the value given for 'default' if it doesn't have that
- attribute."""
- return self._getAttrMap().get(key, default)
-
- def clear(self):
- """Extract all children."""
- for child in self.contents[:]:
- child.extract()
-
- def index(self, element):
- for i, child in enumerate(self.contents):
- if child is element:
- return i
- raise ValueError("Tag.index: element not in tag")
-
- def has_key(self, key):
- return self._getAttrMap().has_key(key)
-
- def __getitem__(self, key):
- """tag[key] returns the value of the 'key' attribute for the tag,
- and throws an exception if it's not there."""
- return self._getAttrMap()[key]
-
- def __iter__(self):
- "Iterating over a tag iterates over its contents."
- return iter(self.contents)
-
- def __len__(self):
- "The length of a tag is the length of its list of contents."
- return len(self.contents)
-
- def __contains__(self, x):
- return x in self.contents
-
- def __nonzero__(self):
- "A tag is non-None even if it has no contents."
- return True
-
- def __setitem__(self, key, value):
- """Setting tag[key] sets the value of the 'key' attribute for the
- tag."""
- self._getAttrMap()
- self.attrMap[key] = value
- found = False
- for i in range(0, len(self.attrs)):
- if self.attrs[i][0] == key:
- self.attrs[i] = (key, value)
- found = True
- if not found:
- self.attrs.append((key, value))
- self._getAttrMap()[key] = value
-
- def __delitem__(self, key):
- "Deleting tag[key] deletes all 'key' attributes for the tag."
- for item in self.attrs:
- if item[0] == key:
- self.attrs.remove(item)
- #We don't break because bad HTML can define the same
- #attribute multiple times.
- self._getAttrMap()
- if self.attrMap.has_key(key):
- del self.attrMap[key]
-
- def __call__(self, *args, **kwargs):
- """Calling a tag like a function is the same as calling its
- findAll() method. Eg. tag('a') returns a list of all the A tags
- found within this tag."""
- return apply(self.findAll, args, kwargs)
-
- def __getattr__(self, tag):
- #print "Getattr %s.%s" % (self.__class__, tag)
- if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3:
- return self.find(tag[:-3])
- elif tag.find('__') != 0:
- return self.find(tag)
- raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag)
-
- def __eq__(self, other):
- """Returns true iff this tag has the same name, the same attributes,
- and the same contents (recursively) as the given tag.
-
- NOTE: right now this will return false if two tags have the
- same attributes in a different order. Should this be fixed?"""
- if other is self:
- return True
- if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other):
- return False
- for i in range(0, len(self.contents)):
- if self.contents[i] != other.contents[i]:
- return False
- return True
-
- def __ne__(self, other):
- """Returns true iff this tag is not identical to the other tag,
- as defined in __eq__."""
- return not self == other
-
- def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING):
- """Renders this tag as a string."""
- return self.__str__(encoding)
-
- def __unicode__(self):
- return self.__str__(None)
-
- BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|"
- + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)"
- + ")")
-
- def _sub_entity(self, x):
- """Used with a regular expression to substitute the
- appropriate XML entity for an XML special character."""
- return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";"
-
- def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING,
- prettyPrint=False, indentLevel=0):
- """Returns a string or Unicode representation of this tag and
- its contents. To get Unicode, pass None for encoding.
-
- NOTE: since Python's HTML parser consumes whitespace, this
- method is not certain to reproduce the whitespace present in
- the original string."""
-
- encodedName = self.toEncoding(self.name, encoding)
-
- attrs = []
- if self.attrs:
- for key, val in self.attrs:
- fmt = '%s="%s"'
- if isinstance(val, basestring):
- if self.containsSubstitutions and '%SOUP-ENCODING%' in val:
- val = self.substituteEncoding(val, encoding)
-
- # The attribute value either:
- #
- # * Contains no embedded double quotes or single quotes.
- # No problem: we enclose it in double quotes.
- # * Contains embedded single quotes. No problem:
- # double quotes work here too.
- # * Contains embedded double quotes. No problem:
- # we enclose it in single quotes.
- # * Embeds both single _and_ double quotes. This
- # can't happen naturally, but it can happen if
- # you modify an attribute value after parsing
- # the document. Now we have a bit of a
- # problem. We solve it by enclosing the
- # attribute in single quotes, and escaping any
- # embedded single quotes to XML entities.
- if '"' in val:
- fmt = "%s='%s'"
- if "'" in val:
- # TODO: replace with apos when
- # appropriate.
- val = val.replace("'", "&squot;")
-
- # Now we're okay w/r/t quotes. But the attribute
- # value might also contain angle brackets, or
- # ampersands that aren't part of entities. We need
- # to escape those to XML entities too.
- val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val)
-
- attrs.append(fmt % (self.toEncoding(key, encoding),
- self.toEncoding(val, encoding)))
- close = ''
- closeTag = ''
- if self.isSelfClosing:
- close = ' /'
- else:
- closeTag = '%s>' % encodedName
-
- indentTag, indentContents = 0, 0
- if prettyPrint:
- indentTag = indentLevel
- space = (' ' * (indentTag-1))
- indentContents = indentTag + 1
- contents = self.renderContents(encoding, prettyPrint, indentContents)
- if self.hidden:
- s = contents
- else:
- s = []
- attributeString = ''
- if attrs:
- attributeString = ' ' + ' '.join(attrs)
- if prettyPrint:
- s.append(space)
- s.append('<%s%s%s>' % (encodedName, attributeString, close))
- if prettyPrint:
- s.append("\n")
- s.append(contents)
- if prettyPrint and contents and contents[-1] != "\n":
- s.append("\n")
- if prettyPrint and closeTag:
- s.append(space)
- s.append(closeTag)
- if prettyPrint and closeTag and self.nextSibling:
- s.append("\n")
- s = ''.join(s)
- return s
-
- def decompose(self):
- """Recursively destroys the contents of this tree."""
- self.extract()
- if len(self.contents) == 0:
- return
- current = self.contents[0]
- while current is not None:
- next = current.next
- if isinstance(current, Tag):
- del current.contents[:]
- current.parent = None
- current.previous = None
- current.previousSibling = None
- current.next = None
- current.nextSibling = None
- current = next
-
- def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING):
- return self.__str__(encoding, True)
-
- def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
- prettyPrint=False, indentLevel=0):
- """Renders the contents of this tag as a string in the given
- encoding. If encoding is None, returns a Unicode string.."""
- s=[]
- for c in self:
- text = None
- if isinstance(c, NavigableString):
- text = c.__str__(encoding)
- elif isinstance(c, Tag):
- s.append(c.__str__(encoding, prettyPrint, indentLevel))
- if text and prettyPrint:
- text = text.strip()
- if text:
- if prettyPrint:
- s.append(" " * (indentLevel-1))
- s.append(text)
- if prettyPrint:
- s.append("\n")
- return ''.join(s)
-
- #Soup methods
-
- def find(self, name=None, attrs={}, recursive=True, text=None,
- **kwargs):
- """Return only the first child of this Tag matching the given
- criteria."""
- r = None
- l = self.findAll(name, attrs, recursive, text, 1, **kwargs)
- if l:
- r = l[0]
- return r
- findChild = find
-
- def findAll(self, name=None, attrs={}, recursive=True, text=None,
- limit=None, **kwargs):
- """Extracts a list of Tag objects that match the given
- criteria. You can specify the name of the Tag and any
- attributes you want the Tag to have.
-
- The value of a key-value pair in the 'attrs' map can be a
- string, a list of strings, a regular expression object, or a
- callable that takes a string and returns whether or not the
- string matches for some custom definition of 'matches'. The
- same is true of the tag name."""
- generator = self.recursiveChildGenerator
- if not recursive:
- generator = self.childGenerator
- return self._findAll(name, attrs, text, limit, generator, **kwargs)
- findChildren = findAll
-
- # Pre-3.x compatibility methods
- first = find
- fetch = findAll
-
- def fetchText(self, text=None, recursive=True, limit=None):
- return self.findAll(text=text, recursive=recursive, limit=limit)
-
- def firstText(self, text=None, recursive=True):
- return self.find(text=text, recursive=recursive)
-
- #Private methods
-
- def _getAttrMap(self):
- """Initializes a map representation of this tag's attributes,
- if not already initialized."""
- if not getattr(self, 'attrMap'):
- self.attrMap = {}
- for (key, value) in self.attrs:
- self.attrMap[key] = value
- return self.attrMap
-
- #Generator methods
- def childGenerator(self):
- # Just use the iterator from the contents
- return iter(self.contents)
-
- def recursiveChildGenerator(self):
- if not len(self.contents):
- raise StopIteration
- stopNode = self._lastRecursiveChild().next
- current = self.contents[0]
- while current is not stopNode:
- yield current
- current = current.next
-
-
-# Next, a couple classes to represent queries and their results.
-class SoupStrainer:
- """Encapsulates a number of ways of matching a markup element (tag or
- text)."""
-
- def __init__(self, name=None, attrs={}, text=None, **kwargs):
- self.name = name
- if isinstance(attrs, basestring):
- kwargs['class'] = _match_css_class(attrs)
- attrs = None
- if kwargs:
- if attrs:
- attrs = attrs.copy()
- attrs.update(kwargs)
- else:
- attrs = kwargs
- self.attrs = attrs
- self.text = text
-
- def __str__(self):
- if self.text:
- return self.text
- else:
- return "%s|%s" % (self.name, self.attrs)
-
- def searchTag(self, markupName=None, markupAttrs={}):
- found = None
- markup = None
- if isinstance(markupName, Tag):
- markup = markupName
- markupAttrs = markup
- callFunctionWithTagData = callable(self.name) \
- and not isinstance(markupName, Tag)
-
- if (not self.name) \
- or callFunctionWithTagData \
- or (markup and self._matches(markup, self.name)) \
- or (not markup and self._matches(markupName, self.name)):
- if callFunctionWithTagData:
- match = self.name(markupName, markupAttrs)
- else:
- match = True
- markupAttrMap = None
- for attr, matchAgainst in self.attrs.items():
- if not markupAttrMap:
- if hasattr(markupAttrs, 'get'):
- markupAttrMap = markupAttrs
- else:
- markupAttrMap = {}
- for k,v in markupAttrs:
- markupAttrMap[k] = v
- attrValue = markupAttrMap.get(attr)
- if not self._matches(attrValue, matchAgainst):
- match = False
- break
- if match:
- if markup:
- found = markup
- else:
- found = markupName
- return found
-
- def search(self, markup):
- #print 'looking for %s in %s' % (self, markup)
- found = None
- # If given a list of items, scan it for a text element that
- # matches.
- if hasattr(markup, "__iter__") \
- and not isinstance(markup, Tag):
- for element in markup:
- if isinstance(element, NavigableString) \
- and self.search(element):
- found = element
- break
- # If it's a Tag, make sure its name or attributes match.
- # Don't bother with Tags if we're searching for text.
- elif isinstance(markup, Tag):
- if not self.text:
- found = self.searchTag(markup)
- # If it's text, make sure the text matches.
- elif isinstance(markup, NavigableString) or \
- isinstance(markup, basestring):
- if self._matches(markup, self.text):
- found = markup
- else:
- raise Exception, "I don't know how to match against a %s" \
- % markup.__class__
- return found
-
- def _matches(self, markup, matchAgainst):
- #print "Matching %s against %s" % (markup, matchAgainst)
- result = False
- if matchAgainst is True:
- result = markup is not None
- elif callable(matchAgainst):
- result = matchAgainst(markup)
- else:
- #Custom match methods take the tag as an argument, but all
- #other ways of matching match the tag name as a string.
- if isinstance(markup, Tag):
- markup = markup.name
- if markup and not isinstance(markup, basestring):
- markup = unicode(markup)
- #Now we know that chunk is either a string, or None.
- if hasattr(matchAgainst, 'match'):
- # It's a regexp object.
- result = markup and matchAgainst.search(markup)
- elif hasattr(matchAgainst, '__iter__'): # list-like
- result = markup in matchAgainst
- elif hasattr(matchAgainst, 'items'):
- result = markup.has_key(matchAgainst)
- elif matchAgainst and isinstance(markup, basestring):
- if isinstance(markup, unicode):
- matchAgainst = unicode(matchAgainst)
- else:
- matchAgainst = str(matchAgainst)
-
- if not result:
- result = matchAgainst == markup
- return result
-
-class ResultSet(list):
- """A ResultSet is just a list that keeps track of the SoupStrainer
- that created it."""
- def __init__(self, source):
- list.__init__([])
- self.source = source
-
-# Now, some helper functions.
-
-def buildTagMap(default, *args):
- """Turns a list of maps, lists, or scalars into a single map.
- Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and
- NESTING_RESET_TAGS maps out of lists and partial maps."""
- built = {}
- for portion in args:
- if hasattr(portion, 'items'):
- #It's a map. Merge it.
- for k,v in portion.items():
- built[k] = v
- elif hasattr(portion, '__iter__'): # is a list
- #It's a list. Map each item to the default.
- for k in portion:
- built[k] = default
- else:
- #It's a scalar. Map it to the default.
- built[portion] = default
- return built
-
-# Now, the parser classes.
-
-class BeautifulStoneSoup(Tag, SGMLParser):
-
- """This class contains the basic parser and search code. It defines
- a parser that knows nothing about tag behavior except for the
- following:
-
- You can't close a tag without closing all the tags it encloses.
- That is, "" actually means
- "".
-
- [Another possible explanation is "", but since
- this class defines no SELF_CLOSING_TAGS, it will never use that
- explanation.]
-
- This class is useful for parsing XML or made-up markup languages,
- or when BeautifulSoup makes an assumption counter to what you were
- expecting."""
-
- SELF_CLOSING_TAGS = {}
- NESTABLE_TAGS = {}
- RESET_NESTING_TAGS = {}
- QUOTE_TAGS = {}
- PRESERVE_WHITESPACE_TAGS = []
-
- MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'),
- lambda x: x.group(1) + ' />'),
- (re.compile(']*)>'),
- lambda x: '')
- ]
-
- ROOT_TAG_NAME = u'[document]'
-
- HTML_ENTITIES = "html"
- XML_ENTITIES = "xml"
- XHTML_ENTITIES = "xhtml"
- # TODO: This only exists for backwards-compatibility
- ALL_ENTITIES = XHTML_ENTITIES
-
- # Used when determining whether a text node is all whitespace and
- # can be replaced with a single space. A text node that contains
- # fancy Unicode spaces (usually non-breaking) should be left
- # alone.
- STRIP_ASCII_SPACES = { 9: None, 10: None, 12: None, 13: None, 32: None, }
-
- def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None,
- markupMassage=True, smartQuotesTo=XML_ENTITIES,
- convertEntities=None, selfClosingTags=None, isHTML=False):
- """The Soup object is initialized as the 'root tag', and the
- provided markup (which can be a string or a file-like object)
- is fed into the underlying parser.
-
- sgmllib will process most bad HTML, and the BeautifulSoup
- class has some tricks for dealing with some HTML that kills
- sgmllib, but Beautiful Soup can nonetheless choke or lose data
- if your data uses self-closing tags or declarations
- incorrectly.
-
- By default, Beautiful Soup uses regexes to sanitize input,
- avoiding the vast majority of these problems. If the problems
- don't apply to you, pass in False for markupMassage, and
- you'll get better performance.
-
- The default parser massage techniques fix the two most common
- instances of invalid HTML that choke sgmllib:
-
- (No space between name of closing tag and tag close)
- (Extraneous whitespace in declaration)
-
- You can pass in a custom list of (RE object, replace method)
- tuples to get Beautiful Soup to scrub your input the way you
- want."""
-
- self.parseOnlyThese = parseOnlyThese
- self.fromEncoding = fromEncoding
- self.smartQuotesTo = smartQuotesTo
- self.convertEntities = convertEntities
- # Set the rules for how we'll deal with the entities we
- # encounter
- if self.convertEntities:
- # It doesn't make sense to convert encoded characters to
- # entities even while you're converting entities to Unicode.
- # Just convert it all to Unicode.
- self.smartQuotesTo = None
- if convertEntities == self.HTML_ENTITIES:
- self.convertXMLEntities = False
- self.convertHTMLEntities = True
- self.escapeUnrecognizedEntities = True
- elif convertEntities == self.XHTML_ENTITIES:
- self.convertXMLEntities = True
- self.convertHTMLEntities = True
- self.escapeUnrecognizedEntities = False
- elif convertEntities == self.XML_ENTITIES:
- self.convertXMLEntities = True
- self.convertHTMLEntities = False
- self.escapeUnrecognizedEntities = False
- else:
- self.convertXMLEntities = False
- self.convertHTMLEntities = False
- self.escapeUnrecognizedEntities = False
-
- self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags)
- SGMLParser.__init__(self)
-
- if hasattr(markup, 'read'): # It's a file-type object.
- markup = markup.read()
- self.markup = markup
- self.markupMassage = markupMassage
- try:
- self._feed(isHTML=isHTML)
- except StopParsing:
- pass
- self.markup = None # The markup can now be GCed
-
- def convert_charref(self, name):
- """This method fixes a bug in Python's SGMLParser."""
- try:
- n = int(name)
- except ValueError:
- return
- if not 0 <= n <= 127 : # ASCII ends at 127, not 255
- return
- return self.convert_codepoint(n)
-
- def _feed(self, inDocumentEncoding=None, isHTML=False):
- # Convert the document to Unicode.
- markup = self.markup
- if isinstance(markup, unicode):
- if not hasattr(self, 'originalEncoding'):
- self.originalEncoding = None
- else:
- dammit = UnicodeDammit\
- (markup, [self.fromEncoding, inDocumentEncoding],
- smartQuotesTo=self.smartQuotesTo, isHTML=isHTML)
- markup = dammit.unicode
- self.originalEncoding = dammit.originalEncoding
- self.declaredHTMLEncoding = dammit.declaredHTMLEncoding
- if markup:
- if self.markupMassage:
- if not hasattr(self.markupMassage, "__iter__"):
- self.markupMassage = self.MARKUP_MASSAGE
- for fix, m in self.markupMassage:
- markup = fix.sub(m, markup)
- # TODO: We get rid of markupMassage so that the
- # soup object can be deepcopied later on. Some
- # Python installations can't copy regexes. If anyone
- # was relying on the existence of markupMassage, this
- # might cause problems.
- del(self.markupMassage)
- self.reset()
-
- SGMLParser.feed(self, markup)
- # Close out any unfinished strings and close all the open tags.
- self.endData()
- while self.currentTag.name != self.ROOT_TAG_NAME:
- self.popTag()
-
- def __getattr__(self, methodName):
- """This method routes method call requests to either the SGMLParser
- superclass or the Tag superclass, depending on the method name."""
- #print "__getattr__ called on %s.%s" % (self.__class__, methodName)
-
- if methodName.startswith('start_') or methodName.startswith('end_') \
- or methodName.startswith('do_'):
- return SGMLParser.__getattr__(self, methodName)
- elif not methodName.startswith('__'):
- return Tag.__getattr__(self, methodName)
- else:
- raise AttributeError
-
- def isSelfClosingTag(self, name):
- """Returns true iff the given string is the name of a
- self-closing tag according to this parser."""
- return self.SELF_CLOSING_TAGS.has_key(name) \
- or self.instanceSelfClosingTags.has_key(name)
-
- def reset(self):
- Tag.__init__(self, self, self.ROOT_TAG_NAME)
- self.hidden = 1
- SGMLParser.reset(self)
- self.currentData = []
- self.currentTag = None
- self.tagStack = []
- self.quoteStack = []
- self.pushTag(self)
-
- def popTag(self):
- tag = self.tagStack.pop()
-
- #print "Pop", tag.name
- if self.tagStack:
- self.currentTag = self.tagStack[-1]
- return self.currentTag
-
- def pushTag(self, tag):
- #print "Push", tag.name
- if self.currentTag:
- self.currentTag.contents.append(tag)
- self.tagStack.append(tag)
- self.currentTag = self.tagStack[-1]
-
- def endData(self, containerClass=NavigableString):
- if self.currentData:
- currentData = u''.join(self.currentData)
- if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and
- not set([tag.name for tag in self.tagStack]).intersection(
- self.PRESERVE_WHITESPACE_TAGS)):
- if '\n' in currentData:
- currentData = '\n'
- else:
- currentData = ' '
- self.currentData = []
- if self.parseOnlyThese and len(self.tagStack) <= 1 and \
- (not self.parseOnlyThese.text or \
- not self.parseOnlyThese.search(currentData)):
- return
- o = containerClass(currentData)
- o.setup(self.currentTag, self.previous)
- if self.previous:
- self.previous.next = o
- self.previous = o
- self.currentTag.contents.append(o)
-
-
- def _popToTag(self, name, inclusivePop=True):
- """Pops the tag stack up to and including the most recent
- instance of the given tag. If inclusivePop is false, pops the tag
- stack up to but *not* including the most recent instqance of
- the given tag."""
- #print "Popping to %s" % name
- if name == self.ROOT_TAG_NAME:
- return
-
- numPops = 0
- mostRecentTag = None
- for i in range(len(self.tagStack)-1, 0, -1):
- if name == self.tagStack[i].name:
- numPops = len(self.tagStack)-i
- break
- if not inclusivePop:
- numPops = numPops - 1
-
- for i in range(0, numPops):
- mostRecentTag = self.popTag()
- return mostRecentTag
-
- def _smartPop(self, name):
-
- """We need to pop up to the previous tag of this type, unless
- one of this tag's nesting reset triggers comes between this
- tag and the previous tag of this type, OR unless this tag is a
- generic nesting trigger and another generic nesting trigger
- comes between this tag and the previous tag of this type.
-
- Examples:
-
FooBar *
* should pop to 'p', not 'b'.
-
Foo
Bar *
* should pop to 'table', not 'p'.
-
Foo
Bar *
* should pop to 'tr', not 'p'.
-
-
*
* should pop to 'ul', not the first 'li'.
-
*
* should pop to 'table', not the first 'tr'
-
*
* should pop to 'tr', not the first 'td'
- """
-
- nestingResetTriggers = self.NESTABLE_TAGS.get(name)
- isNestable = nestingResetTriggers != None
- isResetNesting = self.RESET_NESTING_TAGS.has_key(name)
- popTo = None
- inclusive = True
- for i in range(len(self.tagStack)-1, 0, -1):
- p = self.tagStack[i]
- if (not p or p.name == name) and not isNestable:
- #Non-nestable tags get popped to the top or to their
- #last occurance.
- popTo = name
- break
- if (nestingResetTriggers is not None
- and p.name in nestingResetTriggers) \
- or (nestingResetTriggers is None and isResetNesting
- and self.RESET_NESTING_TAGS.has_key(p.name)):
-
- #If we encounter one of the nesting reset triggers
- #peculiar to this tag, or we encounter another tag
- #that causes nesting to reset, pop up to but not
- #including that tag.
- popTo = p.name
- inclusive = False
- break
- p = p.parent
- if popTo:
- self._popToTag(popTo, inclusive)
-
- def unknown_starttag(self, name, attrs, selfClosing=0):
- #print "Start tag %s: %s" % (name, attrs)
- if self.quoteStack:
- #This is not a real tag.
- #print "<%s> is not real!" % name
- attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs])
- self.handle_data('<%s%s>' % (name, attrs))
- return
- self.endData()
-
- if not self.isSelfClosingTag(name) and not selfClosing:
- self._smartPop(name)
-
- if self.parseOnlyThese and len(self.tagStack) <= 1 \
- and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)):
- return
-
- tag = Tag(self, name, attrs, self.currentTag, self.previous)
- if self.previous:
- self.previous.next = tag
- self.previous = tag
- self.pushTag(tag)
- if selfClosing or self.isSelfClosingTag(name):
- self.popTag()
- if name in self.QUOTE_TAGS:
- #print "Beginning quote (%s)" % name
- self.quoteStack.append(name)
- self.literal = 1
- return tag
-
- def unknown_endtag(self, name):
- #print "End tag %s" % name
- if self.quoteStack and self.quoteStack[-1] != name:
- #This is not a real end tag.
- #print "%s> is not real!" % name
- self.handle_data('%s>' % name)
- return
- self.endData()
- self._popToTag(name)
- if self.quoteStack and self.quoteStack[-1] == name:
- self.quoteStack.pop()
- self.literal = (len(self.quoteStack) > 0)
-
- def handle_data(self, data):
- self.currentData.append(data)
-
- def _toStringSubclass(self, text, subclass):
- """Adds a certain piece of text to the tree as a NavigableString
- subclass."""
- self.endData()
- self.handle_data(text)
- self.endData(subclass)
-
- def handle_pi(self, text):
- """Handle a processing instruction as a ProcessingInstruction
- object, possibly one with a %SOUP-ENCODING% slot into which an
- encoding will be plugged later."""
- if text[:3] == "xml":
- text = u"xml version='1.0' encoding='%SOUP-ENCODING%'"
- self._toStringSubclass(text, ProcessingInstruction)
-
- def handle_comment(self, text):
- "Handle comments as Comment objects."
- self._toStringSubclass(text, Comment)
-
- def handle_charref(self, ref):
- "Handle character references as data."
- if self.convertEntities:
- data = unichr(int(ref))
- else:
- data = '%s;' % ref
- self.handle_data(data)
-
- def handle_entityref(self, ref):
- """Handle entity references as data, possibly converting known
- HTML and/or XML entity references to the corresponding Unicode
- characters."""
- data = None
- if self.convertHTMLEntities:
- try:
- data = unichr(name2codepoint[ref])
- except KeyError:
- pass
-
- if not data and self.convertXMLEntities:
- data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref)
-
- if not data and self.convertHTMLEntities and \
- not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref):
- # TODO: We've got a problem here. We're told this is
- # an entity reference, but it's not an XML entity
- # reference or an HTML entity reference. Nonetheless,
- # the logical thing to do is to pass it through as an
- # unrecognized entity reference.
- #
- # Except: when the input is "&carol;" this function
- # will be called with input "carol". When the input is
- # "AT&T", this function will be called with input
- # "T". We have no way of knowing whether a semicolon
- # was present originally, so we don't know whether
- # this is an unknown entity or just a misplaced
- # ampersand.
- #
- # The more common case is a misplaced ampersand, so I
- # escape the ampersand and omit the trailing semicolon.
- data = "&%s" % ref
- if not data:
- # This case is different from the one above, because we
- # haven't already gone through a supposedly comprehensive
- # mapping of entities to Unicode characters. We might not
- # have gone through any mapping at all. So the chances are
- # very high that this is a real entity, and not a
- # misplaced ampersand.
- data = "&%s;" % ref
- self.handle_data(data)
-
- def handle_decl(self, data):
- "Handle DOCTYPEs and the like as Declaration objects."
- self._toStringSubclass(data, Declaration)
-
- def parse_declaration(self, i):
- """Treat a bogus SGML declaration as raw data. Treat a CDATA
- declaration as a CData object."""
- j = None
- if self.rawdata[i:i+9] == '', i)
- if k == -1:
- k = len(self.rawdata)
- data = self.rawdata[i+9:k]
- j = k+3
- self._toStringSubclass(data, CData)
- else:
- try:
- j = SGMLParser.parse_declaration(self, i)
- except SGMLParseError:
- toHandle = self.rawdata[i:]
- self.handle_data(toHandle)
- j = i + len(toHandle)
- return j
-
-class BeautifulSoup(BeautifulStoneSoup):
-
- """This parser knows the following facts about HTML:
-
- * Some tags have no closing tag and should be interpreted as being
- closed as soon as they are encountered.
-
- * The text inside some tags (ie. 'script') may contain tags which
- are not really part of the document and which should be parsed
- as text, not tags. If you want to parse the text as tags, you can
- always fetch it and parse it explicitly.
-
- * Tag nesting rules:
-
- Most tags can't be nested at all. For instance, the occurance of
- a
tag should implicitly close the previous
tag.
-
-
Para1
Para2
- should be transformed into:
-
Para1
Para2
-
- Some tags can be nested arbitrarily. For instance, the occurance
- of a
tag should _not_ implicitly close the previous
-
tag.
-
- Alice said:
Bob said:
Blah
- should NOT be transformed into:
- Alice said:
Bob said:
Blah
-
- Some tags can be nested, but the nesting is reset by the
- interposition of other tags. For instance, a
tag should
- implicitly close the previous
tag within the same
,
- but not close a
tag in another table.
-
-
Blah
Blah
- should be transformed into:
-
Blah
Blah
- but,
-
Blah
Blah
- should NOT be transformed into
-
Blah
Blah
-
- Differing assumptions about tag nesting rules are a major source
- of problems with the BeautifulSoup class. If BeautifulSoup is not
- treating as nestable a tag your page author treats as nestable,
- try ICantBelieveItsBeautifulSoup, MinimalSoup, or
- BeautifulStoneSoup before writing your own subclass."""
-
- def __init__(self, *args, **kwargs):
- if not kwargs.has_key('smartQuotesTo'):
- kwargs['smartQuotesTo'] = self.HTML_ENTITIES
- kwargs['isHTML'] = True
- BeautifulStoneSoup.__init__(self, *args, **kwargs)
-
- SELF_CLOSING_TAGS = buildTagMap(None,
- ('br' , 'hr', 'input', 'img', 'meta',
- 'spacer', 'link', 'frame', 'base', 'col'))
-
- PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea'])
-
- QUOTE_TAGS = {'script' : None, 'textarea' : None}
-
- #According to the HTML standard, each of these inline tags can
- #contain another tag of the same type. Furthermore, it's common
- #to actually use these tags this way.
- NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup',
- 'center')
-
- #According to the HTML standard, these block tags can contain
- #another tag of the same type. Furthermore, it's common
- #to actually use these tags this way.
- NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del')
-
- #Lists can contain other lists, but there are restrictions.
- NESTABLE_LIST_TAGS = { 'ol' : [],
- 'ul' : [],
- 'li' : ['ul', 'ol'],
- 'dl' : [],
- 'dd' : ['dl'],
- 'dt' : ['dl'] }
-
- #Tables can contain other tables, but there are restrictions.
- NESTABLE_TABLE_TAGS = {'table' : [],
- 'tr' : ['table', 'tbody', 'tfoot', 'thead'],
- 'td' : ['tr'],
- 'th' : ['tr'],
- 'thead' : ['table'],
- 'tbody' : ['table'],
- 'tfoot' : ['table'],
- }
-
- NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre')
-
- #If one of these tags is encountered, all tags up to the next tag of
- #this type are popped.
- RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript',
- NON_NESTABLE_BLOCK_TAGS,
- NESTABLE_LIST_TAGS,
- NESTABLE_TABLE_TAGS)
-
- NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS,
- NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS)
-
- # Used to detect the charset in a META tag; see start_meta
- CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M)
-
- def start_meta(self, attrs):
- """Beautiful Soup can detect a charset included in a META tag,
- try to convert the document to that charset, and re-parse the
- document from the beginning."""
- httpEquiv = None
- contentType = None
- contentTypeIndex = None
- tagNeedsEncodingSubstitution = False
-
- for i in range(0, len(attrs)):
- key, value = attrs[i]
- key = key.lower()
- if key == 'http-equiv':
- httpEquiv = value
- elif key == 'content':
- contentType = value
- contentTypeIndex = i
-
- if httpEquiv and contentType: # It's an interesting meta tag.
- match = self.CHARSET_RE.search(contentType)
- if match:
- if (self.declaredHTMLEncoding is not None or
- self.originalEncoding == self.fromEncoding):
- # An HTML encoding was sniffed while converting
- # the document to Unicode, or an HTML encoding was
- # sniffed during a previous pass through the
- # document, or an encoding was specified
- # explicitly and it worked. Rewrite the meta tag.
- def rewrite(match):
- return match.group(1) + "%SOUP-ENCODING%"
- newAttr = self.CHARSET_RE.sub(rewrite, contentType)
- attrs[contentTypeIndex] = (attrs[contentTypeIndex][0],
- newAttr)
- tagNeedsEncodingSubstitution = True
- else:
- # This is our first pass through the document.
- # Go through it again with the encoding information.
- newCharset = match.group(3)
- if newCharset and newCharset != self.originalEncoding:
- self.declaredHTMLEncoding = newCharset
- self._feed(self.declaredHTMLEncoding)
- raise StopParsing
- pass
- tag = self.unknown_starttag("meta", attrs)
- if tag and tagNeedsEncodingSubstitution:
- tag.containsSubstitutions = True
-
-class StopParsing(Exception):
- pass
-
-class ICantBelieveItsBeautifulSoup(BeautifulSoup):
-
- """The BeautifulSoup class is oriented towards skipping over
- common HTML errors like unclosed tags. However, sometimes it makes
- errors of its own. For instance, consider this fragment:
-
- FooBar
-
- This is perfectly valid (if bizarre) HTML. However, the
- BeautifulSoup class will implicitly close the first b tag when it
- encounters the second 'b'. It will think the author wrote
- "FooBar", and didn't close the first 'b' tag, because
- there's no real-world reason to bold something that's already
- bold. When it encounters '' it will close two more 'b'
- tags, for a grand total of three tags closed instead of two. This
- can throw off the rest of your document structure. The same is
- true of a number of other tags, listed below.
-
- It's much more common for someone to forget to close a 'b' tag
- than to actually use nested 'b' tags, and the BeautifulSoup class
- handles the common case. This class handles the not-co-common
- case: where you can't believe someone wrote what they did, but
- it's valid HTML and BeautifulSoup screwed up by assuming it
- wouldn't be."""
-
- I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \
- ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong',
- 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b',
- 'big')
-
- I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',)
-
- NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS,
- I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS,
- I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS)
-
-class MinimalSoup(BeautifulSoup):
- """The MinimalSoup class is for parsing HTML that contains
- pathologically bad markup. It makes no assumptions about tag
- nesting, but it does know which tags are self-closing, that
- ", html)
- if match:
- init = unicode(match.group(1), errors="ignore")
- tokens = init.split('],[')
- for token in tokens:
- res = ImageResult()
- res.page = i
- res.index = j
- toks = token.split(",")
-
- # should be 32 or 33, but seems to change, so just make sure no exceptions
- # will be thrown by the indexing
- if (len(toks) > 22):
- for t in range(len(toks)):
- toks[t] = toks[t].replace('\\x3cb\\x3e','').replace('\\x3c/b\\x3e','').replace('\\x3d','=').replace('\\x26','&')
- match = re.search("imgurl=(?P[^&]+)&imgrefurl", toks[0])
- if match:
- res.link = match.group("link")
- res.name = toks[6].replace('"', '')
- res.thumb = toks[21].replace('"', '')
- res.format = toks[10].replace('"', '')
- res.domain = toks[11].replace('"', '')
- match = re.search("(?P[0-9]+) × (?P[0-9]+) - (?P[^ ]+)", toks[9].replace('"', ''))
- if match:
- res.width = match.group("width")
- res.height = match.group("height")
- res.filesize = match.group("size")
- results.append(res)
- j = j + 1
- return results
-
- @staticmethod
- def search_images(query, image_options = None, pages = 1):
- results = []
- for i in range(pages):
- url = get_image_search_url(query, image_options, i)
- html = get_html(url)
- if html:
- if Google.DEBUG_MODE:
- write_html_to_file(html, "images_{0}_{1}.html".format(query.replace(" ", "_"), i))
- soup = BeautifulSoup(html)
- j = 0
- tds = soup.findAll("td")
- for td in tds:
- a = td.find("a")
- if a and a["href"].find("imgurl") != -1:
- res = ImageResult()
- res.page = i
- res.index = j
- tokens = a["href"].split("&")
- match = re.search("imgurl=(?P[^&]+)", tokens[0])
- if match:
- res.link = match.group("link")
- res.format = res.link[res.link.rfind(".") + 1:]
- img = td.find("img")
- if img:
- res.thumb = img["src"]
- res.thumb_width = img["width"]
- res.thumb_height = img["height"]
- match = re.search("(?P[0-9]+) × (?P[0-9]+) - (?P[^&]+)", td.text)
- if match:
- res.width = match.group("width")
- res.name = td.text[:td.text.find(res.width)]
- res.height = match.group("height")
- res.filesize = match.group("size")
- cite = td.find("cite")
- if cite:
- res.domain = cite["title"]
- results.append(res)
- j = j + 1
- return results
-
- @staticmethod
- def shopping(query, pages=1):
- results = []
- for i in range(pages):
- url = get_shopping_url(query, i)
- html = get_html(url)
- if html:
- if Google.DEBUG_MODE:
- write_html_to_file(html, "shopping_{0}_{1}.html".format(query.replace(" ", "_"), i))
- j = 0
- soup = BeautifulSoup(html)
-
- products = soup.findAll("li", "g")
- for prod in products:
- res = ShoppingResult()
-
- divs = prod.findAll("div")
- for div in divs:
- match = re.search("from (?P[0-9]+) stores", div.text.strip())
- if match:
- res.store_count = match.group("count")
- break
-
- h3 = prod.find("h3", "r")
- if h3:
- a = h3.find("a")
- if a:
- res.compare_url = a["href"]
- res.name = h3.text.strip()
-
- psliimg = prod.find("div", "psliimg")
- if psliimg:
- img = psliimg.find("img")
- if img:
- res.thumb = img["src"]
-
- f = prod.find("div", "f")
- if f:
- res.subtext = f.text.strip()
-
- price = prod.find("div", "psliprice")
- if price:
- res.min_price = price.text.strip()
-
- results.append(res)
- j = j + 1
- return results
-
- """
- Converts one currency to another.
- [amount] from_curreny = [return_value] to_currency
- """
- @staticmethod
- def convert_currency(amount, from_currency, to_currency):
- if from_currency == to_currency:
- return 1.0
- conn = httplib.HTTPSConnection("www.google.com")
- req_url = "/ig/calculator?hl=en&q={0}{1}=?{2}".format(amount, from_currency.replace(" ", "%20"), to_currency.replace(" ", "%20"))
- headers = { "User-Agent": "Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101" }
- conn.request("GET", req_url, "", headers)
- response = conn.getresponse()
- rval = response.read().decode("utf-8").replace(u"\xa0", "")
- conn.close()
- rhs = rval.split(",")[1].strip()
- s = rhs[rhs.find('"')+1:]
- rate = s[:s.find(" ")]
- return float(rate)
-
- """
- Gets the exchange rate of one currency to another.
- 1 from_curreny = [return_value] to_currency
- """
- @staticmethod
- def exchange_rate(from_currency, to_currency):
- return Google.convert_currency(1, from_currency, to_currency)
-
- """
- Attempts to use google calculator to calculate the result of expr
- """
- @staticmethod
- def calculate(expr):
- conn = httplib.HTTPSConnection("www.google.com")
- req_url = "/ig/calculator?hl=en&q={0}".format(expr.replace(" ", "%20"))
- headers = { "User-Agent": "Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101" }
- conn.request("GET", req_url, "", headers)
- response = conn.getresponse()
- j = response.read().decode("utf-8").replace(u"\xa0", "")
- conn.close()
- j = re.sub(r"{\s*'?(\w)", r'{"\1', j)
- j = re.sub(r",\s*'?(\w)", r',"\1', j)
- j = re.sub(r"(\w)'?\s*:", r'\1":', j)
- j = re.sub(r":\s*'(\w)'\s*([,}])", r':"\1"\2', j)
- js = json.loads(j)
- return parse_calc_result(js["lhs"] + " = " + js["rhs"])
-
-def normalize_query(query):
- return query.strip().replace(":", "%3A").replace("+", "%2B").replace("&", "%26").replace(" ", "+")
-
-def get_search_url(query, page = 0, per_page = 10):
- # note: num per page might not be supported by google anymore (because of google instant)
- return "http://www.google.com/search?hl=en&q=%s&start=%i&num=%i" % (normalize_query(query), page * per_page, per_page)
-
-def get_shopping_url(query, page=0, per_page=10):
- return "http://www.google.com/search?hl=en&q={0}&tbm=shop&start={1}&num={2}".format(normalize_query(query), page * per_page, per_page)
-
-class ImageType:
- NONE = None
- FACE = "face"
- PHOTO = "photo"
- CLIPART = "clipart"
- LINE_DRAWING = "lineart"
-
-class SizeCategory:
- NONE = None
- ICON = "i"
- LARGE = "l"
- MEDIUM = "m"
- SMALL = "s"
- LARGER_THAN = "lt"
- EXACTLY = "ex"
-
-class LargerThan:
- NONE = None
- QSVGA = "qsvga" # 400 x 300
- VGA = "vga" # 640 x 480
- SVGA = "svga" # 800 x 600
- XGA = "xga" # 1024 x 768
- MP_2 = "2mp" # 2 MP (1600 x 1200)
- MP_4 = "4mp" # 4 MP (2272 x 1704)
- MP_6 = "6mp" # 6 MP (2816 x 2112)
- MP_8 = "8mp" # 8 MP (3264 x 2448)
- MP_10 = "10mp" # 10 MP (3648 x 2736)
- MP_12 = "12mp" # 12 MP (4096 x 3072)
- MP_15 = "15mp" # 15 MP (4480 x 3360)
- MP_20 = "20mp" # 20 MP (5120 x 3840)
- MP_40 = "40mp" # 40 MP (7216 x 5412)
- MP_70 = "70mp" # 70 MP (9600 x 7200)
-
-class ColorType:
- NONE = None
- COLOR = "color"
- BLACK_WHITE = "gray"
- SPECIFIC = "specific"
-
-def get_image_search_url(query, image_options=None, page=0, per_page=20):
- query = query.strip().replace(":", "%3A").replace("+", "%2B").replace("&", "%26").replace(" ", "+")
- url = "http://images.google.com/images?q=%s&sa=N&start=%i&ndsp=%i&sout=1" % (query, page * per_page, per_page)
- if image_options:
- tbs = image_options.get_tbs()
- if tbs:
- url = url + tbs
- return url
-
-def add_to_tbs(tbs, name, value):
- if tbs:
- return "%s,%s:%s" % (tbs, name, value)
- else:
- return "&tbs=%s:%s" % (name, value)
-
-def parse_calc_result(string):
- result = CalculatorResult()
- result.fullstring = string
- string = string.strip().replace(u"\xa0", " ")
- if string.find("=") != -1:
- result.expr = string[:string.rfind("=")].strip()
- string = string[string.rfind("=") + 2:]
- result.result = string
- tokens = string.split(" ")
- if len(tokens) > 0:
- result.value = ""
- for token in tokens:
- if is_number(token):
- result.value = result.value + token
- else:
- if result.unit:
- result.unit = result.unit + " " + token
- else:
- result.unit = token
- return result
- return None
-
-def is_number(s):
- try:
- float(s)
- return True
- except ValueError:
- return False
-
-def get_html(url):
- try:
- request = urllib2.Request(url)
- request.add_header("User-Agent", "Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101")
- html = urllib2.urlopen(request).read()
- return html
- except:
- print "Error accessing:", url
- return None
-
-def write_html_to_file(html, filename):
- of = open(filename, "w")
- of.write(html)
- of.flush()
- of.close()
-
-def test():
- search = Google.search("github")
- if search is None or len(search) == 0:
- print "ERROR: No Search Results!"
- else:
- print "PASSED: {0} Search Results".format(len(search))
-
- shop = Google.shopping("Disgaea 4")
- if shop is None or len(shop) == 0:
- print "ERROR: No Shopping Results!"
- else:
- print "PASSED: {0} Shopping Results".format(len(shop))
-
- options = ImageOptions()
- options.image_type = ImageType.CLIPART
- options.larger_than = LargerThan.MP_4
- options.color = "green"
- images = Google.search_images("banana", options)
- if images is None or len(images) == 0:
- print "ERROR: No Image Results!"
- else:
- print "PASSED: {0} Image Results".format(len(images))
-
- calc = Google.calculate("157.3kg in grams")
- if calc is not None and int(calc.value) == 157300:
- print "PASSED: Calculator passed"
- else:
- print "ERROR: Calculator failed!"
-
- euros = Google.convert_currency(5.0, "USD", "EUR")
- if euros is not None and euros > 0.0:
- print "PASSED: Currency convert passed"
- else:
- print "ERROR: Currency convert failed!"
-
-def main():
- if len(sys.argv) > 1 and sys.argv[1] == "--debug":
- Google.DEBUG_MODE = True
- print "DEBUG_MODE ENABLED"
- test()
-
-if __name__ == "__main__":
- main()
-
\ No newline at end of file
diff --git a/googleapi/__init__.py b/googleapi/__init__.py
new file mode 100644
index 0000000..3597c21
--- /dev/null
+++ b/googleapi/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import absolute_import
+from .modules import calculator, currency, images, utils
+from .modules import standard_search, shopping_search
diff --git a/googleapi/google.py b/googleapi/google.py
new file mode 100644
index 0000000..cd14f37
--- /dev/null
+++ b/googleapi/google.py
@@ -0,0 +1,29 @@
+from __future__ import unicode_literals
+from __future__ import absolute_import
+
+from .modules import images
+from .modules import currency
+from .modules import calculator
+from .modules import standard_search
+# from modules import shopping_search
+
+__author__ = "Anthony Casagrande , " + \
+ "Agustin Benassi "
+__version__ = "1.1.0"
+
+
+"""Defines the public inteface of the API."""
+
+search = standard_search.search
+search_images = images.search
+convert_currency = currency.convert
+exchange_rate = currency.exchange_rate
+calculate = calculator.calculate
+
+# TODO: This method is not working anymore! There is a new GET
+# link for this kind of search
+# shopping = shopping_search.shopping
+
+if __name__ == "__main__":
+ import doctest
+ doctest.testmod()
diff --git a/googleapi/modules/__init__.py b/googleapi/modules/__init__.py
new file mode 100644
index 0000000..0440d06
--- /dev/null
+++ b/googleapi/modules/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import print_function
+from . import calculator
+from . import currency
+from . import images
+from . import shopping_search
+from . import standard_search
diff --git a/googleapi/modules/calculator.py b/googleapi/modules/calculator.py
new file mode 100644
index 0000000..2a10f1d
--- /dev/null
+++ b/googleapi/modules/calculator.py
@@ -0,0 +1,91 @@
+from __future__ import unicode_literals
+from __future__ import absolute_import
+from builtins import object
+from unidecode import unidecode
+
+from .utils import get_html_from_dynamic_site
+from .utils import _get_search_url
+from bs4 import BeautifulSoup
+
+
+class CalculatorResult(object):
+
+ """Represents a result returned from google calculator."""
+
+ def __init__(self):
+ self.value = None # Result value (eg. 157300.0)
+ self.from_value = None # Initial value (eg. 157.3)
+ self.unit = None # Result unit (eg. u'grams') (NOT implemented yet)
+ # Initial unit (eg. u'kilograms') (NOT implemented yet)
+ self.from_unit = None
+ # Initial expression (eg. u'157.3 grams') (NOT implemented yet)
+ self.expr = None
+ # Result expression (eg. u'157300 kilograms') (NOT implemented yet)
+ self.result = None
+ # Complete expression (eg. u'157.3 kilograms = 157300 grams') (NOT
+ # implemented yet)
+ self.fullstring = None
+
+ def __repr__(self):
+ return unidecode(self.value)
+
+
+# PUBLIC
+def calculate(expr):
+ """Search for a calculation expression in google.
+
+ Attempts to search google calculator for the result of an expression.
+ Returns a `CalculatorResult` if successful or `None` if it fails.
+
+ Args:
+ expr: Calculation expression (eg. "cos(25 pi) / 17.4" or
+ "157.3kg in grams")
+
+ Returns:
+ CalculatorResult object."""
+
+ url = _get_search_url(expr)
+ html = get_html_from_dynamic_site(url)
+ bs = BeautifulSoup(html)
+
+ cr = CalculatorResult()
+ cr.value = _get_to_value(bs)
+ cr.from_value = _get_from_value(bs)
+ cr.unit = _get_to_unit(bs)
+ cr.from_unit = _get_from_unit(bs)
+ cr.expr = _get_expr(bs)
+ cr.result = _get_result(bs)
+ cr.fullstring = _get_fullstring(bs)
+
+ return cr
+
+
+# PRIVATE
+def _get_to_value(bs):
+ input_node = bs.find("div", {"id": "_Cif"})
+ return float(input_node.find("input")["value"])
+
+
+def _get_from_value(bs):
+ input_node = bs.find("div", {"id": "_Aif"})
+ return float(input_node.find("input")["value"])
+
+
+def _get_to_unit(bs):
+ return None
+
+
+def _get_from_unit(bs):
+ return None
+
+
+def _get_expr(bs):
+ return None
+
+
+def _get_result(bs):
+ return None
+
+
+def _get_fullstring(bs):
+ return None
diff --git a/googleapi/modules/currency.py b/googleapi/modules/currency.py
new file mode 100644
index 0000000..3c12bd0
--- /dev/null
+++ b/googleapi/modules/currency.py
@@ -0,0 +1,54 @@
+from __future__ import unicode_literals
+from __future__ import absolute_import
+
+from .utils import get_html
+from bs4 import BeautifulSoup
+
+
+# PUBLIC
+def convert(amount, from_currency, to_currency):
+ """Method to convert currency.
+
+ Args:
+ amount: numeric amount to convert
+ from_currency: currency denomination of the amount to convert
+ to_currency: target currency denomination to convert to
+ """
+
+ # same currency, no conversion
+ if from_currency == to_currency:
+ return amount * 1.0
+
+ req_url = _get_currency_req_url(amount,
+ from_currency, to_currency)
+ response = get_html(req_url)
+ rate = _parse_currency_response(response, to_currency)
+
+ return rate
+
+
+def exchange_rate(from_currency, to_currency):
+ """Gets the exchange rate of one currency to another.
+
+ Args:
+ from_currency: starting currency denomination (1)
+ to_currency: target currency denomination to convert to (rate)
+
+ Returns:
+ rate / 1 to convert from_currency in to_currency
+ """
+ return convert(1, from_currency, to_currency)
+
+
+# PRIVATE
+def _get_currency_req_url(amount, from_currency, to_currency):
+ return "https://www.google.com/finance/converter?a={0}&from={1}&to={2}".format(
+ amount, from_currency.replace(" ", "%20"),
+ to_currency.replace(" ", "%20"))
+
+
+def _parse_currency_response(response, to_currency):
+ bs = BeautifulSoup(response)
+ str_rate = bs.find(id="currency_converter_result").span.get_text()
+ rate = float(str_rate.replace(to_currency, "").strip())
+ return rate
diff --git a/googleapi/modules/images.py b/googleapi/modules/images.py
new file mode 100644
index 0000000..6490a93
--- /dev/null
+++ b/googleapi/modules/images.py
@@ -0,0 +1,565 @@
+from __future__ import unicode_literals
+from __future__ import print_function
+from __future__ import absolute_import
+from future import standard_library
+standard_library.install_aliases()
+from builtins import str
+from builtins import range
+from builtins import object
+from unidecode import unidecode
+
+from .utils import get_browser_with_url, write_html_to_file, measure_time
+from bs4 import BeautifulSoup
+import urllib.parse
+import sys
+import requests
+import shutil
+import os
+import threading
+import queue
+
+
+IMAGE_FORMATS = ["bmp", "gif", "jpg", "png", "psd", "pspimage", "thm",
+ "tif", "yuv", "ai", "drw", "eps", "ps", "svg", "tiff",
+ "jpeg", "jif", "jfif", "jp2", "jpx", "j2k", "j2c", "fpx",
+ "pcd", "png", "pdf"]
+
+
+# AUXILIARY CLASSES
+class ImageType(object):
+ NONE = None
+ FACE = "face"
+ PHOTO = "photo"
+ CLIPART = "clipart"
+ LINE_DRAWING = "lineart"
+
+
+class SizeCategory(object):
+ NONE = None
+ ICON = "i"
+ LARGE = "l"
+ MEDIUM = "m"
+ SMALL = "s"
+ LARGER_THAN = "lt"
+ EXACTLY = "ex"
+
+
+class LargerThan(object):
+ NONE = None
+ QSVGA = "qsvga" # 400 x 300
+ VGA = "vga" # 640 x 480
+ SVGA = "svga" # 800 x 600
+ XGA = "xga" # 1024 x 768
+ MP_2 = "2mp" # 2 MP (1600 x 1200)
+ MP_4 = "4mp" # 4 MP (2272 x 1704)
+ MP_6 = "6mp" # 6 MP (2816 x 2112)
+ MP_8 = "8mp" # 8 MP (3264 x 2448)
+ MP_10 = "10mp" # 10 MP (3648 x 2736)
+ MP_12 = "12mp" # 12 MP (4096 x 3072)
+ MP_15 = "15mp" # 15 MP (4480 x 3360)
+ MP_20 = "20mp" # 20 MP (5120 x 3840)
+ MP_40 = "40mp" # 40 MP (7216 x 5412)
+ MP_70 = "70mp" # 70 MP (9600 x 7200)
+
+
+class ColorType(object):
+ NONE = None
+ COLOR = "color"
+ BLACK_WHITE = "gray"
+ SPECIFIC = "specific"
+
+
+class License(object):
+ NONE = None
+ REUSE = "fc"
+ REUSE_WITH_MOD = "fmc"
+ REUSE_NON_COMMERCIAL = "f"
+ REUSE_WITH_MOD_NON_COMMERCIAL = "fm"
+
+
+class ImageOptions(object):
+
+ """Allows passing options to filter a google images search."""
+
+ def __init__(self):
+ self.image_type = None
+ self.size_category = None
+ self.larger_than = None
+ self.exact_width = None
+ self.exact_height = None
+ self.color_type = None
+ self.color = None
+ self.license = None
+
+ def __repr__(self):
+ return unidecode(self.__dict__)
+
+ def get_tbs(self):
+ tbs = None
+ if self.image_type:
+ # clipart
+ tbs = self._add_to_tbs(tbs, "itp", self.image_type)
+ if self.size_category and not (self.larger_than or (self.exact_width and self.exact_height)):
+ # i = icon, l = large, m = medium, lt = larger than, ex = exact
+ tbs = self._add_to_tbs(tbs, "isz", self.size_category)
+ if self.larger_than:
+ # qsvga,4mp
+ tbs = self._add_to_tbs(tbs, "isz", SizeCategory.LARGER_THAN)
+ tbs = self._add_to_tbs(tbs, "islt", self.larger_than)
+ if self.exact_width and self.exact_height:
+ tbs = self._add_to_tbs(tbs, "isz", SizeCategory.EXACTLY)
+ tbs = self._add_to_tbs(tbs, "iszw", self.exact_width)
+ tbs = self._add_to_tbs(tbs, "iszh", self.exact_height)
+ if self.color_type and not self.color:
+ # color = color, gray = black and white, specific = user defined
+ tbs = self._add_to_tbs(tbs, "ic", self.color_type)
+ if self.color:
+ tbs = self._add_to_tbs(tbs, "ic", ColorType.SPECIFIC)
+ tbs = self._add_to_tbs(tbs, "isc", self.color)
+ if self.license:
+ tbs = self._add_to_tbs(tbs, "sur", self.license)
+ return tbs
+
+ def _add_to_tbs(self, tbs, name, value):
+ if tbs:
+ return "%s,%s:%s" % (tbs, name, value)
+ else:
+ return "&tbs=%s:%s" % (name, value)
+
+
+class ImageResult(object):
+
+ """Represents a google image search result."""
+
+ ROOT_FILENAME = "img"
+ DEFAULT_FORMAT = "jpg"
+
+ def __init__(self):
+ self.name = None
+ self.file_name = None
+ self.link = None
+ self.thumb = None
+ self.thumb_width = None
+ self.thumb_height = None
+ self.width = None
+ self.height = None
+ self.filesize = None
+ self.format = None
+ self.domain = None
+ self.page = None
+ self.index = None
+ self.site = None
+
+ def __eq__(self, other):
+ return self.link == other.link
+
+ def __hash__(self):
+ return id(self.link)
+
+ def __repr__(self):
+ string = "ImageResult(index={i}, page={p}, domain={d}, link={l})".format(
+ i=str(self.index),
+ p=str(self.page),
+ d=unidecode(self.domain) if self.domain else None,
+ l=unidecode(self.link) if self.link else None
+ )
+ return string
+
+ def download(self, path="images"):
+ """Download an image to a given path."""
+
+ self._create_path(path)
+ # print path
+
+ try:
+ response = requests.get(self.link, stream=True)
+ # request a protected image (adding a referer to the request)
+ # referer = self.domain
+ # image = self.link
+
+ # req = urllib2.Request(image)
+ # req.add_header('Referer', referer) # here is the trick
+ # response = urllib2.urlopen(req)
+
+ if "image" in response.headers['content-type']:
+ path_filename = self._get_path_filename(path)
+ with open(path_filename, 'wb') as output_file:
+ shutil.copyfileobj(response.raw, output_file)
+ # output_file.write(response.content)
+ else:
+ print("\r\rskiped! cached image")
+
+ del response
+
+ except Exception as inst:
+ print(self.link, "has failed:")
+ print(inst)
+
+ def _get_path_filename(self, path):
+ """Build the filename to download.
+
+ Checks that filename is not already in path. Otherwise looks for
+ another name.
+
+ >>> ir = ImageResult()
+ >>> ir._get_path_filename("test")
+ 'test\\\img3.jpg'
+ >>> ir.name = "pirulo"
+ >>> ir.format = "jpg"
+ >>> ir._get_path_filename("test")
+ 'test\\\pirulo.jpg'
+ """
+
+ path_filename = None
+
+ # preserve the original name
+ if self.file_name:
+ original_filename = self.file_name
+ path_filename = os.path.join(path, original_filename)
+
+ # create a default name if there is no original name
+ if not path_filename or os.path.isfile(path_filename):
+
+ # take the format of the file, or use default
+ if self.format:
+ file_format = self.format
+ else:
+ file_format = self.DEFAULT_FORMAT
+
+ # create root of file, until reaching a non existent one
+ i = 1
+ default_filename = self.ROOT_FILENAME + str(i) + "." + file_format
+ path_filename = os.path.join(path, default_filename)
+ while os.path.isfile(path_filename):
+ i += 1
+ default_filename = self.ROOT_FILENAME + str(i) + "." + \
+ file_format
+ path_filename = os.path.join(path, default_filename)
+
+ return path_filename
+
+ def _create_path(self, path):
+ """Create a path, if it doesn't exists."""
+
+ if not os.path.isdir(path):
+ os.mkdir(path)
+
+
+# PRIVATE
+def _parse_image_format(image_link):
+ """Parse an image format from a download link.
+
+ Args:
+ image_link: link to download an image.
+
+ >>> link = "http://blogs.elpais.com/.a/6a00d8341bfb1653ef01a73dbb4a78970d-pi"
+ >>> Google._parse_image_format(link)
+
+ >>> link = "http://minionslovebananas.com/images/gallery/preview/Chiquita-DM2-minion-banana-3.jpg%3Fw%3D300%26h%3D429"
+ >>> Google._parse_image_format(link)
+
+ """
+ parsed_format = image_link[image_link.rfind(".") + 1:]
+
+ # OLD: identify formats even with weird final characters
+ if parsed_format not in IMAGE_FORMATS:
+ for image_format in IMAGE_FORMATS:
+ if image_format in parsed_format:
+ parsed_format = image_format
+ break
+
+ if parsed_format not in IMAGE_FORMATS:
+ parsed_format = None
+
+ return parsed_format
+
+
+def _get_images_req_url(query, image_options=None, page=0,
+ per_page=20):
+ query = query.strip().replace(":", "%3A").replace(
+ "+", "%2B").replace("&", "%26").replace(" ", "+")
+
+ url = "https://www.google.com.ar/search?q={}".format(query) + \
+ "&es_sm=122&source=lnms" + \
+ "&tbm=isch&sa=X&ei=DDdUVL-fE4SpNq-ngPgK&ved=0CAgQ_AUoAQ" + \
+ "&biw=1024&bih=719&dpr=1.25"
+
+ if image_options:
+ tbs = image_options.get_tbs()
+ if tbs:
+ url = url + tbs
+
+ return url
+
+
+def _find_divs_with_images(soup):
+
+ try:
+ div_container = soup.find("div", {"id": "rg_s"})
+ divs = div_container.find_all("div", {"class": "rg_di"})
+ except:
+ divs = None
+ return divs
+
+
+def _get_file_name(link):
+
+ temp_name = link.rsplit('/', 1)[-1]
+ image_format = _parse_image_format(link)
+
+ if image_format and temp_name.rsplit(".", 1)[-1] != image_format:
+ file_name = temp_name.rsplit(".", 1)[0] + "." + image_format
+
+ else:
+ file_name = temp_name
+
+ return file_name
+
+
+def _get_name():
+ pass
+
+
+def _get_filesize():
+ pass
+
+
+def _get_image_data(res, a):
+ """Parse image data and write it to an ImageResult object.
+
+ Args:
+ res: An ImageResult object.
+ a: An "a" html tag.
+ """
+ google_middle_link = a["href"]
+ url_parsed = urllib.parse.urlparse(google_middle_link)
+ qry_parsed = urllib.parse.parse_qs(url_parsed.query)
+ res.name = _get_name()
+ res.link = qry_parsed["imgurl"][0]
+ res.file_name = _get_file_name(res.link)
+ res.format = _parse_image_format(res.link)
+ res.width = qry_parsed["w"][0]
+ res.height = qry_parsed["h"][0]
+ res.site = qry_parsed["imgrefurl"][0]
+ res.domain = urllib.parse.urlparse(res.site).netloc
+ res.filesize = _get_filesize()
+
+
+def _get_thumb_data(res, img):
+ """Parse thumb data and write it to an ImageResult object.
+
+ Args:
+ res: An ImageResult object.
+ a: An "a" html tag.
+ """
+ try:
+ res.thumb = img[0]["src"]
+ except:
+ res.thumb = img[0]["data-src"]
+
+ try:
+ img_style = img[0]["style"].split(";")
+ img_style_dict = {i.split(":")[0]: i.split(":")[-1] for i in img_style}
+ res.thumb_width = img_style_dict["width"]
+ res.thumb_height = img_style_dict["height"]
+ except:
+ exc_type, exc_value, exc_traceback = sys.exc_info()
+ print(exc_type, exc_value, "index=", res.index)
+
+
+# PUBLIC
+def search_old(query, image_options=None, pages=1):
+ results = []
+ for i in range(pages):
+ url = get_image_search_url(query, image_options, i)
+ html = get_html(url)
+ if html:
+ if Google.DEBUG_MODE:
+ write_html_to_file(
+ html, "images_{0}_{1}.html".format(query.replace(" ", "_"), i))
+ j = 0
+ soup = BeautifulSoup(html)
+ match = re.search("dyn.setResults\((.+)\);", html)
+ if match:
+ init = str(match.group(1), errors="ignore")
+ tokens = init.split('],[')
+ for token in tokens:
+ res = ImageResult()
+ res.page = i
+ res.index = j
+ toks = token.split(",")
+
+ # should be 32 or 33, but seems to change, so just make sure no exceptions
+ # will be thrown by the indexing
+ if (len(toks) > 22):
+ for t in range(len(toks)):
+ toks[t] = toks[t].replace('\\x3cb\\x3e', '').replace(
+ '\\x3c/b\\x3e', '').replace('\\x3d', '=').replace('\\x26', '&')
+ match = re.search(
+ "imgurl=(?P[^&]+)&imgrefurl", toks[0])
+ if match:
+ res.link = match.group("link")
+ res.name = toks[6].replace('"', '')
+ res.thumb = toks[21].replace('"', '')
+ res.format = toks[10].replace('"', '')
+ res.domain = toks[11].replace('"', '')
+ match = re.search(
+ "(?P[0-9]+) × (?P[0-9]+) - (?P[^ ]+)", toks[9].replace('"', ''))
+ if match:
+ res.width = match.group("width")
+ res.height = match.group("height")
+ res.filesize = match.group("size")
+ results.append(res)
+ j = j + 1
+ return results
+
+
+def search(query, image_options=None, num_images=50):
+ """Search images in google.
+
+ Search images in google filtering by image type, size category, resolution,
+ exact width, exact height, color type or color. A simple search can be
+ performed without passing options. To filter the search, an ImageOptions
+ must be built with the different filter categories and passed.
+
+ Args:
+ query: string to search in google images
+ image_options: an ImageOptions object to filter the search
+ num_images: number of images to be scraped
+
+ Returns:
+ A list of ImageResult objects
+ """
+
+ results = set()
+ curr_num_img = 1
+ page = 0
+ browser = get_browser_with_url("about:home")
+ while curr_num_img <= num_images:
+
+ page += 1
+ url = _get_images_req_url(query, image_options, page)
+ # html = get_html_from_dynamic_site(url)
+ browser.get(url)
+ html = browser.page_source
+
+ if html:
+ soup = BeautifulSoup(html)
+
+ # iterate over the divs containing images in one page
+ divs = _find_divs_with_images(soup)
+
+ # empty search result page case
+ if not divs:
+ break
+
+ for div in divs:
+
+ res = ImageResult()
+
+ # store indexing paramethers
+ res.page = page
+ res.index = curr_num_img
+
+ # get url of image and its secondary data
+ a = div.find("a")
+ if a:
+ _get_image_data(res, a)
+
+ # get url of thumb and its size paramethers
+ img = a.find_all("img")
+ if img:
+ _get_thumb_data(res, img)
+
+ # increment image counter only if a new image was added
+ prev_num_results = len(results)
+ results.add(res)
+ curr_num_results = len(results)
+
+ if curr_num_results > prev_num_results:
+ curr_num_img += 1
+
+ # break the loop when limit of images is reached
+ if curr_num_img >= num_images:
+ break
+
+ browser.quit()
+
+ return list(results)
+
+
+def _download_image(image_result, path):
+
+ if image_result.format:
+ if path:
+ image_result.download(path)
+ else:
+ image_result.download()
+
+
+@measure_time
+def download(image_results, path=None):
+ """Download a list of images.
+
+ Args:
+ images_list: a list of ImageResult instances
+ path: path to store downloaded images.
+ """
+
+ total_images = len(image_results)
+ i = 1
+ for image_result in image_results:
+
+ progress = "".join(["Downloading image ", str(i),
+ " (", str(total_images), ")"])
+ print(progress)
+ sys.stdout.flush()
+
+ _download_image(image_result, path)
+
+ i += 1
+
+
+class ThreadUrl(threading.Thread):
+
+ """Threaded Url Grab"""
+
+ def __init__(self, queue, path, total):
+ threading.Thread.__init__(self)
+ self.queue = queue
+ self.path = path
+ self.total = total
+
+ def run(self):
+ while True:
+ # grabs host from queue
+ image_result = self.queue.get()
+
+ counter = self.total - self.queue.qsize()
+ progress = "".join(["Downloading image ", str(counter),
+ " (", str(self.total), ")"])
+ print(progress)
+ sys.stdout.flush()
+ _download_image(image_result, self.path)
+
+ # signals to queue job is done
+ self.queue.task_done()
+
+
+@measure_time
+def fast_download(image_results, path=None, threads=10):
+ # print path
+ queue = queue.Queue()
+ total = len(image_results)
+
+ for image_result in image_results:
+ queue.put(image_result)
+
+ # spawn a pool of threads, and pass them queue instance
+ for i in range(threads):
+ t = ThreadUrl(queue, path, total)
+ t.setDaemon(True)
+ t.start()
+
+ # wait on the queue until everything has been processed
+ queue.join()
diff --git a/googleapi/modules/shopping_search.py b/googleapi/modules/shopping_search.py
new file mode 100644
index 0000000..aa4bd9b
--- /dev/null
+++ b/googleapi/modules/shopping_search.py
@@ -0,0 +1,81 @@
+from __future__ import unicode_literals
+from __future__ import print_function
+from __future__ import absolute_import
+
+from builtins import range
+from builtins import object
+
+from .utils import get_html, normalize_query
+from bs4 import BeautifulSoup
+import re
+from unidecode import unidecode
+
+
+class ShoppingResult(object):
+
+ """Represents a shopping result."""
+
+ def __init__(self):
+ self.name = None
+ self.link = None
+ self.thumb = None
+ self.subtext = None
+ self.description = None
+ self.compare_url = None
+ self.store_count = None
+ self.min_price = None
+
+ def __repr__(self):
+ return unidecode(self.name)
+
+
+def shopping(query, pages=1):
+ results = []
+ for i in range(pages):
+ url = _get_shopping_url(query, i)
+ html = get_html(url)
+ if html:
+ j = 0
+ soup = BeautifulSoup(html)
+
+ products = soup.findAll("div", "g")
+ print("yoooo", products)
+ for prod in products:
+ res = ShoppingResult()
+
+ divs = prod.findAll("div")
+ for div in divs:
+ match = re.search(
+ "from (?P[0-9]+) stores", div.text.strip())
+ if match:
+ res.store_count = match.group("count")
+ break
+
+ h3 = prod.find("h3", "r")
+ if h3:
+ a = h3.find("a")
+ if a:
+ res.compare_url = a["href"]
+ res.name = h3.text.strip()
+
+ psliimg = prod.find("div", "psliimg")
+ if psliimg:
+ img = psliimg.find("img")
+ if img:
+ res.thumb = img["src"]
+
+ f = prod.find("div", "f")
+ if f:
+ res.subtext = f.text.strip()
+
+ price = prod.find("div", "psliprice")
+ if price:
+ res.min_price = price.text.strip()
+
+ results.append(res)
+ j = j + 1
+ return results
+
+
+def _get_shopping_url(query, page=0, per_page=10):
+ return "http://www.google.com/search?hl=en&q={0}&tbm=shop&start={1}&num={2}".format(normalize_query(query), page * per_page, per_page)
diff --git a/googleapi/modules/standard_search.py b/googleapi/modules/standard_search.py
new file mode 100644
index 0000000..7862940
--- /dev/null
+++ b/googleapi/modules/standard_search.py
@@ -0,0 +1,236 @@
+from __future__ import unicode_literals
+from __future__ import absolute_import
+
+from future import standard_library
+standard_library.install_aliases()
+from builtins import range
+from builtins import object
+from .utils import _get_search_url, get_html
+from bs4 import BeautifulSoup
+import urllib.parse
+from urllib.parse import unquote, parse_qs, urlparse
+from unidecode import unidecode
+from re import match, findall
+
+
+class GoogleResult(object):
+
+ """Represents a google search result."""
+
+ def __init__(self):
+ self.name = None # The title of the link
+ self.link = None # The external link
+ self.google_link = None # The google link
+ self.description = None # The description of the link
+ self.thumb = None # Thumbnail link of website (NOT implemented yet)
+ self.cached = None # Cached version link of page
+ self.page = None # Results page this one was on
+ self.index = None # What index on this page it was on
+ self.number_of_results = None # The total number of results the query returned
+ self.is_pdf = None # This boolean is true if google thinks this result leads to a PDF file
+
+ def __repr__(self):
+ name = self._limit_str_size(self.name, 55)
+ description = self._limit_str_size(self.description, 49)
+
+ list_google = ["GoogleResult(",
+ "name={}".format(name), "\n", " " * 13,
+ "description={}".format(description)]
+
+ return "".join(list_google)
+
+ def _limit_str_size(self, str_element, size_limit):
+ """Limit the characters of the string, adding .. at the end."""
+ if not str_element:
+ return None
+
+ elif len(str_element) > size_limit:
+ return unidecode(str_element[:size_limit]) + ".."
+
+ else:
+ return unidecode(str_element)
+
+
+# PUBLIC
+def search(query, pages=1, lang='en', area='com', ncr=False, void=True, time_period=False, sort_by_date=False, first_page=0):
+ """Returns a list of GoogleResult.
+
+ Args:
+ query: String to search in google.
+ pages: Number of pages where results must be taken.
+ area : Area of google homepages.
+ first_page : First page.
+
+ TODO: add support to get the google results.
+ Returns:
+ A GoogleResult object."""
+
+ results = []
+ for i in range(first_page, first_page + pages):
+ url = _get_search_url(query, i, lang=lang, area=area, ncr=ncr, time_period=time_period, sort_by_date=sort_by_date)
+ html = get_html(url)
+
+ if html:
+ soup = BeautifulSoup(html, "html.parser")
+ divs = soup.findAll("div", attrs={"class": "g"})
+
+ results_div = soup.find("div", attrs={"id": "resultStats"})
+ number_of_results = _get_number_of_results(results_div)
+
+ j = 0
+ for li in divs:
+ res = GoogleResult()
+
+ res.page = i
+ res.index = j
+
+ res.name = _get_name(li)
+ res.link = _get_link(li)
+ res.google_link = _get_google_link(li)
+ res.description = _get_description(li)
+ res.thumb = _get_thumb()
+ res.cached = _get_cached(li)
+ res.number_of_results = number_of_results
+ res.is_pdf = _get_is_pdf(li)
+
+ if void is True:
+ if res.description is None:
+ continue
+ results.append(res)
+ j += 1
+ return results
+
+
+# PRIVATE
+def _get_name(li):
+ """Return the name of a google search."""
+ a = li.find("a")
+ # return a.text.encode("utf-8").strip()
+ if a is not None:
+ return a.text.strip()
+ return None
+
+
+def _filter_link(link):
+ '''Filter links found in the Google result pages HTML code.
+ Returns None if the link doesn't yield a valid result.
+ '''
+ try:
+ # Valid results are absolute URLs not pointing to a Google domain
+ # like images.google.com or googleusercontent.com
+ o = urlparse(link, 'http')
+ # link type-1
+ # >>> "https://www.gitbook.com/book/ljalphabeta/python-"
+ if o.netloc and 'google' not in o.netloc:
+ return link
+ # link type-2
+ # >>> "http://www.google.com/url?url=http://python.jobbole.com/84108/&rct=j&frm=1&q=&esrc=s&sa=U&ved=0ahUKEwj3quDH-Y7UAhWG6oMKHdQ-BQMQFggUMAA&usg=AFQjCNHPws5Buru5Z71wooRLHT6mpvnZlA"
+ if o.netloc and o.path.startswith('/url'):
+ try:
+ link = parse_qs(o.query)['url'][0]
+ o = urlparse(link, 'http')
+ if o.netloc and 'google' not in o.netloc:
+ return link
+ except KeyError:
+ pass
+ # Decode hidden URLs.
+ if link.startswith('/url?'):
+ try:
+ # link type-3
+ # >>> "/url?q=http://python.jobbole.com/84108/&sa=U&ved=0ahUKEwjFw6Txg4_UAhVI5IMKHfqVAykQFggUMAA&usg=AFQjCNFOTLpmpfqctpIn0sAfaj5U5gAU9A"
+ link = parse_qs(o.query)['q'][0]
+ # Valid results are absolute URLs not pointing to a Google domain
+ # like images.google.com or googleusercontent.com
+ o = urlparse(link, 'http')
+ if o.netloc and 'google' not in o.netloc:
+ return link
+ except KeyError:
+ # link type-4
+ # >>> "/url?url=https://machine-learning-python.kspax.io/&rct=j&frm=1&q=&esrc=s&sa=U&ved=0ahUKEwj3quDH-Y7UAhWG6oMKHdQ-BQMQFggfMAI&usg=AFQjCNEfkUI0RP_RlwD3eI22rSfqbYM_nA"
+ link = parse_qs(o.query)['url'][0]
+ o = urlparse(link, 'http')
+ if o.netloc and 'google' not in o.netloc:
+ return link
+
+ # Otherwise, or on error, return None.
+ except Exception:
+ pass
+ return None
+
+
+def _get_link(li):
+ """Return external link from a search."""
+ try:
+ a = li.find("a")
+ link = a["href"]
+ except Exception:
+ return None
+ return _filter_link(link)
+
+
+def _get_google_link(li):
+ """Return google link from a search."""
+ try:
+ a = li.find("a")
+ link = a["href"]
+ except Exception:
+ return None
+
+ if link.startswith("/url?") or link.startswith("/search?"):
+ return urllib.parse.urljoin("http://www.google.com", link)
+
+ else:
+ return None
+
+
+def _get_description(li):
+ """Return the description of a google search.
+
+ TODO: There are some text encoding problems to resolve."""
+
+ sdiv = li.find("div", attrs={"class": "IsZvec"})
+ if sdiv:
+ stspan = sdiv.find("span", attrs={"class": "aCOpRe"})
+ if stspan is not None:
+ # return stspan.text.encode("utf-8").strip()
+ return stspan.text.strip()
+ else:
+ return None
+
+
+def _get_thumb():
+ """Return the link to a thumbnail of the website."""
+ pass
+
+
+def _get_cached(li):
+ """Return a link to the cached version of the page."""
+ links = li.find_all("a")
+ if len(links) > 1 and links[1].text == "Cached":
+ link = links[1]["href"]
+ if link.startswith("/url?") or link.startswith("/search?"):
+ return urllib.parse.urljoin("http://www.google.com", link)
+ return None
+
+def _get_is_pdf(li):
+ """Return if the link is marked by google as PDF"""
+ sdiv = li.find("span", attrs={"class": "ZGwO7 C0kchf NaCKVc"})
+ return True if sdiv else False
+
+def _get_number_of_results(results_div):
+ """Return the total number of results of the google search.
+ Note that the returned value will be the same for all the GoogleResult
+ objects from a specific query."""
+ try:
+ results_div_text = results_div.get_text()
+ if results_div_text:
+ regex = r"((?:\d+[,\.])*\d+)"
+ m = findall(regex, results_div_text)
+
+ # Clean up the number.
+ num = m[0].replace(",", "").replace(".", "")
+
+ results = int(num)
+ return results
+ except Exception as e:
+ return 0
diff --git a/googleapi/modules/utils.py b/googleapi/modules/utils.py
new file mode 100644
index 0000000..0f18be6
--- /dev/null
+++ b/googleapi/modules/utils.py
@@ -0,0 +1,560 @@
+from __future__ import unicode_literals
+from __future__ import print_function
+from __future__ import division
+
+from future import standard_library
+standard_library.install_aliases()
+from builtins import range
+from past.utils import old_div
+import time
+from selenium import webdriver
+import urllib.request
+import urllib.error
+import urllib.parse
+from functools import wraps
+# import requests
+from urllib.parse import urlencode
+from fake_useragent import UserAgent
+import sys
+
+class AreaError(KeyError):
+ pass
+
+
+def measure_time(fn):
+
+ def decorator(*args, **kwargs):
+ start = time.time()
+
+ res = fn(*args, **kwargs)
+
+ elapsed = time.time() - start
+ print(fn.__name__, "took", elapsed, "seconds")
+
+ return res
+
+ return decorator
+
+
+def normalize_query(query):
+ return query.strip().replace(":", "%3A").replace("+", "%2B").replace("&", "%26").replace(" ", "+")
+
+
+def _get_search_url(query, page=0, per_page=10, lang='en', area='com', ncr=False, time_period=False, sort_by_date=False):
+ # note: num per page might not be supported by google anymore (because of
+ # google instant)
+
+ params = {
+ 'nl': lang,
+ 'q': query.encode('utf8'),
+ 'start': page * per_page,
+ 'num': per_page
+ }
+
+ time_mapping = {
+ 'hour': 'qdr:h',
+ 'week': 'qdr:w',
+ 'month': 'qdr:m',
+ 'year': 'qdr:y'
+ }
+
+
+ tbs_param = []
+ # Set time period for query if given
+ if time_period and time_period in time_mapping:
+ tbs_param.append(time_mapping[time_period])
+
+ if sort_by_date:
+ tbs_param.append('sbd:1')
+ params['tbs'] = ','.join(tbs_param)
+
+ # This will allow to search Google with No Country Redirect
+ if ncr:
+ params['gl'] = 'us' # Geographic Location: US
+ params['pws'] = '0' # 'pws' = '0' disables personalised search
+ params['gws_rd'] = 'cr' # Google Web Server ReDirect: CountRy.
+
+ params = urlencode(params)
+
+ url = u"https://www.google.com/search?" + params
+
+ # @author JuaniFilardo:
+ # Workaround to switch between http and https, since this maneuver
+ # seems to avoid the 503 error when performing a lot of queries.
+ # Weird, but it works.
+ # You may also wanna wait some time between queries, say, randint(50,65)
+ # between each query, and randint(180,240) every 100 queries, which is
+ # what I found useful.
+ https = int(time.time()) % 2 == 0
+ bare_url = u"https://www.google.com/search?" if https else u"http://www.google.com/search?"
+ url = bare_url + params
+
+ # return u"http://www.google.com/search?hl=%s&q=%s&start=%i&num=%i" %
+ # (lang, normalize_query(query), page * per_page, per_page)
+ if not ncr:
+ if area == 'com':
+ url = u"http://www.google.com/search?"
+ elif area == 'is':
+ url = 'http://www.google.is/search?'
+ elif area == 'dk':
+ url = 'http://www.google.dk/search?'
+ elif area == 'no':
+ url = 'http://www.google.no/search?'
+ elif area == 'se':
+ url = 'http://www.google.se/search?'
+ elif area == 'fi':
+ url = 'http://www.google.fi/search?'
+ elif area == 'ee':
+ url = 'http://www.google.ee/search?'
+ elif area == 'lv':
+ url = 'http://www.google.lv/search?'
+ elif area == 'lt':
+ url = 'http://www.google.lt/search?'
+ elif area == 'ie':
+ url = 'http://www.google.ie/search?'
+ elif area == 'uk':
+ url = 'http://www.google.co.uk/search?'
+ elif area == 'gg':
+ url = 'http://www.google.gg/search?'
+ elif area == 'je':
+ url = 'http://www.google.je/search?'
+ elif area == 'im':
+ url = 'http://www.google.im/search?'
+ elif area == 'fr':
+ url = 'http://www.google.fr/search?'
+ elif area == 'nl':
+ url = 'http://www.google.nl/search?'
+ elif area == 'be':
+ url = 'http://www.google.be/search?'
+ elif area == 'lu':
+ url = 'http://www.google.lu/search?'
+ elif area == 'de':
+ url = 'http://www.google.de/search?'
+ elif area == 'at':
+ url = 'http://www.google.at/search?'
+ elif area == 'ch':
+ url = 'http://www.google.ch/search?'
+ elif area == 'li':
+ url = 'http://www.google.li/search?'
+ elif area == 'pt':
+ url = 'http://www.google.pt/search?'
+ elif area == 'es':
+ url = 'http://www.google.es/search?'
+ elif area == 'gi':
+ url = 'http://www.google.com.gi/search?'
+ elif area == 'ad':
+ url = 'http://www.google.ad/search?'
+ elif area == 'it':
+ url = 'http://www.google.it/search?'
+ elif area == 'mt':
+ url = 'http://www.google.com.mt/search?'
+ elif area == 'sm':
+ url = 'http://www.google.sm/search?'
+ elif area == 'gr':
+ url = 'http://www.google.gr/search?'
+ elif area == 'ru':
+ url = 'http://www.google.ru/search?'
+ elif area == 'by':
+ url = 'http://www.google.com.by/search?'
+ elif area == 'ua':
+ url = 'http://www.google.com.ua/search?'
+ elif area == 'pl':
+ url = 'http://www.google.pl/search?'
+ elif area == 'cz':
+ url = 'http://www.google.cz/search?'
+ elif area == 'sk':
+ url = 'http://www.google.sk/search?'
+ elif area == 'hu':
+ url = 'http://www.google.hu/search?'
+ elif area == 'si':
+ url = 'http://www.google.si/search?'
+ elif area == 'hr':
+ url = 'http://www.google.hr/search?'
+ elif area == 'ba':
+ url = 'http://www.google.ba/search?'
+ elif area == 'me':
+ url = 'http://www.google.me/search?'
+ elif area == 'rs':
+ url = 'http://www.google.rs/search?'
+ elif area == 'mk':
+ url = 'http://www.google.mk/search?'
+ elif area == 'bg':
+ url = 'http://www.google.bg/search?'
+ elif area == 'ro':
+ url = 'http://www.google.ro/search?'
+ elif area == 'md':
+ url = 'http://www.google.md/search?'
+ elif area == 'hk':
+ url = 'http://www.google.com.hk/search?'
+ elif area == 'mn':
+ url = 'http://www.google.mn/search?'
+ elif area == 'kr':
+ url = 'http://www.google.co.kr/search?'
+ elif area == 'jp':
+ url = 'http://www.google.co.jp/search?'
+ elif area == 'vn':
+ url = 'http://www.google.com.vn/search?'
+ elif area == 'la':
+ url = 'http://www.google.la/search?'
+ elif area == 'kh':
+ url = 'http://www.google.com.kh/search?'
+ elif area == 'th':
+ url = 'http://www.google.co.th/search?'
+ elif area == 'my':
+ url = 'http://www.google.com.my/search?'
+ elif area == 'sg':
+ url = 'http://www.google.com.sg/search?'
+ elif area == 'bn':
+ url = 'http://www.google.com.bn/search?'
+ elif area == 'ph':
+ url = 'http://www.google.com.ph/search?'
+ elif area == 'id':
+ url = 'http://www.google.co.id/search?'
+ elif area == 'tp':
+ url = 'http://www.google.tp/search?'
+ elif area == 'kz':
+ url = 'http://www.google.kz/search?'
+ elif area == 'kg':
+ url = 'http://www.google.kg/search?'
+ elif area == 'tj':
+ url = 'http://www.google.com.tj/search?'
+ elif area == 'uz':
+ url = 'http://www.google.co.uz/search?'
+ elif area == 'tm':
+ url = 'http://www.google.tm/search?'
+ elif area == 'af':
+ url = 'http://www.google.com.af/search?'
+ elif area == 'pk':
+ url = 'http://www.google.com.pk/search?'
+ elif area == 'np':
+ url = 'http://www.google.com.np/search?'
+ elif area == 'in':
+ url = 'http://www.google.co.in/search?'
+ elif area == 'bd':
+ url = 'http://www.google.com.bd/search?'
+ elif area == 'lk':
+ url = 'http://www.google.lk/search?'
+ elif area == 'mv':
+ url = 'http://www.google.mv/search?'
+ elif area == 'kw':
+ url = 'http://www.google.com.kw/search?'
+ elif area == 'sa':
+ url = 'http://www.google.com.sa/search?'
+ elif area == 'bh':
+ url = 'http://www.google.com.bh/search?'
+ elif area == 'ae':
+ url = 'http://www.google.ae/search?'
+ elif area == 'om':
+ url = 'http://www.google.com.om/search?'
+ elif area == 'jo':
+ url = 'http://www.google.jo/search?'
+ elif area == 'il':
+ url = 'http://www.google.co.il/search?'
+ elif area == 'lb':
+ url = 'http://www.google.com.lb/search?'
+ elif area == 'tr':
+ url = 'http://www.google.com.tr/search?'
+ elif area == 'az':
+ url = 'http://www.google.az/search?'
+ elif area == 'am':
+ url = 'http://www.google.am/search?'
+ elif area == 'ls':
+ url = 'http://www.google.co.ls/search?'
+ elif area == 'eg':
+ url = 'http://www.google.com.eg/search?'
+ elif area == 'ly':
+ url = 'http://www.google.com.ly/search?'
+ elif area == 'dz':
+ url = 'http://www.google.dz/search?'
+ elif area == 'ma':
+ url = 'http://www.google.co.ma/search?'
+ elif area == 'sn':
+ url = 'http://www.google.sn/search?'
+ elif area == 'gm':
+ url = 'http://www.google.gm/search?'
+ elif area == 'ml':
+ url = 'http://www.google.ml/search?'
+ elif area == 'bf':
+ url = 'http://www.google.bf/search?'
+ elif area == 'sl':
+ url = 'http://www.google.com.sl/search?'
+ elif area == 'ci':
+ url = 'http://www.google.ci/search?'
+ elif area == 'gh':
+ url = 'http://www.google.com.gh/search?'
+ elif area == 'tg':
+ url = 'http://www.google.tg/search?'
+ elif area == 'bj':
+ url = 'http://www.google.bj/search?'
+ elif area == 'ne':
+ url = 'http://www.google.ne/search?'
+ elif area == 'ng':
+ url = 'http://www.google.com.ng/search?'
+ elif area == 'sh':
+ url = 'http://www.google.sh/search?'
+ elif area == 'cm':
+ url = 'http://www.google.cm/search?'
+ elif area == 'td':
+ url = 'http://www.google.td/search?'
+ elif area == 'cf':
+ url = 'http://www.google.cf/search?'
+ elif area == 'ga':
+ url = 'http://www.google.ga/search?'
+ elif area == 'cg':
+ url = 'http://www.google.cg/search?'
+ elif area == 'cd':
+ url = 'http://www.google.cd/search?'
+ elif area == 'ao':
+ url = 'http://www.google.it.ao/search?'
+ elif area == 'et':
+ url = 'http://www.google.com.et/search?'
+ elif area == 'dj':
+ url = 'http://www.google.dj/search?'
+ elif area == 'ke':
+ url = 'http://www.google.co.ke/search?'
+ elif area == 'ug':
+ url = 'http://www.google.co.ug/search?'
+ elif area == 'tz':
+ url = 'http://www.google.co.tz/search?'
+ elif area == 'rw':
+ url = 'http://www.google.rw/search?'
+ elif area == 'bi':
+ url = 'http://www.google.bi/search?'
+ elif area == 'mw':
+ url = 'http://www.google.mw/search?'
+ elif area == 'mz':
+ url = 'http://www.google.co.mz/search?'
+ elif area == 'mg':
+ url = 'http://www.google.mg/search?'
+ elif area == 'sc':
+ url = 'http://www.google.sc/search?'
+ elif area == 'mu':
+ url = 'http://www.google.mu/search?'
+ elif area == 'zm':
+ url = 'http://www.google.co.zm/search?'
+ elif area == 'zw':
+ url = 'http://www.google.co.zw/search?'
+ elif area == 'bw':
+ url = 'http://www.google.co.bw/search?'
+ elif area == 'na':
+ url = 'http://www.google.com.na/search?'
+ elif area == 'za':
+ url = 'http://www.google.co.za/search?'
+ elif area == 'au':
+ url = 'http://www.google.com.au/search?'
+ elif area == 'nf':
+ url = 'http://www.google.com.nf/search?'
+ elif area == 'nz':
+ url = 'http://www.google.co.nz/search?'
+ elif area == 'sb':
+ url = 'http://www.google.com.sb/search?'
+ elif area == 'fj':
+ url = 'http://www.google.com.fj/search?'
+ elif area == 'fm':
+ url = 'http://www.google.fm/search?'
+ elif area == 'ki':
+ url = 'http://www.google.ki/search?'
+ elif area == 'nr':
+ url = 'http://www.google.nr/search?'
+ elif area == 'tk':
+ url = 'http://www.google.tk/search?'
+ elif area == 'ws':
+ url = 'http://www.google.ws/search?'
+ elif area == 'as':
+ url = 'http://www.google.as/search?'
+ elif area == 'to':
+ url = 'http://www.google.to/search?'
+ elif area == 'nu':
+ url = 'http://www.google.nu/search?'
+ elif area == 'ck':
+ url = 'http://www.google.co.ck/search?'
+ elif area == 'do':
+ url = 'http://www.google.com.do/search?'
+ elif area == 'tt':
+ url = 'http://www.google.tt/search?'
+ elif area == 'co':
+ url = 'http://www.google.com.co/search?'
+ elif area == 'ec':
+ url = 'http://www.google.com.ec/search?'
+ elif area == 've':
+ url = 'http://www.google.co.ve/search?'
+ elif area == 'gy':
+ url = 'http://www.google.gy/search?'
+ elif area == 'pe':
+ url = 'http://www.google.com.pe/search?'
+ elif area == 'bo':
+ url = 'http://www.google.com.bo/search?'
+ elif area == 'py':
+ url = 'http://www.google.com.py/search?'
+ elif area == 'br':
+ url = 'http://www.google.com.br/search?'
+ elif area == 'uy':
+ url = 'http://www.google.com.uy/search?'
+ elif area == 'ar':
+ url = 'http://www.google.com.ar/search?'
+ elif area == 'cl':
+ url = 'http://www.google.cl/search?'
+ elif area == 'gl':
+ url = 'http://www.google.gl/search?'
+ elif area == 'ca':
+ url = 'http://www.google.ca/search?'
+ elif area == 'mx':
+ url = 'http://www.google.com.mx/search?'
+ elif area == 'gt':
+ url = 'http://www.google.com.gt/search?'
+ elif area == 'bz':
+ url = 'http://www.google.com.bz/search?'
+ elif area == 'sv':
+ url = 'http://www.google.com.sv/search?'
+ elif area == 'hn':
+ url = 'http://www.google.hn/search?'
+ elif area == 'ni':
+ url = 'http://www.google.com.ni/search?'
+ elif area == 'cr':
+ url = 'http://www.google.co.cr/search?'
+ elif area == 'pa':
+ url = 'http://www.google.com.pa/search?'
+ elif area == 'bs':
+ url = 'http://www.google.bs/search?'
+ elif area == 'cu':
+ url = 'http://www.google.com.cu/search?'
+ elif area == 'jm':
+ url = 'http://www.google.com.jm/search?'
+ elif area == 'ht':
+ url = 'http://www.google.ht/search?'
+ else:
+ raise AreaError('invalid name, no area found')
+ url += params
+ return url
+
+
+def get_html(url):
+ ua = UserAgent()
+ header = ua.random
+
+ try:
+ request = urllib.request.Request(url)
+ request.add_header("User-Agent", header)
+ html = urllib.request.urlopen(request).read()
+ return html
+ except urllib.error.HTTPError as e:
+ print("Error accessing:", url)
+ print(e)
+ if e.code == 503 and 'CaptchaRedirect' in e.read():
+ print("Google is requiring a Captcha. "
+ "For more information check: 'https://support.google.com/websearch/answer/86640'")
+ if e.code == 503:
+ sys.exit("503 Error: service is currently unavailable. Program will exit.")
+ return None
+ except Exception as e:
+ print("Error accessing:", url)
+ print(e)
+ return None
+
+
+def write_html_to_file(html, filename):
+ of = open(filename, "w")
+ of.write(html.encode("utf-8"))
+ # of.flush()
+ of.close()
+
+
+def get_browser_with_url(url, timeout=120, driver="firefox"):
+ """Returns an open browser with a given url."""
+
+ # choose a browser
+ if driver == "firefox":
+ browser = webdriver.Firefox()
+ elif driver == "ie":
+ browser = webdriver.Ie()
+ elif driver == "chrome":
+ browser = webdriver.Chrome()
+ else:
+ print("Driver choosen is not recognized")
+
+ # set maximum load time
+ browser.set_page_load_timeout(timeout)
+
+ # open a browser with given url
+ browser.get(url)
+
+ time.sleep(0.5)
+
+ return browser
+
+
+def get_html_from_dynamic_site(url, timeout=120,
+ driver="firefox", attempts=10):
+ """Returns html from a dynamic site, opening it in a browser."""
+
+ RV = ""
+
+ # try several attempts
+ for i in range(attempts):
+ try:
+ # load browser
+ browser = get_browser_with_url(url, timeout, driver)
+
+ # get html
+ time.sleep(2)
+ content = browser.page_source
+
+ # try again if there is no content
+ if not content:
+ browser.quit()
+ raise Exception("No content!")
+
+ # if there is content gets out
+ browser.quit()
+ RV = content
+ break
+
+ except:
+ print("\nTry ", i, " of ", attempts, "\n")
+ time.sleep(5)
+
+ return RV
+
+
+def timeit(func=None, loops=1, verbose=False):
+ if func:
+ def inner(*args, **kwargs):
+
+ sums = 0.0
+ mins = 1.7976931348623157e+308
+ maxs = 0.0
+ print('====%s Timing====' % func.__name__)
+ for i in range(0, loops):
+ t0 = time.time()
+ result = func(*args, **kwargs)
+ dt = time.time() - t0
+ mins = dt if dt < mins else mins
+ maxs = dt if dt > maxs else maxs
+ sums += dt
+ if verbose:
+ print('\t%r ran in %2.9f sec on run %s' %
+ (func.__name__, dt, i))
+ print('%r min run time was %2.9f sec' % (func.__name__, mins))
+ print('%r max run time was %2.9f sec' % (func.__name__, maxs))
+ print('%r avg run time was %2.9f sec in %s runs' %
+ (func.__name__, old_div(sums, loops), loops))
+ print('==== end ====')
+ return result
+
+ return inner
+ else:
+ def partial_inner(func):
+ return timeit(func, loops, verbose)
+ return partial_inner
+
+
+def timing(f):
+ @wraps(f)
+ def wrap(*args, **kw):
+ ts = time.time()
+ result = f(*args, **kw)
+ te = time.time()
+ print('func:%r args:[%r, %r] took: %2.4f sec' %
+ (f.__name__, args, kw, te - ts))
+ return result
+ return wrap
diff --git a/googleapi/tests/__init__.py b/googleapi/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/googleapi/tests/html_files/test_calculator.html b/googleapi/tests/html_files/test_calculator.html
new file mode 100644
index 0000000..bb51366
--- /dev/null
+++ b/googleapi/tests/html_files/test_calculator.html
@@ -0,0 +1,303 @@
+
+2+2 - Buscar con GoogleUsuario lector de pantalla, clic aquí para desact. Google Instant.
La expresión «2 + 2 = 5», o «dos más dos es igual a cinco», se utiliza a veces como un breve sofisma destinado a perpetuar una ideología política. También ...
Bienvenido a Two Plus Two, la mayor fuente de estrategia de póquer del mundo, en línea e impresa. Two Plus Two acoge a 200.000 jugadores en nuestro foro ...
Welcome to Two Plus Two, the world's largest poker strategy resource online and in print. Our online poker forums, are home to over 400,000 players. Two Plus ...
Poker discussion forum with over 250000 members and 100 different poker forums. Learn poker strategy & sharpen your poker skills for tournament poker, texas ...
{"id":"h4adMJUQ-Qp3rM:","oh":200,"ou":"https://k21.kn3.net/taringa/1/3/4/3/9/8/50/xxintixoxx/87C.gif?4665","ow":300,"pt":"Desmentido: \u0026quot;2+2\u003d5 ??? Lo demostré y gané $30\u0026quot; - Taringa!","rh":"taringa.net","ru":"http://www.taringa.net/posts/offtopic/19144727/Desmentido-2-2-5-Lo-demostre-y-gane-30.html","th":90,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcT0g1XSQXhDnz2RpyARMy8SKD8KXrH1rmfrIapA5xWLjA1sjLJrq6SRk1vs","tw":135}
hace 2 días - Barcelona tuvo ventaja de dos goles pero empató 2-2 contra Villarreal. El equipo de Luis Enrique ahora tiene 9 puntos de ventaja sobre el ...
{"os":"219KB","is":"1102\u0026nbsp;\u0026#215;\u0026nbsp;1289","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJw17Iv3fupiAakgELELCMpwgaiAEKOggCEhSLC5YL3AuSC-AK1gvlC-MKwgiJCxogjtMV9JX580X7CyVd-jev0QPnRdBYpVzgr5xpngxTnDMKSggDEhSKEpoGogasHfMfmQbzAbgH8h_1_1BRowpNZJjraTXvms7BB8CxmGp-zKIWWI9nOP-EABPm-u6DQbgsuJqtiWPaEGWn3hzgCJDCFar5hEb0e3Hg","sc":1,"isu":"taringa.net","ow":1102,"ity":"png","ct":3,"th":243,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJw17Iv3fupiAakgELELCMpwgaiAEKOggCEhSLC5YL3AuSC-AK1gvlC-MKwgiJCxogjtMV9JX580X7CyVd-jev0QPnRdBYpVzgr5xpngxTnDMKSggDEhSKEpoGogasHfMfmQbzAbgH8h_1_1BRowpNZJjraTXvms7BB8CxmGp-zKIWWI9nOP-EABPm-u6DQbgsuJqtiWPaEGWn3hzgCJDCFar5hEb0e3Hg","id":"w17Iv3fupiDbLM:","cr":3,"s":"Microsoft","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSOEggT3nNNOlt0q02hL2UNlGYNdytF6P3Ctu6p2D1nPcIqDtw7-A","md":"/search?tbs\u003dsbi:AMhZZit5iDwnVZbmmyumu8T-Su3IW4F5xDKZrUrm-mPic06CMzr9oR4u9ti3F14XeqdFiM1c0jvAjzrINnGLMnyOYmA8H_1tZCTGrzf8Hg0fd8Zr_1t8fY2m2BDz_1x46Ns1i2HnlrX5-Xu1GjTFApydDFSVfAmYoNxkgCRaxz6EWqwOVfZE94aLQIPFl2O5sMLtMkaQergYIwlnm07I50NH5A6LM_1Nw12M7inSFLkwcmVwBcYsRq59qp0QmeRPuJL8uf2Vqvp8qBDKdWlRi2WioHuQv8p2DM9HdOX18K2jAC-KyhhULfikSTUjP_1OaoQpLmBVsJbLUqHwUOU-WV2nc8U-Luql49zk7taqmzMMQ0cWninJMwdrdCp0\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":208,"cl":3,"pt":"Apple vale más que Argentina, Suecia o Colombia - Taringa!","fn":"apple-logo.png","oh":1289}
{"os":"61KB","is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1000","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJYozCV0lX8L8ajwELELCMpwgahQEKOggCEhS_1CJsI2QnACN0J3Am-CJ0IuQijCBog9W4aJ6OGjGuaR5u14LUNZKwEhiiaP_1y9JACBGXeP-DwKRwgDEhFBlwY_13AHVAT7UAdgB7AG1Bxow-qM2tfhEejc8-t5vm6eBqyyYavYKtYGhmxtBTl-8YCcewS6N5ij_17s-s-6ud6YxwDCGGZeKrd1r7BA","isu":"igdigital.com","ow":1600,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJYozCV0lX8L8ajwELELCMpwgahQEKOggCEhS_1CJsI2QnACN0J3Am-CJ0IuQijCBog9W4aJ6OGjGuaR5u14LUNZKwEhiiaP_1y9JACBGXeP-DwKRwgDEhFBlwY_13AHVAT7UAdgB7AG1Bxow-qM2tfhEejc8-t5vm6eBqyyYavYKtYGhmxtBTl-8YCcewS6N5ij_17s-s-6ud6YxwDCGGZeKrd1r7BA","id":"YozCV0lX8L8YMM:","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTU9HUgsEnmn9da3YJDEK6sWE3rqxA276V58_WRWKHm15kZUgsXhw","s":"invertir en apple","md":"/search?tbs\u003dsbi:AMhZZisa4oeEq0psgqX6WGCVI0fyVdipbegbL38kEN2WE06hiRGQgp2RYZTLY3kwpw_1TTQp8uFD5XziL_1kzxi2kCUP_12Uo2PAfnKvBrolqk_1IU7x1hfvaHjE0_1Y5DkJZwqobX34PZUSN2MB-Bs9yaV7aL0Ncm6T-wej9XxehB1Gh6ZLLxrK1O-g-5QUvtNc9ajnv41YjqYLC11Sq54dBcroC5rnFk3vqcnzbLfEnH2x4YxD5dsOilNAoVJ6CVO6A1cAEtu4pBgxDl-aoWaS-IMstHCAK70AnQV0mnMu5rUz4rW_1_1ES7p09LYaqmhknSFW1JMCmOgd0IwUv3UrAaTQIqCO7M5OoF0NQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":21,"pt":"Por qué Apple seguirá creciendo en la bolsa? | Inversor Global","fn":"Apple-Think_Different-Apple-Logo.jpg","oh":1000}
{"os":"76KB","cb":3,"is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1080","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJzXLuYWTt7HoajwELELCMpwgahQEKOggCEhTACNkJvwibCLkIvgiyDNwJ3QnOCRogUzzlDIPA0IAfaobeMdajgVAvey0omPveaAALWjMwqv8KRwgDEhG1Bz5B1QHZAdgB6gFG4wHoARowiD5lQ_15AeanavUL4f4Jo4Ymc6oswWJcaQl1BJKTMgOBCZacE0zW-9MBMLd2Ab_1NrDCEoOf6YmfZ3rQ","isu":"boingboing.net","ow":1920,"ity":"jpg","ct":9,"th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJzXLuYWTt7HoajwELELCMpwgahQEKOggCEhTACNkJvwibCLkIvgiyDNwJ3QnOCRogUzzlDIPA0IAfaobeMdajgVAvey0omPveaAALWjMwqv8KRwgDEhG1Bz5B1QHZAdgB6gFG4wHoARowiD5lQ_15AeanavUL4f4Jo4Ymc6oswWJcaQl1BJKTMgOBCZacE0zW-9MBMLd2Ab_1NrDCEoOf6YmfZ3rQ","id":"zXLuYWTt7HqqhM:","cr":21,"s":"Apple adds privacy-protecting MAC spoofing (when Aaron Swartz did it, it was evidence of criminality) - Boing Boing","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcT7u4w1SOObbA4nQMSeyyH2YtOQu-BL2Hxa1zuIxGnMuP0RsxJj","md":"/search?tbs\u003dsbi:AMhZZis9Xne2B_1EszcOjTe1d_1ILR_1pezHsSkr_1vMrE0mtAr9w2u8Gs4N0z-8QEpjKSUdTRm3VyyVrpvTB0-RORwcSv0HkK8vBdtkVAmD_1oSf0E0OiNY4lF8hHWRbkwI5phMUXpj0AEm18UAo2yxvyw7g0kg8LbA7ZJhGoAmiYmahicSSQm3Qj-ZlpiXTQ1MnqK6Un999dT1TruABTcor36rdQf-n7p_1KjYrza90QFrh28cL7hcZQkwqiTpBACcBqgTdtZY9Lk8APh1J2I71LNca5HcqyCvCYx_19NYXFG5rxwpXi4FKaDvAVwDoIYKAvEreAFXvsrV4EhvvZWX3mZCVvrkQPUQnQKMA\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":21,"pt":"p1.jpg","fn":"p1.jpg","oh":1080}
{"os":"237KB","cb":21,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJ2hqzA6vSOeoajwELELCMpwgahQEKOggCEhTACLIMmwi-CL8IhAjcCdkJ3QnCCRog8LgaLiLqFWqejKRaPBO-glAvpa6BfaenvSG6BFX9qb4KRwgDEhFB1QG1B9QBPz6WBpcG3AHYARowcT42offgjknxvICvAYFzYWkcHFwYxJdKX_1QLTq9OuSUWwYqi7QB_10ExKs9nh2V6-DCHC4Dk-xgB-7w","isu":"es.finance.yahoo.com","ow":1600,"ity":"jpg","ct":21,"th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJ2hqzA6vSOeoajwELELCMpwgahQEKOggCEhTACLIMmwi-CL8IhAjcCdkJ3QnCCRog8LgaLiLqFWqejKRaPBO-glAvpa6BfaenvSG6BFX9qb4KRwgDEhFB1QG1B9QBPz6WBpcG3AHYARowcT42offgjknxvICvAYFzYWkcHFwYxJdKX_1QLTq9OuSUWwYqi7QB_10ExKs9nh2V6-DCHC4Dk-xgB-7w","id":"2hqzA6vSOer6IM:","cr":21,"s":"Apple sigue siendo una máquina de crear dinero. Aunque su beneficio ha caído un 8,6% en el cuarto trimestre de su pasado año fiscal, la cifra neta de ...","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQcazC-BK_MmNvroi4hFPJvBcNdl705-pTd9an_8TMXX6Om6zmQ4Q","md":"/search?tbs\u003dsbi:AMhZZisRnbxKKB1R9yUp0iIVM6BYzuhkBjgZMy4QxMhzxudZ5CoK3E19M4jsE5Tp0LTLkJaBX54ywvPABLWR19ch0jv5i-xlrSx53Eo7zUPpGsBz2f-RMR6lfFxLunb4Pj1g0OqBwhuMhmtGB5R6SAPs0DBrlAbYnmGplzkxl70bJlg1deIIEBHxGhVaGNI3i_1exMFb3DRIl5U1SNX19czt3Acgtcs_19ZNTNUzx7IojBEhg7zWs-AGNzIjo12rg6GQ4Mj3zgrdsTY14QShW4Sf5AN3gGZWdbigfjzSWc6M-Y8s3aw9h8dyh3MmapEeazEMAm9AnMPEfY_19a9r3UK1Syjf5REgVPLcw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"cl":21,"pt":"La televisión de Apple, ¿retrasada hasta 2015? - Tecnología y redes","fn":"posttvapple.jpg","oh":1200}
{"os":"26KB","cb":21,"is":"1120\u0026nbsp;\u0026#215;\u0026nbsp;630","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJesPaj9x4PD8ajwELELCMpwgahQEKOggCEhTACJsIsgy_1CNkJhAjPCcIJ3Qm-CBogtIUaX4I4jz1pAAffMR5p5lAv8ZwctQaIZiL3k3swvCQKRwgDEhHVAUE_11AGWBrUH2AFA1wGsGRoweADwG_1bYhs-q94zvo6VrKeIffLdRmIRh3_1ROJiTEcNRuZYsv4zS29ChqU046jbq9DCEql_1Dy3WhuIA","isu":"originalgreen.org","ow":1120,"ity":"jpeg","ct":21,"th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJesPaj9x4PD8ajwELELCMpwgahQEKOggCEhTACJsIsgy_1CNkJhAjPCcIJ3Qm-CBogtIUaX4I4jz1pAAffMR5p5lAv8ZwctQaIZiL3k3swvCQKRwgDEhHVAUE_11AGWBrUH2AFA1wGsGRoweADwG_1bYhs-q94zvo6VrKeIffLdRmIRh3_1ROJiTEcNRuZYsv4zS29ChqU046jbq9DCEql_1Dy3WhuIA","id":"esPaj9x4PD9BCM:","cr":21,"s":"Apple logo","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSE-7ZQbwUiwd9GX0TSBtdalAXKdhU-UytKtWdkJcKyBEENn1aa","md":"/search?tbs\u003dsbi:AMhZZitKt_19VNiRIPX11E3Q5rEN0C7JzBsErM22HSXcO-wldmmcQy8lVMEUbyvWXDGvB2c9ltpEbAy1RsQX8D1TEJLv-stM7W4lXCv2dQpOr-Gcr6Cruz3gwyfRIFdU3fW8LuVOkT7pcr9HNnY549onvQ8nPsYrl7YsPPAgDGMbvxQmXcs-v9poZlQ51o-72wlk-o2nJZL4eWL-tswNIOD9lfdYSIb3k9Ghp_1qM8gDPRyqzaiwefrUDOTF2W0SEwvT_1_1x2DdAF2RYY-fZVoGDAu8ybULJkOSE9hx9ZVgGAWWWMgpzSdPPS1Wzd1V8TJ1VpNt_1FcTHXStBVZeNyhz7sBcCFACqu---A\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":21,"pt":"Skeuomorphism - How Steve Jobs Hit What Walter Gropius Missed ...","fn":"apple-logo_med_hr.jpeg","oh":630}
{"os":"44KB","is":"874\u0026nbsp;\u0026#215;\u0026nbsp;1024","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ6GOKElj0paoakgELELCMpwgaiAEKOggCEhSSC_1sI1wvWC5QLtgiGCNgIxRTEFBog_1r3Wj-DiW8eLCnEeyjjrFQjkzL4h6q3UW-3AewqsM90KSggDEhT_1BYoStAG4B6UHuQeQEq0H8xL-BRowU0k8Fu32U4cg_1ZpJr1ZQKGWESnG-nFTRHlJYMY-_1XPGa4Lgy4tqWOrHGsZHdzeTbDCHcS8XXXkX9rg","sc":1,"isu":"brainscape.com","ow":874,"ity":"jpg","th":243,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ6GOKElj0paoakgELELCMpwgaiAEKOggCEhSSC_1sI1wvWC5QLtgiGCNgIxRTEFBog_1r3Wj-DiW8eLCnEeyjjrFQjkzL4h6q3UW-3AewqsM90KSggDEhT_1BYoStAG4B6UHuQeQEq0H8xL-BRowU0k8Fu32U4cg_1ZpJr1ZQKGWESnG-nFTRHlJYMY-_1XPGa4Lgy4tqWOrHGsZHdzeTbDCHcS8XXXkX9rg","id":"6GOKElj0paqeLM:","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTwzhg6fyGrCkvve8X4dl2T35cj9iXHWmeHH9IyIR-Atj3YNQAm","s":"Over the past few years, Apple haters have delighted in the fact that the company has not released a major new product line since the iPad.","md":"/search?tbs\u003dsbi:AMhZZiuoGIzl9PM5FziW3PLhFAUYtwa-X5K3TMrsXepUOelymS3XKfizW6DC4_1iu3HTzcrNzgPBq-6dt6j6pv7KTVlQOCVYzmS3fpd1CZOhSe_1iaIk28ibmSDE9u7ZIfaIoYpcu7XAGAvw7GCId-caqi0sqf6i-hYqqMZFoXPDO1KyhfHD0v1yFI8m5RFsMFj0VDrzlisovAqhBFc7auM1PsTqvZdZ8cRe0M4giKoBy9GEfLQzsrYxwPRP9keHHQwDEGE80oy9KTjnLcebmqySIZ14T7VQF_1w_137OvIX1UmrrtjsUTWcaGJfUw9qIr1xBNrGb8lATFw_1sBckPZHE48cEH8bZiY0lWAQ4PegN1MD2X_1t78Gip0X8\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":207,"pt":"Apple is now making 20-year bets. It has to. | Brainscape Blog","fn":"Apple-logo.jpg","oh":1024}
{"os":"85KB","is":"2000\u0026nbsp;\u0026#215;\u0026nbsp;2200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJQU50BCxNTMwakgELELCMpwgaiAEKOggCEhTZCIkJqwysDKoMmAjbDOEMjAmUCxogm-p9Vjf-LCuXuW23mALaqrm6rPvR8MyxZKvuQ6xY8BYKSggDEhS-AuIIxgPLCOEIgAm9ApoKsx2hCRowU-PFLIyYA6h8zQtVrRq4EKUK19q0YtDvTgEs0uirxoJnYJTtM884qKciig3h27awDCFSrHmHmX1JAQ","sc":1,"isu":"en.wikipedia.org","ow":2000,"ity":"png","th":235,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJQU50BCxNTMwakgELELCMpwgaiAEKOggCEhTZCIkJqwysDKoMmAjbDOEMjAmUCxogm-p9Vjf-LCuXuW23mALaqrm6rPvR8MyxZKvuQ6xY8BYKSggDEhS-AuIIxgPLCOEIgAm9ApoKsx2hCRowU-PFLIyYA6h8zQtVrRq4EKUK19q0YtDvTgEs0uirxoJnYJTtM884qKciig3h27awDCFSrHmHmX1JAQ","id":"QU50BCxNTMxUyM:","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTiCXESLdsaCXdsAkQdMtfSmI7tYxIISo8jID0gaLGEzc63numUTQ","s":"The Apple logo introduced May 17, 1976, created by Rob Janoff, with the rainbow scheme until August 26, 1999.","md":"/search?tbs\u003dsbi:AMhZZiv6F3SLqR8ywJAY6M24pgow9kZIMK_1Pg404Ca8l47mJ67O275uzt18ADiWN1tnYW4FBXFo89apswHf4frG8oNupbIC2lB97eDfYf7SbS3toh3UDs0bxT2Ye8_1Bz7wurc8JxWMx2a4VidTTes81gHn0wfaWImAET6r--1yUQTCxt1ph6V_1wHJk1R0brugTy0O6VAKD-yFDRde9e5A_1bZpUw3b_1DXt4m5mDaHu14IqKtlCgaFlVQL3yiyCEKU8Xsb4Jw8rhIt8p7zHjG8z82Pc8BC68KBnwrFMJRf65VnyZDdXr84cqA_1lAWQQW9UIzaLF6WNTf_1IYVBwPw8_1-9-8mxkCFE9_1Qxzqeb7ZIGInY3hGA7VW1pY\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":214,"pt":"History of Apple Inc. - Wikipedia, the free encyclopedia","fn":"2000px-Apple_Computer_Logo_rainbow.svg.png","oh":2200}
{"os":"1.7MB","cb":12,"is":"3172\u0026nbsp;\u0026#215;\u0026nbsp;2709","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJMxd6eMffENcakgELELCMpwgaiAEKOggCEhSJCYUN4wyrFaQN3RWSCZMJ5A3hDBogjpR8ulL8IUhh_1l7u_1O-tmhHQnH3JHiOhdISU1Jp-i9AKSggDEhTRBrQd0wbSBscSpwKiAdAGsx3ZBhowiKOMVMZ1pc0fc07_1vVlw6hYUfgsFGfgmf9PeIfQdA6j1UvnP0whYbSFXHURz1yLmDCGsr8ZInAlJNQ","sc":1,"isu":"dreamatico.com","ow":3172,"ity":"jpg","ct":9,"th":207,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJMxd6eMffENcakgELELCMpwgaiAEKOggCEhSJCYUN4wyrFaQN3RWSCZMJ5A3hDBogjpR8ulL8IUhh_1l7u_1O-tmhHQnH3JHiOhdISU1Jp-i9AKSggDEhTRBrQd0wbSBscSpwKiAdAGsx3ZBhowiKOMVMZ1pc0fc07_1vVlw6hYUfgsFGfgmf9PeIfQdA6j1UvnP0whYbSFXHURz1yLmDCGsr8ZInAlJNQ","id":"Mxd6eMffENefZM:","cr":18,"s":"Apple","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTrDnssC0joC9WV0Wi4xRGDot031sroDA0rNcSIkdtO9XF8BlEGNw","md":"/search?tbs\u003dsbi:AMhZZisjwCZMvuXN3342QrKhZqQYlzo-eUOsLlLGTu6e_1klmWtR8-lvtST_1QE5K0PzBCHXyLWeFdPSE_1TlkfTt_1Dd4RZUUOoYcXR4Kng57eHHf1n1tA-LCjEP-BCg-dktOfqANBNnvyTLpc4ADNXhZ3tqqPTZVZ4devKQGKS4rsQ_13wlxHAJsyk3Cl7JFqhTIzRVUXMHZVxYCAjdxllfbZninnnMwkEX_1ygBC6yz7QDTNULLGou865PgMcQcnwci3gI6mMERTHt7Ols-u71msj6axaSjOSUl-ISp-R51a5aBaEQBPu2ladtdByNphHM7MxPVMH282gohs3HsfAZdiA0dn2FAdNY1t4xp_1CbCnZ8_1BNdoYTLUpuI\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":243,"cl":21,"pt":"The meaning of the dream in which you saw","fn":"apple-7.jpg","oh":2709}
{"os":"10KB","cb":6,"is":"200\u0026nbsp;\u0026#215;\u0026nbsp;200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJ1tKj_1eKuJTwakQELELCMpwgahwEKOggCEhTDCN4IvgjoCq4MvxTjCukKiwuICxogYlsa8MX3u0-gbohLLH5UvLXGPge0sq3VmPLJvc0MvlEKSQgDEhPbAdkBPpoGtQfjAegBlwGZBtwBGjAE9DZM6Fs-8UIpe8nGEnDh6Q6m0dUaWNL7mI0wX80ggoKBO6368EXagHpe7WeMulkMIUokuO2yOsAL","isu":"forbes.com","ow":200,"ity":"jpg","th":160,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJ1tKj_1eKuJTwakQELELCMpwgahwEKOggCEhTDCN4IvgjoCq4MvxTjCukKiwuICxogYlsa8MX3u0-gbohLLH5UvLXGPge0sq3VmPLJvc0MvlEKSQgDEhPbAdkBPpoGtQfjAegBlwGZBtwBGjAE9DZM6Fs-8UIpe8nGEnDh6Q6m0dUaWNL7mI0wX80ggoKBO6368EXagHpe7WeMulkMIUokuO2yOsAL","id":"1tKj_eKuJTyzvM:","cr":15,"s":"Apple","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQ4etNUS3dn_iHn60JdNlwskfYPwp74C2dNaw8DnWsS_nGldiPP","md":"/search?tbs\u003dsbi:AMhZZittS8T581dlyPzce6uNjPaFIDREv1PhCmld9wRq4ZqHxlq4RuQHIXi8rLAJn3W7dO2N-DeZqW9CToSuu-WDj4AWh5SiuiZ1VxO4H1iZ_1eWRgeo_12zUJ9gD2IGYe4t_1Ybr1R4r1xyciLgCcsR8UyedCvpdLp99KRtoE137Ptuno3JIrL5e1JGSMoExJXvca0B7Ernh2xXHjiJ57ZQwGC9r10Ec61le8mvtotJ59dA1Cqg6jqkyUjymQxOIqh9UMJbGvSMAWOgvMZ144UapakkV5LR-VNXElhV8L0RqtllSLO0a0vyH19kdvYr7jLCAnIzn08UP9-sFxpE74kSMxKLnudQmpwgwknZ6ZPKxr9dWprsmUo6p4\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":160,"cl":9,"pt":"Apple on the Forbes World\u0026#39;s Most Valuable Brands List","fn":"apple_200x200.jpg","oh":200}
{"os":"50KB","cb":21,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJPVnenApa-xkajwELELCMpwgahQEKOggCEhTACLIMmwiECMIJzwndCb8IvgixDBogZzcELoJYE1IzCX42LOyj5pIv3Pk3tvHfEaI6hjNf-FsKRwgDEhFB1QE_11AG1B5cGQOwBlgbYARowMwLao_1dAKuWZvWJvvxFz7GkmV7ZRmBxkrWsNTo_13gOJuxaYi4zRjUsKyLplRjrrtDCGYXjHFCISQ-A","isu":"sage.onswipe.com","ow":1600,"ity":"jpg","ct":21,"th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJPVnenApa-xkajwELELCMpwgahQEKOggCEhTACLIMmwiECMIJzwndCb8IvgixDBogZzcELoJYE1IzCX42LOyj5pIv3Pk3tvHfEaI6hjNf-FsKRwgDEhFB1QE_11AG1B5cGQOwBlgbYARowMwLao_1dAKuWZvWJvvxFz7GkmV7ZRmBxkrWsNTo_13gOJuxaYi4zRjUsKyLplRjrrtDCGYXjHFCISQ-A","id":"PVnenApa-xkThM:","cr":21,"s":"Yes it owns iAd, but it\u0026#39;s very controlled and only there to sell more hardware. Apple doesn\u0026#39;t have to care about advertising on iOS and it doesn\u0026#39;t.","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRNfKZyxdsaHHmBj7miV5sKwHXLzSLmLt1Zbd5Bvc1qXLNmFHTf","md":"/search?tbs\u003dsbi:AMhZZis0s2E_1EWZBUCYAG7fn6tfsGdquo2UbM_1VWydY8z0g4C75jS70azVEt-HT5q-Il3CQLp8x5kDSzeD8GqpyuduIFaNlduj5LY72wQgdCxMY61avT7WwGmP3BFixmQ6tVi7QNPwjdVVj7U-hLOKtrGwfRqdETkxvnfEg1sXylrvovRioF5XDkttGrimd4K1wo-IQptV3sHuLrbpqTNW4TwD0OEsvzl6KOLBvvfmOgAeoy9XpGUJg0OhIRRDbldB5JzuF-BXB_1rxGZDCFt9fZe0E0_1NgYk_1w46hjSz7jM_1cDWSi3Kb66fXumSONxuA-zlN6ftx8Q5FIhmkL0uhcsCBPcoC5tbjVg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"cl":21,"pt":"Understanding Apple\u0026#39;s anti-advertising moves on mobile - Onswipe ...","fn":"simple-apple-logo-background-normal.jpg","oh":1200}
{"os":"370KB","cb":9,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1613","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJxA0yo66Zq3IakgELELCMpwgaiAEKOggCEhSkDZMJ4wyFDYkJ4gzdDpIJ3RWYCBogCP6Sut9NIXSx2p1i-sclXRvmQ3F-tRiSZlXhdKXIIdcKSggDEhTRBrQd0wbHEqcC0AahAsgS6QazHRowE6N2ts_1qhszXyD4zYVXLHaAVfp21gWgi_1-gITX9igDhYUAiQapNA4gZAtr0n7DDuDCGsr8ZInAlJNQ","sc":1,"isu":"dreamatico.com","ow":1600,"ity":"jpg","ct":18,"th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJxA0yo66Zq3IakgELELCMpwgaiAEKOggCEhSkDZMJ4wyFDYkJ4gzdDpIJ3RWYCBogCP6Sut9NIXSx2p1i-sclXRvmQ3F-tRiSZlXhdKXIIdcKSggDEhTRBrQd0wbHEqcC0AahAsgS6QazHRowE6N2ts_1qhszXyD4zYVXLHaAVfp21gWgi_1-gITX9igDhYUAiQapNA4gZAtr0n7DDuDCGsr8ZInAlJNQ","id":"xA0yo66Zq3LyRM:","cr":15,"s":"Apple","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRSDr5MwSpmZPzbpxQLX91KySEWe8ilY7rf7Zt08Fa_owoxacua","md":"/search?tbs\u003dsbi:AMhZZisp2MGFPh3RdKtGKYt9p4tn-7RAyvadGz-yyhRotqWzhHCZ-8xARdrT7oPArbrIoFhXuOh-veSM8JApcOi5dDvLgkIu4ZSHDh5M7oUY11HSksN-xhlRnNuRuz79j0Px-tSidcJOTD3wMSwoas8F5Lt42uAKyX7c0wTPxPdtzscrtxRP1p7idWJSoOTYxRcctk9DgX92ZXRMTo8Nskud2E62IypJzq9YeW61BhSBp0JFy-egvwObvVRjtG_1UE_1Upw5aMObQTQ2ynyKLbG5xeC81TzKv6h2xt4cehndbPuBA1nrjjTfpyiGFgMYsf0X8uOVVSPSE41Bq3s7GtlxoyoukrwbH2KAl5dIprv1HX0etaZ0mdGBM\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":224,"cl":12,"pt":"The meaning of the dream in which you saw","fn":"apple-6.jpg","oh":1613}
{"os":"62KB","cb":9,"is":"2000\u0026nbsp;\u0026#215;\u0026nbsp;2000","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ7083434IN34akgELELCMpwgaiAEKOggCEhSUC4cI2Qj8CNgLhgiQCZILiAjYCBogRgSRhNl3dYYSjwYmvEf80YtrErcfWIOOSWj5aRNJE1cKSggDEhS1B5oG-hLZAZcB_1wWlB7EBtAHjARowjrdTvadAeHHa_1IdJ3YB96fFdbnaUkRhmT00I_1I-X9igs4rjFMxAFWQZ--kxkAPKFDCFJO7iBDjaOFw","sc":1,"isu":"e-marketingassociates.com","ow":2000,"ity":"png","ct":9,"th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ7083434IN34akgELELCMpwgaiAEKOggCEhSUC4cI2Qj8CNgLhgiQCZILiAjYCBogRgSRhNl3dYYSjwYmvEf80YtrErcfWIOOSWj5aRNJE1cKSggDEhS1B5oG-hLZAZcB_1wWlB7EBtAHjARowjrdTvadAeHHa_1IdJ3YB96fFdbnaUkRhmT00I_1I-X9igs4rjFMxAFWQZ--kxkAPKFDCFJO7iBDjaOFw","id":"7083434IN36Q2M:","cr":15,"s":"Apple isn\u0026#39;t the first company to incorporate NFC into their phones, companies have been doing it since 2006. The problem has always been that their ...","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcRP07KW5w21Sf1IL_cC0Uu3xHwhHXKlK3_KIDt3IH73THnSauVm","md":"/search?tbs\u003dsbi:AMhZZisy1URXD7t9CO0KFdsBT5bSZPIgMwZ7Qf5My_1LnWxRmu1Mt-WIPTQoSB7uUU9mWpLeahd5VHj6h94EMUvVlnTpM4nb65j4YJQIFsFycIfVBN63dVwE1ZLY8Dx7ZHuYRInJDAmeFgMgrurKLj61RVDNg3FMu3u-fTyu1I955A1D32CtASLiE4LqJqJAR7oUCx3ATD_12YhSH2zEpZ9eVqmmNw3dbY24tQPydpnPJfnD-kHJ9P_15CV_1eufz0VXgqvYdxVo8GKsB2Z1H0XgkZ8obMuBnMhGJJEpQ0Ro3erUM1Fn1AA4SQIC27VuPh1t8RsO6shNT_18bWWBTOrNOETIBz-fwL5e68HXriNlQRPdLQe1IPDxnO9k\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":15,"pt":"How will Apple Pay impact your hotel? - E-Marketing Associates ...","fn":"Apple_gray_logo.png","oh":2000}
{"os":"13KB","cb":9,"is":"400\u0026nbsp;\u0026#215;\u0026nbsp;400","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJklQ5J8IjsEoakQELELCMpwgahwEKOggCEhTfDNwMqwzZCJQL2wzHFfEKjQmGCxogSB5OOS_1w_1pyvllSFL-luquyRMKfqCpOZiuOdYI0Xo3UKSQgDEhPxBs4SvQG6As8SwAO8AaMKHbwCGjD4HCM9gPSH_1ut0eNRpAYIowYMN7D6NhmToXcglFHD2O80fUe9d5gUht3eGk12AA3EMISQJeb_10BVlQ","sc":1,"isu":"twitter.com","ow":400,"ity":"jpg","ct":6,"th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJklQ5J8IjsEoakQELELCMpwgahwEKOggCEhTfDNwMqwzZCJQL2wzHFfEKjQmGCxogSB5OOS_1w_1pyvllSFL-luquyRMKfqCpOZiuOdYI0Xo3UKSQgDEhPxBs4SvQG6As8SwAO8AaMKHbwCGjD4HCM9gPSH_1ut0eNRpAYIowYMN7D6NhmToXcglFHD2O80fUe9d5gUht3eGk12AA3EMISQJeb_10BVlQ","id":"klQ5J8IjsErYGM:","cr":15,"s":"","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcRT5cGGrb2f77fPbFF2gxZH4EOeoL-GzqsP_jl2uTrO1nhSgIFl","md":"/search?tbs\u003dsbi:AMhZZiuNH1jwaLV-Y1GwNgBIRktaPYhcpJVrVr7QKhZZ5iXw6B-khfOyHOnrhvAsz9CpwPQEP5ccI8E5kR_1-fzlestoPcirOU3I8Kfb1JN1horHYqSE6IVX2Khwg6Dqvnl114dbV4cwIG5ULiJsNIwwYCk0A5zcrm2AmzAQsv1id-NQGqWTTXTs73QE5Q3zQcU7vjia_1wteimoQQnd5-25zXHmUQuQ6BQVN1vMhZSA6POkU45_1rZYqBE7S9DL6yMufRzpNC7TpFUvq7Ig7nBai0VdlTaPDQlvYj-Q3a5Ua9EFr21eXzto2mkdbPaLTVnRQfVLxO1Rsz13yTPXg30pZSTG_1ERB0V1-2_1_1strfifCoF8mJySnLrEw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":12,"pt":"Noticias de Apple (@NoticiasDeApple) | Twitter","fn":"apple.jpg","oh":400}
{"os":"653KB","is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1080","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSogEJcPRrDYIJiZAajQELELCMpwgagwEKOggCEhTDCZsPtAy9D68Vmg-4D5wVtQy8Dxog3wafdvcuoliL-yoUtAmn9wMi3mNQG-FArpDUjc7JR94KRQgDEg8kOSXIAdYBzAEjyQHHASkaMBPPruT4cFYd3vo201pWV0NZiElRJq5Kelt1eu21fn63AY_1q7-DXuSSDspMrElGVcQwhPVEa617eQ0Q","isu":"hdwallpapers.in","ow":1920,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESogEJcPRrDYIJiZAajQELELCMpwgagwEKOggCEhTDCZsPtAy9D68Vmg-4D5wVtQy8Dxog3wafdvcuoliL-yoUtAmn9wMi3mNQG-FArpDUjc7JR94KRQgDEg8kOSXIAdYBzAEjyQHHASkaMBPPruT4cFYd3vo201pWV0NZiElRJq5Kelt1eu21fn63AY_1q7-DXuSSDspMrElGVcQwhPVEa617eQ0Q","id":"cPRrDYIJiZARYM:","cr":18,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQyxIqb1oHLR8ZaYRjS51M78NhpuLToCXwKkrdY4zjzGpntGdAx9A","s":"Colorful HD Apple","md":"/search?tbs\u003dsbi:AMhZZitmkCiNfvKrNRJphSJJ5DIUke0IVuinBB3W51gnS49OsgBaiM47j-QL2NXPqfdHsVI_1x1PvXnCHQFIEsYrEh9thZ0hK5EN7uelgu534akeirmXnVU0t9hYktz3Wd_1byr9ua-R9z5rvHu-1-5jC3PEAB_1DXv9SE_1EaisiFa3-hwY1jk_1uNydjtdnGRrx06PJZZ7QOcM0-yXvC8VKwghPMQBNb3q1AkRjeX5lompQkAUMyh0r3GryXqJCH0_1Lz5qaMqko2Jp-IXeY9otkP5pymIN4tpfK6kB1c-zT9MXcgN32iIN60IM-UTJf15kLUWI22gL4amKcKUmallQsau70u_1CBj9zlHw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":9,"pt":"Apple HD Wallpapers | Apple Logo Desktop Backgrounds - Page 1","fn":"colorful_hd_apple-1920x1080.jpg","oh":1080}
{"os":"143KB","cb":21,"is":"625\u0026nbsp;\u0026#215;\u0026nbsp;386","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJLVwAvs08GfgakQELELCMpwgahwEKOggCEhTpCrgJhhq5CK4Mtwy5FIQIugi1CBog3Xkwm7qd2iK9yw7tNx0lw1-IVmkrHnsv-dUsFSUWHRoKSQgDEhPbAe0F2QGXAewF3AE4hRiXEtoBGjBdUxxSe9NTY8Thljx2ETrqEVkUEUySoNd854yFZ8eQoVqlag2lOt-LzYKEswCOJnUMIcTYXdya_11Wv","isu":"bgr.com","ow":625,"ity":"jpg","ct":9,"th":176,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJLVwAvs08GfgakQELELCMpwgahwEKOggCEhTpCrgJhhq5CK4Mtwy5FIQIugi1CBog3Xkwm7qd2iK9yw7tNx0lw1-IVmkrHnsv-dUsFSUWHRoKSQgDEhPbAe0F2QGXAewF3AE4hRiXEtoBGjBdUxxSe9NTY8Thljx2ETrqEVkUEUySoNd854yFZ8eQoVqlag2lOt-LzYKEswCOJnUMIcTYXdya_11Wv","id":"LVwAvs08Gfj4JM:","cr":21,"s":"Why Working At Apple Is Bad","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcT3AzE6sSsqg0xmU0emxAeOFVIXXDOQ-3po061X_0Zj1MJAgLuEDQ","md":"/search?tbs\u003dsbi:AMhZZitIeCzw_17nUdYYr7XqXXOqU_1eQf3DKXh83Icq4AoU-_1dOvoUwyKVvTY08ZXQmP3FAPLlzrKRd-4so0dPG-RD8JFJq0C7o9n9BgmsTgQtuz1fosKWxB7F4EK81f-JBjRZH6mKgGss01knaqSxhWw_1UxGOF55cMIbwk8Td5oqcA2D_13peExs9mwKj7BwX9u3NUwuEvUYB9Pysvl7cdbHI7Kk0Tcma1Kz0XCQhlKwlvzMR7i38J9m6HSeXMwE75w4PPdPNUQ3i7GQ6f31o_1YgRi8lRnzJTx3fuYGTiikriSdypi4A7bPS3X8qNKI2-hMb705cP8lPJyCqgleDpnBXxu_1aQUoH125OqauvTa3vMw8ZFQk3eIec\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":286,"cl":15,"pt":"Why working at Apple is bad: High stress, inflexible hours | BGR","fn":"apple-sign-487.jpg","oh":386}
{"os":"1.2MB","is":"2560\u0026nbsp;\u0026#215;\u0026nbsp;1600","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSogEJL6s2v6bjBUoajQELELCMpwgagwEKOggCEhTDCbQMvQmdDMAJnAy1D7UMvQ-ZDxognwe5KfcWfnJYRIZQZHtaiaD84dNQtwS4gbi6WGDCv8oKRQgDEg8kOcwBJSPIAdYBxwHJAUUaMIN8nWb64C3h3gIEr95ze63kHyCROhoUOhuafk3fPGEgE2rpMvo7joR5b1opapSUeQwh3vaIw2N-9CU","isu":"youthedesigner.com","ow":2560,"ity":"png","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESogEJL6s2v6bjBUoajQELELCMpwgagwEKOggCEhTDCbQMvQmdDMAJnAy1D7UMvQ-ZDxognwe5KfcWfnJYRIZQZHtaiaD84dNQtwS4gbi6WGDCv8oKRQgDEg8kOcwBJSPIAdYBxwHJAUUaMIN8nWb64C3h3gIEr95ze63kHyCROhoUOhuafk3fPGEgE2rpMvo7joR5b1opapSUeQwh3vaIw2N-9CU","id":"L6s2v6bjBUq7vM:","cr":6,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcS4T1UCdaAdNNhF5H7J3wZUHSnXMuU3G6MiAR-LF0LPiA-H-iLKCg","s":"apple-wp-5","md":"/search?tbs\u003dsbi:AMhZZivn3CzBY8Zo2CYqX9QHnbDgw-HmNwZAEpOm5c3UlXw_1yZZZ_1vinjO8B5xLv8zpEZq0pG0FGDJOrSU3TO-9rSR3Fd6BFgwtwRaui2DDoHEUYBPz6QCQHKGe7jbFet5tgEbu2vpl4U0ETW16LeUYwQroe3WHCdQjRkhIRx28PM-8fnLIKoSOSa7K88n2jUYIR5gB_1_1XF3UEg9_10u50gslyL8C-j0ky3LjQ67FZm7BpkXf5BH0ATn39ZSeNhHgzkwzcRtA1zurdG6_10toLnVHuhemhTGc7oK0LLeTnJLcZURpvHCzpkjh6YZt-q_1kI6l47tX75mcRpBnyhiPvLeoFCSKF8qZImzw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":6,"pt":"45 Free High Quality Apple Wallpapers","fn":"apple-wp-5.png","oh":1600}
{"os":"1003KB","is":"2560\u0026nbsp;\u0026#215;\u0026nbsp;1600","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJdSSeBcLQ-zIakAELELCMpwgahgEKOggCEhSdDJwMtAzACbUMwwm9CZ8V1CGZDxog3f58aD-y62AcR4Hxg3sxUmjRalhQbeH_15IGolBlsK2oKSAgDEhIjzAHNAcQBygGpA8sB1gHJATkaMBOKwFP_1WF_1Ha13HImuuxLceUGn2CRVDMoIbw0vPM3HgAgfHiSc7o4wNyl36POZr0AwhEefsu_185Ztg","sc":1,"isu":"taringa.net","ow":2560,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJdSSeBcLQ-zIakAELELCMpwgahgEKOggCEhSdDJwMtAzACbUMwwm9CZ8V1CGZDxog3f58aD-y62AcR4Hxg3sxUmjRalhQbeH_15IGolBlsK2oKSAgDEhIjzAHNAcQBygGpA8sB1gHJATkaMBOKwFP_1WF_1Ha13HImuuxLceUGn2CRVDMoIbw0vPM3HgAgfHiSc7o4wNyl36POZr0AwhEefsu_185Ztg","id":"dSSeBcLQ-zLTwM:","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcS8jmyeg9f2mlukQrilUdnUDI8-EILC7Ga5dC458jsqylOe15w4","s":"Mundo","md":"/search?tbs\u003dsbi:AMhZZiu5kgXbJU_1ZAKUbddsNcYJwAfKvsLX7R3WjJChp02Tfy36gKPRV_1I54vKrx1ArhPUKO8esVLG6OUeBxuHBNsPFqrYEWbxqxFX1T3ZeBvDZG_1ZeNeLhhFJ8u3YaR8aSsYbnxU16uo2-WOzbtojlWScJxQOx2g4nOoleJo3I7bSNOIxk8I-oVrf8VgGMzyyrPeHQc4orgrhIm1KsiVV8BNzKEq2QXKtop2p7p1iiaxDN17kRu7OLl8c0D83SGQNjOZ5Vnrh4iE5AAPGub5DO0WIHmMNS2npT2wXAGf3iXjGyofF2whmowtvuexjTSeGvIxhsyrOcQ6slVWNf1LijjzeZLV270nJtkp3Pn0I1jt95fDhRl7OE\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"pt":"Apple, de nuevo, la marca más valiosa del mundo - Taringa!","fn":"apple-blue-apple.jpg","oh":1600}
{"os":"41KB","cb":18,"is":"620\u0026nbsp;\u0026#215;\u0026nbsp;385","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSrwIJkpF9BH9d-EcamgILELCMpwgakAIKOggCEhTZC-EMhwiUC9kI2wzXDKkM4wzmDBog8_182MTf49AzXoT1BXC4qdbNWIyNGrbLmAe3uTJm7mwkKSggDEhS_1AvIG0RKaCtASmwrxBs8SvgL2Bhow6a6FH4xQqKQt4-BEv3EzL0ob79ioGNNnyEw2P0_1fIoJA2aAJBcyonyGWSxvh2fKzCjoIAhIU2QvhDIcIlAvZCNsM1wypDOMM5gwaIPP_1NjE3-PQM16E9QVwuKnWzViMjRq2y5gHt7kyZu5sJCkoIAxIUvwLyBtESmgrQEpsK8QbPEr4C9gYaMOmuhR-MUKikLePgRL9xMy9KG-_1YqBjTZ8hMNj9P3yKCQNmgCQXMqJ8hlksb4dnyswwhln_1PP90REXo","sc":1,"isu":"cnnexpansion.com","ow":620,"ity":"jpg","ct":6,"th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESrwIJkpF9BH9d-EcamgILELCMpwgakAIKOggCEhTZC-EMhwiUC9kI2wzXDKkM4wzmDBog8_182MTf49AzXoT1BXC4qdbNWIyNGrbLmAe3uTJm7mwkKSggDEhS_1AvIG0RKaCtASmwrxBs8SvgL2Bhow6a6FH4xQqKQt4-BEv3EzL0ob79ioGNNnyEw2P0_1fIoJA2aAJBcyonyGWSxvh2fKzCjoIAhIU2QvhDIcIlAvZCNsM1wypDOMM5gwaIPP_1NjE3-PQM16E9QVwuKnWzViMjRq2y5gHt7kyZu5sJCkoIAxIUvwLyBtESmgrQEpsK8QbPEr4C9gYaMOmuhR-MUKikLePgRL9xMy9KG-_1YqBjTZ8hMNj9P3yKCQNmgCQXMqJ8hlksb4dnyswwhln_1PP90REXo","id":"kpF9BH9d-EdpjM:","cr":21,"s":"cnnexpansion","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcQGZdRyYnx73KQSbJuXfENxzK1XkbtlmS2C9OyMQkuDZLh-Z7OjWg","md":"/search?tbs\u003dsbi:AMhZZisHHqT4BzbEDezutGtp9gRj8SZdeIWXDjNVa8Izyphp9t19RFPelTrCV4HnDwZgC6Fg68QrRUlyeSe95qo7IbMbexXdbcymIfSwLJu42ah1hf2ZQiWom8XIki2EYvtZs4s4RAOK0vLImKO2eZzQ2XLIZ8mdGA_1x_1wnHKZtiUL3O562OIgD8KalYi_1JysZLBe4u4DgFmhWqGx5v3J409wnp567OYYQxTS_1C0G8Um4Aa4vvl7tM867MerM-FEVSQrfck0UlPiXKMMe7jWQQr9d1CLd_1slijM9I8C7pNIeMCEZfTEdtXHSXtT4GAsTfAeArXXCcaBjr8-u6bo2OCOzN73-xDEqv7kp1ngc-UhmD7PlDMVwL7yURJ2OvPD-W-3flT7pivJrlzmGkXzVdd1erLokW6Mdf8AVEQ8tJ71RA6Nbnl5rHR6n28F8Eocgh8AzhUtuuiWTBMrFXx4ym5FoJmwxD-K04aT5AeaafmlxdcBiBMRwt890pGEFBJtyywTrWKgjzkTVq1NkqneRotg5yVAkSQF59A\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":285,"cl":21,"pt":"Por qué el logotipo de Apple es una manzana mordida? - Especiales ...","fn":"apple-logotipo-manzana_1.jpg","oh":385}
{"os":"332KB","cb":18,"is":"1440\u0026nbsp;\u0026#215;\u0026nbsp;900","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJBJW3DSH0w60akQELELCMpwgahwEKOggCEhSaD8MJtQyiD5wMvQn6D5UPsAn6Ghogwbq0Z584hRkqKt_1Y-mXEnjeFUwmAYXjSaY7Ujbu-wAkKSQgDEhOUC8wB1gHpFZUL6hWYCzmsA8gBGjB0o9E-9tiI4Y_1F18t-rNeqds4SY0tdwMeIdwNOL342KhYEw9DjsKYhmkT9q4h1MDIMIUi7NomeEMDn","isu":"taringa.net","ow":1440,"ity":"jpeg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJBJW3DSH0w60akQELELCMpwgahwEKOggCEhSaD8MJtQyiD5wMvQn6D5UPsAn6Ghogwbq0Z584hRkqKt_1Y-mXEnjeFUwmAYXjSaY7Ujbu-wAkKSQgDEhOUC8wB1gHpFZUL6hWYCzmsA8gBGjB0o9E-9tiI4Y_1F18t-rNeqds4SY0tdwMeIdwNOL342KhYEw9DjsKYhmkT9q4h1MDIMIUi7NomeEMDn","id":"BJW3DSH0w61QwM:","cr":21,"s":"Wallpapers de Apple","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcS_ldB3x_5fDEXyCVisNBvHuGd-Ek_U-Wsw2aDLduNuTWlOTlfa","md":"/search?tbs\u003dsbi:AMhZZiu7gI1AGGI98o35IQCjRPgkwiP2NW1kD35SQxlW2gjdd87wQxUjb5-83Wxw3d2FJIMBNE6tZ8mCkMcM0zOwNlS7RxFjrBvUTTDvjO8oWXC2h54pYd-aJr75Sm1mUiQ2AR6ep5IQhVsIFsZVB186lW982_1nfb8Acw17wwlG5XElc6XfoKw4413XOg9r8CK9iiUlsfwZV5JRBByXrTxc8JoMXCYPZSw7V4-90IsAkteenknZf9nAAN0ERlwZM9Iq7sLArOHKkvtSqSVjOqbotyv8uXvBgvOl-Vs2ahGTirYJ0V3c4VoWiz14AJiV5k8lKFOxy1vHEuyGTk4JV_17PQpR_1DDlbZck8l6f8B3_1kXP1bqksS1KV0\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":18,"pt":"Apple - Taringa!","fn":"40708d1343255752-wallpapers-hd-apple-apple_wallpapers_hd_2-509679.jpeg","oh":900}
{"os":"1.0MB","cb":6,"is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJNHa8j7S8exYakgELELCMpwgaiAEKOggCEhSaD5IQrQqfD9kZ6xO7G_1oaux_1MEBogNPQhGo4QRRnCdfMNNIfOtrwadZ71ZjqM8EwurVLYYmsKSggDEhSWF_1gW6RWZC5cX9xasA8kBlAv8FhowphA_1tttQMu9V5MH4yqzoPZsT4jqg7GFMHzsg7vV1FuOCEDGM5TiX8pJYVZls761yDCH0QqYxBLv7Xw","isu":"taringa.net","ow":1920,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJNHa8j7S8exYakgELELCMpwgaiAEKOggCEhSaD5IQrQqfD9kZ6xO7G_1oaux_1MEBogNPQhGo4QRRnCdfMNNIfOtrwadZ71ZjqM8EwurVLYYmsKSggDEhSWF_1gW6RWZC5cX9xasA8kBlAv8FhowphA_1tttQMu9V5MH4yqzoPZsT4jqg7GFMHzsg7vV1FuOCEDGM5TiX8pJYVZls761yDCH0QqYxBLv7Xw","id":"NHa8j7S8exZGUM:","cr":12,"s":"[especial apple]","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSI-ivZg8RhK099cAzFjVm30Tsx1MqB1oaCCes2Dk-244LpkNnL","md":"/search?tbs\u003dsbi:AMhZZitZ2gVferXoawdoqtn6VrfwLC1wvanFfi1NxYaRK6QOEwZcAcHKEuyTklYFr9buwNt_10h5Mz084VatzhCSm_1hwiCMEBi-gCUlWWEaruJxZCrQRdfGO8hZxVC_1bjXcYrkZkbbODzM7tYtYXDgOuzoFvitsmHPm0ZANgrGwvRTd2R3EY9I_1F15OkVIkcWheJqtJOwmalIE1Y5-xAVcbbdlf_13CZkDVQ98fRkwKW5roWVIY_1dWBMD9mgBixinFCwcHuXdKrAAboueg7KhGpUsKeF1seJg0AZmsA5ntKU4xsnNDqtxw9UkbmPS79s5pIMvTM42cP4BwBOFsckgdHLK8-EBeUG7OULOboX0P-7dVYDB-jmEQzzM\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":12,"pt":"imagenes en HD [especial apple] - Taringa!","fn":"chilled_apple-1920x1200.jpg","oh":1200}
{"os":"123KB","cb":9,"is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJvm9_14UdLt0AakgELELCMpwgaiAEKOggCEhTDCZoPmw-1DK8VvQmcDPoPnQy0DBogDgZiAR_1OQmeGKcUY5UDx7Sdjn55QKYDbZ1xi5qwO1isKSggDEhTMAZQLyAHpFdYB6hX4FqwDyQHvFRowbGPNvvxYn7FUGNvZzoGXLw3O6gw6aBUm-_1ScTQCm6CdaVUrw49QhuoREVHXC8yMyDCE7QAFqfBcGxg","isu":"startupandbusiness.com","ow":1920,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJvm9_14UdLt0AakgELELCMpwgaiAEKOggCEhTDCZoPmw-1DK8VvQmcDPoPnQy0DBogDgZiAR_1OQmeGKcUY5UDx7Sdjn55QKYDbZ1xi5qwO1isKSggDEhTMAZQLyAHpFdYB6hX4FqwDyQHvFRowbGPNvvxYn7FUGNvZzoGXLw3O6gw6aBUm-_1ScTQCm6CdaVUrw49QhuoREVHXC8yMyDCE7QAFqfBcGxg","id":"vm9_4UdLt0AwhM:","cr":6,"s":"Santiago Arizaga","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQFrHHIAd6yP2EAYR-9CXVDWv25te7Q5fFF9kz3IQyDPW7vIT4C","md":"/search?tbs\u003dsbi:AMhZZiu80CjNBBSz8DP9mhcR47aVNuqiqFr_1-965B7jwQvvWQa0Ai1dYfTG3ThCqnI1VDviDec2E3MhjDD6wbrNFOAM7V8k7q3HoxeZ7aaoFetv3qbhOS3zUakQzmkri03RuwXEV2o-LcTBpzQMrefa8AgHUrH0dglwmFUQ80VL838k9NsWgU4b22nJq9B5nXjzlIokY_1MuSmwiCOUpd9pvVrd95UCk-VqS6HadJJZoBmtL0TiOweXkkax9QvlIMF6iB5JyQHrhig7qaCGgH7fxluqxGt5Qln7R4Gbq06PZhB_1W0VPW4ubPbOJqEtxhdqiwXZbhnqjJo2uGkwr_1YoYn6p7iZW7T3ZUQzIxxuUBTr6OX-j16ivj8\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":6,"pt":"Apple Anunció Las Aplicaciones Mas Descargadas En Su App Store En 2014","fn":"Apple-Anuncio-Las-Aplicaciones-Mas-Descargadas-En-Su-App-Store-En-2014.2.jpg","oh":1200}
{"os":"76KB","cb":15,"is":"1200\u0026nbsp;\u0026#215;\u0026nbsp;1065","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJg61O9sxZyOgakgELELCMpwgaiAEKOggCEhTjDIkJpA2FDZgIkwnhDOQN4gyrFRogYgdvOs9LYeCV_1NBi-ufH0_1P45Xl-TbBZvVlbm3I7WXMKSggDEhS0HdEGxxLIEtMGsx3pBusGoQKnAhowYYnLlV-Qlkof3UsL3lr7WhWUem2IjlZW0ty7LPSXhru1UrFQhHVAXKTtHEdzrzHuDCGsr8ZInAlJNQ","sc":1,"isu":"dreamatico.com","ow":1200,"ity":"jpg","ct":6,"th":211,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJg61O9sxZyOgakgELELCMpwgaiAEKOggCEhTjDIkJpA2FDZgIkwnhDOQN4gyrFRogYgdvOs9LYeCV_1NBi-ufH0_1P45Xl-TbBZvVlbm3I7WXMKSggDEhS0HdEGxxLIEtMGsx3pBusGoQKnAhowYYnLlV-Qlkof3UsL3lr7WhWUem2IjlZW0ty7LPSXhru1UrFQhHVAXKTtHEdzrzHuDCGsr8ZInAlJNQ","id":"g61O9sxZyOjI6M:","cr":21,"s":"Apple","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRyvFOMUS_6-Uvr-o9Ie01FqSXq6W-HunGNlUkTmgCE93yF62ZZ4Q","md":"/search?tbs\u003dsbi:AMhZZits1z4V_1DYp_1OsCi3idgeCUlepNL-4ap-LWf9-QLkYPobD6Uagr0BlEtspJ3EcrukGb7Jcf5b6xv5huU1iwl32ZbzQrkP_18oTynePHrCfVl9SxZnXs75NxWpUOeMCY5odxeEBJvr7Ebt2qlQ6D_1bYV4yO_1xjaN8msi2SSwno2kmgDr_1LCon1MyX1rBSnzzZUeRZnnwOtERU72LqlICmzj3nAtbj-BV2BnfVJE920udSl4j7sG0nQuKmSnVaCCV57uzsvUbXSgRCGlfKMDveMJ6WMtVLWrPxdBvH5whPomJJeNVy64UvaATYH2Tc-UgTRLratMgukm1kIcVxF7yw-CPdE4SB1WkwTdatrudwIAF_1XxJwrCI\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":238,"cl":21,"pt":"The meaning of the dream in which you saw","fn":"apple-2.jpg","oh":1065}
{"os":"104KB","cb":3,"is":"1020\u0026nbsp;\u0026#215;\u0026nbsp;512","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSrwIJfAVATGLX-_1gamgILELCMpwgakAIKOggCEhTHDasRwQ3CDdsNqA-YG8UNyR_1EDRogI1mxMh8IRt7T9SR0Bpr41AzoTpcOhV5ocW_1v0wxp3TkKSggDEhStFKwUmwqqFL8D-gaaCqsUtwPGAxowkzuRUXEHz6fNJ4Q51IInYzQaJfnzNg1cxSiHjXdXJqHbgpfnuNBk_1KaW-2RLjnOMCjoIAhIUxw2rEcENwg3bDagPmBvFDckfxA0aICNZsTIfCEbe0_1UkdAaa-NQM6E6XDoVeaHFv79MMad05CkoIAxIUrRSsFJsKqhS_1A_1oGmgqrFLcDxgMaMJM7kVFxB8-nzSeEOdSCJ2M0GiX58zYNXMUoh413Vyah24KX57jQZPymlvtkS45zjAwhD_1ZIHvjH2iQ","sc":1,"isu":"appleid.apple.com","ow":1020,"ity":"jpg","ct":3,"th":159,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESrwIJfAVATGLX-_1gamgILELCMpwgakAIKOggCEhTHDasRwQ3CDdsNqA-YG8UNyR_1EDRogI1mxMh8IRt7T9SR0Bpr41AzoTpcOhV5ocW_1v0wxp3TkKSggDEhStFKwUmwqqFL8D-gaaCqsUtwPGAxowkzuRUXEHz6fNJ4Q51IInYzQaJfnzNg1cxSiHjXdXJqHbgpfnuNBk_1KaW-2RLjnOMCjoIAhIUxw2rEcENwg3bDagPmBvFDckfxA0aICNZsTIfCEbe0_1UkdAaa-NQM6E6XDoVeaHFv79MMad05CkoIAxIUrRSsFJsKqhS_1A_1oGmgqrFLcDxgMaMJM7kVFxB8-nzSeEOdSCJ2M0GiX58zYNXMUoh413Vyah24KX57jQZPymlvtkS45zjAwhD_1ZIHvjH2iQ","id":"fAVATGLX-_ikZM:","s":"","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcT9DrNZuUUdP3Nx4UoIFpM8Ixg_WvZnE-HMYDqHitZV1ux5fauPBA","md":"/search?tbs\u003dsbi:AMhZZisCMD50667aZX-DPOcZXEQO7DSU-VMJkj9PSqnIrv9V6MSNHtlOu7-QapaFO1sxFJXlY_1jvjffb2mjq1FKd_1wpgKrH5mon3eiHQrz11zkOGwg5kXWzP7T1p4Hs_1UBPCXW8MSqRJoqhQDDHAbJ11gEEOqb9tRoWFQR5eyCvqT3uXg-5RiMxAgpS-Px_1T9VoeynkjNBT27T-kGIXgGnFiK_19uU_1r6J_1yUrVVu7oUlwjGC6xd_1tRBHhTliUQVwHcrNJ-sQXDnohfOCR7v8fqO4SR4stLKsyyQvVS8lal9i-x2JdYJK2GZlqRY9cGhLoFKdxt2CScHG_1afirYSjlASqU1CzLswt8rBKg9YmQn7-P0pbnWZl13sw968cr5Tv37EMRtpMXpOPaEguHD8vSZfR2OkNgzlcYxVTEEvmKtRjZifi1k9qohOo2mJ9D7GU-WOZDOGlGQchADOrj1WtxMFhCiOuIsP63mlrLQM6T4j1Gcjw480X2_1vi6HXbk7minBDvsGZUUIlSnpCR909t9tUDu6ucUVMILg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":317,"pt":"Apple - My Apple ID","fn":"hero.jpg","oh":512}
{"os":"705KB","is":"2223\u0026nbsp;\u0026#215;\u0026nbsp;2223","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJE4L9V_16YzIsakgELELCMpwgaiAEKOggCEhSrFYkJ3RWLDYUNkgnyDpkKlwqYCBogRFKTDHL3cy3solrOQyS2M-5djZGjq6BbMxlOL3CgRtcKSggDEhTSBscStB3TBtEGogHQBrMdnAGhARowEzWHZMF2rB_1uMJrJ4MxTP6AVFpZInPwu492oEKZ0Z8e1DvmtHelAfXsAmtEGIGWKDCGsr8ZInAlJNQ","sc":1,"isu":"dreamatico.com","ow":2223,"ity":"jpg","th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJE4L9V_16YzIsakgELELCMpwgaiAEKOggCEhSrFYkJ3RWLDYUNkgnyDpkKlwqYCBogRFKTDHL3cy3solrOQyS2M-5djZGjq6BbMxlOL3CgRtcKSggDEhTSBscStB3TBtEGogHQBrMdnAGhARowEzWHZMF2rB_1uMJrJ4MxTP6AVFpZInPwu492oEKZ0Z8e1DvmtHelAfXsAmtEGIGWKDCGsr8ZInAlJNQ","id":"E4L9V_6YzIvdxM:","cr":12,"s":"Apple","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTXe17MYfBoEQPcaclo3PMfkyWrsiASINt4NGMSCc1t1c0pXdlinA","md":"/search?tbs\u003dsbi:AMhZZis8kLnTu4Y7jSgEqCb1BoWvUUWktRoL8EUBBIuFQ96hNraUUAfRRqe5gOdmI6Y2-p13OfLsFbe7W9UXpgZ-TAsYQIyFeZN6dtMmIhDnNxkYBsfS0ll7ds9gYGW8dKPnO1ztYyqvjfve9a0RpokYOux1nVclgTfQM4yszDhaAU72K0c_1J4iAKs4sY2N0R7zeW9DPtrDDY93X3bJPVqn7eOF68oDEDh-DR_1vANcb9bF8pl48EZiP71sQoiNszI9eeJsgLA5eVzcCDB6Z-4bbE4KSS0HS1RB4S4mvdVdcMOxXj60GK3to28zK5KVugHH4WGpnSj8Tg9mKPbCiVradAIv6LcDoEy_1EN-j4dM8VyLdCYWFPS8wM\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":9,"pt":"The meaning of the dream in which you saw","fn":"apple-8.jpg","oh":2223}
{"os":"430KB","is":"2280\u0026nbsp;\u0026#215;\u0026nbsp;1520","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJFG_1OqjE7cNsakAELELCMpwgahgEKOggCEhTDCZoPtQycDK4VmQ-0DJgPnBW9CRog0aSRKd-3wlqKK73173up7N38z1hQLuFKXYW6Ct7adpYKSAgDEhLMATkj1gHJAcQBtg7qFc0BsAwaMJXu6QL0WA9UDqMMPSfNTSqaM7ZjsJHP15V1fETPiilsgsjokGdpodGMSv7s_1w4BcQwhFnWsODM-OGU","isu":"theawesomecave.com","ow":2280,"ity":"jpg","th":183,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJFG_1OqjE7cNsakAELELCMpwgahgEKOggCEhTDCZoPtQycDK4VmQ-0DJgPnBW9CRog0aSRKd-3wlqKK73173up7N38z1hQLuFKXYW6Ct7adpYKSAgDEhLMATkj1gHJAcQBtg7qFc0BsAwaMJXu6QL0WA9UDqMMPSfNTSqaM7ZjsJHP15V1fETPiilsgsjokGdpodGMSv7s_1w4BcQwhFnWsODM-OGU","id":"FG_OqjE7cNuaJM:","cr":9,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQwWaOlWR4G273MSGegdSHg0_zxEhUxQthNNO8WHLZWvo4oKnx_Tg","s":"4 Reasons Apple and Macs Will Be Extinct by 2017 Posted on Jan 2, 2013 ...","md":"/search?tbs\u003dsbi:AMhZZiu6ttz17SfiVC4g6278ZWGx2NOwzyqQd7OJFnawyi5iGEWOliLDcNAPuPJing9yrrBzcsh0_1sDiZJphWT3i5vPI1SnGjqUkkjpvMVwKpwSSIJ7eQAzVdK44nkOycRzupsYCQbnXCCQYqVdEJwIBG5XblJITNroK8hx9nSc3DXuZlbDoT4aVlXq0m4_1sJvwygLFVBSFtdRQ4ts_1nSVO6p7AWlEVF9Aj7IK2f6-EMpGg1axt-nvHUHCkzoIVyWdlqSgFcz2_16ylseK07d7kAK_1mhH0p6Zs7u78lEsCSpS8CrvbPvqH22waY0s9e4nv4nuYoEtWah7GgvHcgp7opOXEAoQ2He1MnW5C6i5YaZkITAl5qekFF4\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":275,"cl":12,"pt":"4 Reasons Apple and Macs Will Be Extinct by 2017 | The Awesome Cave","fn":"p1010716-e1317767547948.jpg","oh":1520}
{"os":"382KB","cb":3,"is":"2290\u0026nbsp;\u0026#215;\u0026nbsp;2290","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJlglsoGJZIAAakgELELCMpwgaiAEKOggCEhSJCeMMhQ2kDZMJ3RWrFZgIkgnhDBogutlp9NP7YXT10tT9nO7uA7PPk39-Uz-BH8s9W-wqPUYKSggDEhTRBrQdxxLTBrMdyBLQBtIGpwKhAhowBA_1slS-TFl8eczCV7LTwXeUTFu4MhTAg49CYI8RSh_1B1A6kQY7uRYyE--s9yLyLuDCFQkz38vo431g","sc":1,"isu":"efoodsdirect.com","ow":2290,"ity":"jpg","th":224,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJlglsoGJZIAAakgELELCMpwgaiAEKOggCEhSJCeMMhQ2kDZMJ3RWrFZgIkgnhDBogutlp9NP7YXT10tT9nO7uA7PPk39-Uz-BH8s9W-wqPUYKSggDEhTRBrQdxxLTBrMdyBLQBtIGpwKhAhowBA_1slS-TFl8eczCV7LTwXeUTFu4MhTAg49CYI8RSh_1B1A6kQY7uRYyE--s9yLyLuDCFQkz38vo431g","id":"lglsoGJZIAC58M:","cr":18,"s":"","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTLlM07JbiliMfgdzASbszpAUo1oVjv6K5JD302_trdteAIAOSK","md":"/search?tbs\u003dsbi:AMhZZiu0rr3e9z_1dP2a92TJk9ftxCTDSWwU44zogjw38oTeep5RxUEtzHZRbR471aC6FYfzMhSt3q80oU5f6WocQIP9j-0u8qtUfEggZB91UAJGoLUHmUg_1UZoucOnGnLUOWf1p8PsSgMLGq8s00dkqYs5Xowngbyr6igIYhW5yUDzwqCpbcFtYSBCAc0h3AKwCP2wkD_1CT1H1G53BPb6uEesjz5mJ_15B2dzomqjOKs84NXc_1xcjMnW1tvIXvHP9fX_1wACp05l5rO4W80qMimMwtBF_1B6Q8BxHk2pUars-y4mabVzB6W6qtWedR3LJXw9r1pmk6aNx9nCvEzPsGnDumrpF7GH5GqQD-RFF-6-UMqMI9Zya5gA4o\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":224,"cl":15,"pt":"Freeze Dried Apple Dices","fn":"apples2.jpg","oh":2290}
{"os":"178KB","cb":9,"is":"1200\u0026nbsp;\u0026#215;\u0026nbsp;761","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJDKSQ2UhdODgajwELELCMpwgahQEKOggCEhSxDM8J4A3YD90J3A_1HCYoJjwnCCRoghx8zHh-OVB8VRCOnJAI-gFBDyx5jfe-sUleFKELvsdMKRwgDEhGzAusBlwZAswyjGSnKA9gBYhowLv_1L0fhIfVwj5JJAjSEt6sWZsq9Hy-3lL1mfR_1BVpUATMS3Jg87O3nrK8ywKh1toDCECDVLh3GwdbQ","isu":"forbes.com","ow":1200,"ity":"jpg","ct":12,"th":179,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJDKSQ2UhdODgajwELELCMpwgahQEKOggCEhSxDM8J4A3YD90J3A_1HCYoJjwnCCRoghx8zHh-OVB8VRCOnJAI-gFBDyx5jfe-sUleFKELvsdMKRwgDEhGzAusBlwZAswyjGSnKA9gBYhowLv_1L0fhIfVwj5JJAjSEt6sWZsq9Hy-3lL1mfR_1BVpUATMS3Jg87O3nrK8ywKh1toDCECDVLh3GwdbQ","id":"DKSQ2UhdODjtGM:","cr":21,"s":"What Would Make Apple Pay $3.2 Billion For Beats Audio, Facebook Perhaps?","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTyYOtyjCmB6YFONWCwVt39vPRiI6hkcsebXlOu9eJtyNLt64Qq","md":"/search?tbs\u003dsbi:AMhZZitH6qGkUdeptpb1I9y3xc0pBaUKg4wP3EiUKnMdUf0OMlLoRBWf2k1uEl-cxRsZPBwR_15D1DlReQXJX-LtO3-Rv2En5ekufdU07amX8xKNvhn_1wOb6qaJ4xq6HNrJkMnzy73jHQxdE9YXGvURR6CoYTUle_1gfEqfhWOAt4x1ch6VHNfujquJjc-TMYW_1WbNzs2m1s1XHsgqi6lCahL_1ZpLqawzTIYSVR1rI6JXzdt53kux5OGVK2XJ_1VeEeSsMFnVPREKOCSUVZJzUVAAxBF4FWIyOJhahBagCppjoCapHH-QKI-hQQf4z7soLV0okOIzhxl60dgSutWXia965TJ4AvHq6whA\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":282,"cl":21,"pt":"Apple Beats Purchase Seemingly Confirmed By Dre In Video Selfie ...","fn":"Beats-Apple.jpg","oh":761}
{"os":"87KB","cb":3,"is":"360\u0026nbsp;\u0026#215;\u0026nbsp;449","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ5i7-ACmg7lUakgELELCMpwgaiAEKOggCEhTEFJILxRTWC9cLjhXVDMEI_1gqUCxogaypipyB3K-yK8gawJ-4kBfiwYuNxvkN9mNbAEDNn8BQKSggDEhT_1BYoSrB2lB7gH_1gXJArkHrQfmBRowpOWtkuXScOfF5ygSGVcSOYCB-o3GZ37SQGmoJwSjWDWfEDjsMkhWvAQUg5PpgQHtDCFK3X-KhRQacw","sc":1,"isu":"blogs.tribune.com.pk","ow":360,"ity":"png","th":251,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ5i7-ACmg7lUakgELELCMpwgaiAEKOggCEhTEFJILxRTWC9cLjhXVDMEI_1gqUCxogaypipyB3K-yK8gawJ-4kBfiwYuNxvkN9mNbAEDNn8BQKSggDEhT_1BYoSrB2lB7gH_1gXJArkHrQfmBRowpOWtkuXScOfF5ygSGVcSOYCB-o3GZ37SQGmoJwSjWDWfEDjsMkhWvAQUg5PpgQHtDCFK3X-KhRQacw","id":"5i7-ACmg7lXe2M:","cr":3,"s":"Source: Wikipedia","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRWO66NwGvgWxEt7xTlvlxjrQT-6eRepCsmGO2E3-K4lZOZP-TQdQ","md":"/search?tbs\u003dsbi:AMhZZitPOxnIZKHWqd2LMlX_1uZ_1tR_1zDZx2B-gHZZxTr6Ol5f3EBgH-x80EPfeZq51U_1rFJA4zQcecr8LJ0zzlhzLhbDdv3jfnvRnS5AG7Wt2PhuDLnyPoIuD-z92S4becZ5ig2FNG2YttQsSuwBLhmkDhzzvlAponwn0sKzwaHSMfy22jSI_1ipRIcXeUixc8RRjgWKSfJEWTZS_1uQB8W39XdFhsvaRqNRdOV3oK3Qt7sG7wiTrn1knvGc1onVe3pI3aAHAratVrPFapXdfEc_1jReUKKC9TSyATdZRkmfiljoNpzUrbVJEy0tG3FZcHgwgGLb4Kw98ZXbVBaMN6DF_1Qe6_1KuWxhRFxQA0A78IjmiXc3wfWCpREE\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":201,"pt":"The evolution of the Apple logo \u2013 The Express Tribune Blog","fn":"silver-apple-logo.png","oh":449}
{"os":"67KB","cb":18,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;900","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJBhQ-hW1xVY8akAELELCMpwgahgEKOggCEhTCCbIMzgm1DMMJmg-iD7AJwAi8DxogY9UVG7-23uBvgIbpzcjqklhGPo0CXnhnaPy6CgHPwaYKSAgDEhI5sAzMAa8M1gFAmBeWF5YGtw4aMCc-qov-UHJVxMXuYY_1NjQSrJ3uvM9zIL7UbKUvf3LoffunBze471uqpLCD7rnCbtAwhhV96BEIQluA","isu":"pcsitetube.com","ow":1600,"ity":"jpeg","ct":3,"th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJBhQ-hW1xVY8akAELELCMpwgahgEKOggCEhTCCbIMzgm1DMMJmg-iD7AJwAi8DxogY9UVG7-23uBvgIbpzcjqklhGPo0CXnhnaPy6CgHPwaYKSAgDEhI5sAzMAa8M1gFAmBeWF5YGtw4aMCc-qov-UHJVxMXuYY_1NjQSrJ3uvM9zIL7UbKUvf3LoffunBze471uqpLCD7rnCbtAwhhV96BEIQluA","id":"BhQ-hW1xVY8BbM:","cr":12,"s":"Apple tiene acceso a nuestros datos","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQXGiuIIJKINXXPe4V8OTKzMSBTnBkqbrraHty1zIVs4JIhVrz5EA","md":"/search?tbs\u003dsbi:AMhZZivn3zOQot0GMt9eEFWhIyvLaZtUO9TjmF9P49_1iUWZpGxw3WRTxOYHmM6A3zxuprEqYbMnUDUljHvi2W86XY4iYY4z8A6KqZSH5RPeo90JqJswdalh4IMZpSfkX9wDc8WEkudCXUZBiQlS9vCk_1-FhoM4EE9zNudHtrVKIN4Lt_139RcoE4ZxHUGJDrRYmGs1f946AdJA4Bg3sIaHC0JlyECtKMUD1t0vOOrHSBJVph3a7gHOurcKyDJBWaL4KNJT5_11oRGqJI9qvqycD6S4b92udpFl9UFOI0c4UVUH5TyON2xnEZCnzRp6fdUrYeiZAVtfeHfkEmK02qsv70D6lPM0FREvkYBRG3CbK-NF_1O2yA26Ltk8\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":18,"pt":"Pcsitetube.com Todo sobre el mundo Apple en español","fn":"apple.jpeg","oh":900}
{"os":"52KB","is":"1442\u0026nbsp;\u0026#215;\u0026nbsp;1772","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJdPX--XDUcdUakgELELCMpwgaiAEKOggCEhSUC9kIhwiQCdgIqQySC9cMiAiGCBogRjQn34n-UQLNq7MknzjrZYtc2SM3nrOPefDPYFL1jJcKSggDEhT_1BbQBtQG9AYoSkBL9BekFiRKlBxowjD3fnljblFApWdw0Bk6G94fA63NsngSL1e-ROoagWNiIYKAiotqoWn7ifBOITQpsDCH6mGTlvKC6ow","sc":1,"isu":"softwarepatch.com","ow":1442,"ity":"jpg","th":249,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJdPX--XDUcdUakgELELCMpwgaiAEKOggCEhSUC9kIhwiQCdgIqQySC9cMiAiGCBogRjQn34n-UQLNq7MknzjrZYtc2SM3nrOPefDPYFL1jJcKSggDEhT_1BbQBtQG9AYoSkBL9BekFiRKlBxowjD3fnljblFApWdw0Bk6G94fA63NsngSL1e-ROoagWNiIYKAiotqoWn7ifBOITQpsDCH6mGTlvKC6ow","id":"dPX--XDUcdWKDM:","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRZMqpZ8Tjg4Ggc3fP6ptD_BE34A2tjXdXeHUbRsVSqyLdGoaoMoA","s":"Apple is taking part in the international Code.org project this Wednesday. The project, which is designed to get even the most basic of computer users to ...","md":"/search?tbs\u003dsbi:AMhZZiu6iFoLrha0YhohMtU7uQuSO9RIOzon0bF6_1k6f_1K_1ULyql4N2jp4PNE07EHUsAYpGwIBUYu4cw_1cuRftamSALIhJYeKbEZAnqhaQGtoWl2WBVaFoEBUfPKQAMZRatSoc_1rUib2zMXTPAmDGLnFJflG0-vbUCukoRq_1l3XOLldb7bvqkfbNmLfgn4JoAePgAQ0P4BsJGtwHcp72Ba7mCjrReiCOGoLOp8YxvNW8voefir5YRZz7GQj1nDZdX1gew5dx4C32NvCtKWzaJU386aV8jDElqXO69TY6Jv524r_1oJoMEffFZoEwbnnIx9EbM7Jb07pZ4tnhiZwZ30giHXEc3wBoikmza51GnXPiGOJ_1qtVLIkbc\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":202,"pt":"Tag Archive for \u0026quot;apple\u0026quot; - Softwarepatch Articles","fn":"Apple-Logo-117.jpg","oh":1772}
{"os":"25KB","is":"550\u0026nbsp;\u0026#215;\u0026nbsp;538","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJmfegMGRjYFQakgELELCMpwgaiAEKOggCEhSJCasV3RWFDZIJ4wyYCJcKmQrkDRogX7Y2_1DPkIXQ1Fv2t-u-lVND4zP9stdua52Gm3xhPULUKSggDEhTHEtEGtB2zHdMGnAHrBtAG0gahARowZc6oZJYTW6GQ3IkJ4FgI9uPjFe4MhVgnw-jAL4TvuTs1U3DtYwtRPZQtLDtzLy7vDCHq-bxwHtmheg","sc":1,"isu":"organicfacts.net","ow":550,"ity":"jpg","th":222,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJmfegMGRjYFQakgELELCMpwgaiAEKOggCEhSJCasV3RWFDZIJ4wyYCJcKmQrkDRogX7Y2_1DPkIXQ1Fv2t-u-lVND4zP9stdua52Gm3xhPULUKSggDEhTHEtEGtB2zHdMGnAHrBtAG0gahARowZc6oZJYTW6GQ3IkJ4FgI9uPjFe4MhVgnw-jAL4TvuTs1U3DtYwtRPZQtLDtzLy7vDCHq-bxwHtmheg","id":"mfegMGRjYFQ88M:","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRimXv3xZWtN5z99H74LucG_eaeT0Zfsu4XVH37aKOCWujkmdPx","s":"Health Benefits of Apples","md":"/search?tbs\u003dsbi:AMhZZis7hGLsXdQj9a6gYncEippor9Uzv9YRYQjFBDRVp0UK5Yhz9TrLKgPGhvqgKl0p4bEDmCfBzyXSlxxpSdVbb23DJ8fn-ov-AbFRtC-2q8CebASEjAwEB3kmDVld3yjHzUBtqdULSgCzKNv2MoUmgNmAoAwsPQNtmTkGZgNNOpuyPmI9qAxcJdYe4aVEeA2GAOmt7j8amI8v7zbSDXlorJU-luZae5wmGJJjCcSwlrSAOhZ9OO6bsrx2WZvD57LzDm8x6_1E-ZHbRGZJ3lAjCJ-UljmdwZ2Z5lugqh0Gg_1FrMPIuA76orZBpM5NiQxV7ZVgaflr-Ru_1H4VwJE4g8UUXLojYmP0ZskxrUGXpryqA3FZ9G4cls\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":227,"pt":"Health Benefits of Apple | Organic Facts","fn":"Apple13.jpg","oh":538}
{"os":"45KB","is":"256\u0026nbsp;\u0026#215;\u0026nbsp;256","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJIBEykhy0Ud4akgELELCMpwgaiAEKOggCEhT7CJIL1wvVC_1wIhgj_1CNgL1guUCxogeTcXrxz4W_1MFCAEkx0MvP4umxSOsJamQkO5TDbejKTAKSggDEhT_1BYoSpQe0AZAStQG4B_1MS6QXHAhowjtTlZkd1Wf8pac15P8WFKg3JSWHwHVjUWF23My87ETvybDiJoDoOOKVPYZAV3SxuDCHXSpXSbs70fA","sc":1,"isu":"3djuegos.com","ow":256,"ity":"png","ct":3,"th":204,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJIBEykhy0Ud4akgELELCMpwgaiAEKOggCEhT7CJIL1wvVC_1wIhgj_1CNgL1guUCxogeTcXrxz4W_1MFCAEkx0MvP4umxSOsJamQkO5TDbejKTAKSggDEhT_1BYoSpQe0AZAStQG4B_1MS6QXHAhowjtTlZkd1Wf8pac15P8WFKg3JSWHwHVjUWF23My87ETvybDiJoDoOOKVPYZAV3SxuDCHXSpXSbs70fA","id":"IBEykhy0Ud5e6M:","cr":9,"s":"","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQtETtQaa9IlLvvhQVubzwgoF7j7DWlx_XGPYnxqfg8QQ7iaZtFGQ","md":"/search?tbs\u003dsbi:AMhZZiuYteZn8OZw9vFufJ0ieuV5gRdcIDlfRsZX2-4COndS_1QnOBuWslPFRl6cLYG-Yrbp0lQWPEfXBXHTD97ED7wOdcRTDkQCxAfvk8Ra_1b2HiryoCAW74tBQJftH-pkRowKJmQ7MKg6hrx93j029_1PbQ2JZOcJm2MOf3t9CMbjCyMjd80s9Gemj_1sAe9yaNrydVXKoAplR_1_1yW0RqO0Esc81RpjDz2YwPjwqzbIaIY548SS5ro0A_1GTPb1E_1btFQmSvSPZ1MLz4GBXAZuzU88HRG7Kdq243te9lPU4g6movb954igGIDTEMzID39S6xKkdYlaajg8yDTKIt-EL6SAWo0ezhUSPDwGgqeQ1VqLep_1VfmU8cJk\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":204,"cl":9,"pt":"Rumores de nuevo iPhone: Apple invita a un acto el 9 de septiembre","fn":"Como-inicio-Apple.png","oh":256}
{"os":"99KB","cb":9,"is":"2250\u0026nbsp;\u0026#215;\u0026nbsp;1198","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJyJdwdQWBgLsajwELELCMpwgahQEKOggCEhS8CL4IvhTqCuUK6Qr_1G6wc3BS3CxogqUnVF-OMeJJssDj559Fqlydoko_1GQEThIKaW-F6vh2QKRwgDEhE-tQfqAeMBPewBQJcG6QGaBhowLzpfr_1jgxbctuFd1c27pQ-DHSDk3WOhg3HDxMG-yACDFND1N9deWWuqA-yiLjBF0DCHazYfsoL-Hgw","isu":"galleryhip.com","ow":2250,"ity":"jpg","ct":3,"th":164,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJyJdwdQWBgLsajwELELCMpwgahQEKOggCEhS8CL4IvhTqCuUK6Qr_1G6wc3BS3CxogqUnVF-OMeJJssDj559Fqlydoko_1GQEThIKaW-F6vh2QKRwgDEhE-tQfqAeMBPewBQJcG6QGaBhowLzpfr_1jgxbctuFd1c27pQ-DHSDk3WOhg3HDxMG-yACDFND1N9deWWuqA-yiLjBF0DCHazYfsoL-Hgw","id":"yJdwdQWBgLs82M:","cr":12,"s":"... Apple Vs Samsung Apple-samsung ...","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQ7ycZmBQz2gOlhVMWI9Rgo-1l07LtNcHFwYvLXx_rXr1A3S9HL","md":"/search?tbs\u003dsbi:AMhZZisvSn_122hCjrdwA4WF3Wi_10fH1JDF7P9GenWTYzhLE4D35vdkJ3GiubOzP7sbJtw5sIf-pQnLQ1GfElmhUnDJ4njt_1bTaTKfybNzeaE1QqQSMbFG9C1yBNCR3G5t_19kcYf8N3byIHZAfUJczlRR9aKecrPD4Eu0BeMiI2zsdtWyZkwJMfHrSLgypg8LsXoEKA4UFTaiXxG0EG8wgVXcUB5NrbTRvkm5AKjmy-1iw8DZeEU-AI3he1r6jbJ1-V4h1TDWL7_1d-NGBNgGmac0vJ0lFPuSFCf3jtBhyLDzqjLR31DFAeyqUkMRRLW9vLH5CeZB3iwHFWXHQMU4CCqbasKgdnoVRlA\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":308,"cl":12,"pt":"Apple Vs Samsung - Viewing Gallery","fn":"apple-samsung.jpg","oh":1198}
{"os":"94KB","cb":21,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSowEJlOmLPpuHRUoajgELELCMpwgahAEKOggCEhSKCbQMwgmzDJ0MhAi-CZ8VuA-gFRog_1xX9OT_1Ck4N2jd1ltu0oZl9oQc7-t_1wJGvRI3a8WGEYKRggDEhCfCUcBZZ4JnAmGCQbZA6AJGjAUbpeS9VwOII8yJEavC-TN4RQPU3bB76HPaCAyr5-VuCMvzdthaEKtIN5NSybOW3sMIT1RGute3kNE","isu":"hdwallpapers.in","ow":1600,"ity":"jpg","th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESowEJlOmLPpuHRUoajgELELCMpwgahAEKOggCEhSKCbQMwgmzDJ0MhAi-CZ8VuA-gFRog_1xX9OT_1Ck4N2jd1ltu0oZl9oQc7-t_1wJGvRI3a8WGEYKRggDEhCfCUcBZZ4JnAmGCQbZA6AJGjAUbpeS9VwOII8yJEavC-TN4RQPU3bB76HPaCAyr5-VuCMvzdthaEKtIN5NSybOW3sMIT1RGute3kNE","id":"lOmLPpuHRUrAGM:","cr":21,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcRhad2sDaErX_AeNWUoB5wdl1JvpOlrBpMoGDw4jWYJwDP_yMm3vw","s":"Apple Green","md":"/search?tbs\u003dsbi:AMhZZitcGXjHmzZkJ4v-l7jcUAoNHimTVMcFevztOigjyq2NLAMC5ys7gOOqjtLN1j4g_1pVU2_1UiV-Y9AfZ13FeArysLUzL2gQoSAcmZ2XiKdZA1yN3D_16iaF3JSLFg3m4cs3eotnm_1QRrtYaNLRB17sp9AnJACgLvLgfLh-tnpo6fyub4FHSoDLqRQompe2G_182zl8XWkQRkSoAmem4NyYLNtqRm3_1tti9NY9udK6FcFfa-78g5RN9pp7eWyy6V0vlehO_1W7vYDu1eF0t1IxhQURXs1azHKXtI9rcpY5pkrytkDEg-oANSf8EidwvdzWRuwkmEnLIT9SkOi9e3vzFLE1jangpv52w\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"pt":"Apple HD Wallpapers | Apple Logo Desktop Backgrounds - Page 1","fn":"apple_green-1600x1200.jpg","oh":1200}
{"os":"80KB","cb":9,"is":"1680\u0026nbsp;\u0026#215;\u0026nbsp;1050","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJqw19l8XrVVgajwELELCMpwgahQEKOggCEhTCCc4JzwmxDMAIxA_1dCZsIsgy_1CBogBTuPcZ_1geapR4pLpxM6Bsq-ZicW60_1es0aEc38XEqdIKRwgDEhE5mBeWBkCwDEGxDNcB5xWZFxowaoltPvb0AhsapXQ6Y2EGyBsQQIPYZhhTYF9MJESFgSCIUEFJrchGAuoq8RvzyUswDCGW2sIqlmnpZA","sc":1,"isu":"ezibox.com","ow":1680,"ity":"jpg","ct":9,"th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJqw19l8XrVVgajwELELCMpwgahQEKOggCEhTCCc4JzwmxDMAIxA_1dCZsIsgy_1CBogBTuPcZ_1geapR4pLpxM6Bsq-ZicW60_1es0aEc38XEqdIKRwgDEhE5mBeWBkCwDEGxDNcB5xWZFxowaoltPvb0AhsapXQ6Y2EGyBsQQIPYZhhTYF9MJESFgSCIUEFJrchGAuoq8RvzyUswDCGW2sIqlmnpZA","id":"qw19l8XrVVhHKM:","cr":15,"s":"Abstract Apple Green Lightning","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTX-P3f-EVeGWc5_SXjSPGvhBV6Dh9AN8D5d8cxqH2eQaA-6zx9zA","md":"/search?tbs\u003dsbi:AMhZZisdrJ3Tixxgg0yR-5x3nxhN6dvXsfTodS0BLRiJEpoD0Q9PnoiUWFz9Z_11wQuFm-z7BW6m8rJjy34fHEJCttTHEYsOIGiPT2NBWA0Yps817CD9OlwbFzreeJFia47Gbidb4TjQKxnFJws5vhvzLHR5EjKM-XlRZgUrIJh1DxGzWvRvwEu4pBhLtTwrMftA5NESNTjNy563pESH6pQ9ZZQM0PecXnN6KryprP1ZwGb208ZKIu3VLjRgLyJclBDRJVwwXw5vyKvj47FPtx_1WGLzYgA98uMiC0joz24Zkv_1oY1_1pXXQ6sKt3-xxAGuEA_1o3HtMXOd5s0SV5ABa1AM9-_1BFPW93KQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"pt":"Apple Mac Linux Desktop · Android Wallpapers HD | EZIBOX · HD ...","fn":"Abstract-Apple-Green-Lightning.jpg","oh":1050}
{"os":"94KB","is":"900\u0026nbsp;\u0026#215;\u0026nbsp;475","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJWy15mUK22ckakgELELCMpwgaiAEKOggCEhSaD6YRtx-uEZgP2RnDCbUK0h2bDxog9oeaOY9ohVkYsDdoJXqo5QqUsVhYHuHrr_19D61ii7h8KSggDEhTpFfcW-BaWF7UOzAGDDPUWhQzqFRowVHDebPLQJ2MYojQmHLQn1pijX9a8J6Rqj5-So-dQguOshK_14qtlrEo4xxTxx7IlzDCF-l_18NvokVDg","isu":"inversorlatam.com","ow":900,"ity":"jpg","th":163,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJWy15mUK22ckakgELELCMpwgaiAEKOggCEhSaD6YRtx-uEZgP2RnDCbUK0h2bDxog9oeaOY9ohVkYsDdoJXqo5QqUsVhYHuHrr_19D61ii7h8KSggDEhTpFfcW-BaWF7UOzAGDDPUWhQzqFRowVHDebPLQJ2MYojQmHLQn1pijX9a8J6Rqj5-So-dQguOshK_14qtlrEo4xxTxx7IlzDCF-l_18NvokVDg","id":"Wy15mUK22cm4yM:","cr":18,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcRHN_xWvQ2XkF2N91M1Hi4b1TwOWlrMu6XGwiSfMULTMdwVLsaQ","s":"Apple","md":"/search?tbs\u003dsbi:AMhZZiuEZj97G18fTUIhd_1iA9y0-Wesg2FmzBwoF_19e_14wt60XIvR8ygog7eApRbDEjOVQnidFCizVJ4DC4EWZ9Immv-7hPtrNq_1Jgst3Ax-r1jzSY41y_1mkhjK9r2sDuCuM3ES7GLNRs9faPGS76fMfo_1f51RTqY1xaBbcLivUVJWa_17HmHvDplTp2PWYZvM3800YNo9awE4oxusFzH4pbZvBZmnPjN-Tqyz-AZXUrgPMCp6pH4UYxvSFNr55eehAZFV_15XnBCoIWCILQ66SYdSF8Ldk_1LrOYEQLHWAlPJ8ErbHA6ZTfOxTNEc_1ZOpMQsL4Wv5eqXrnmmY2S4zNXvvx-cw82jCXJGM3QX52c7Po1vPGfPoSeUs\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":309,"cl":12,"pt":"Apple factura dos millones de pesos por minuto gracias a su ...","fn":"abstract_apple_by_aloschafix-d4k2ghu.jpg","oh":475}
{"os":"98KB","cb":3,"is":"1500\u0026nbsp;\u0026#215;\u0026nbsp;1000","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJah0CoCLpefQakgELELCMpwgaiAEKOggCEhTIFO4U0RTmC9QUigvNFPcU-QrvFBogoS-us-frGdQQamJWmnbq2JfSBy21Kx7obPy3bfY9ANEKSggDEhSvEp8S-QblBqwHuga9EukSohKjEhowBB4l7FViqKr3FvUhjKDAZtwy_1kiInVajPsflspHs4XB2K6dOuozPnhOeTCNWPQx2DCHPbcdgoflrDw","sc":1,"isu":"hoyentec.com","ow":1500,"ity":"jpg","ct":15,"th":183,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJah0CoCLpefQakgELELCMpwgaiAEKOggCEhTIFO4U0RTmC9QUigvNFPcU-QrvFBogoS-us-frGdQQamJWmnbq2JfSBy21Kx7obPy3bfY9ANEKSggDEhSvEp8S-QblBqwHuga9EukSohKjEhowBB4l7FViqKr3FvUhjKDAZtwy_1kiInVajPsflspHs4XB2K6dOuozPnhOeTCNWPQx2DCHPbcdgoflrDw","id":"ah0CoCLpefQyoM:","cr":18,"s":"Apple iWatch llegará en octubre, dicen reportes ...","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcS9YrWisyGw15pmcFIuD_OWU9vOiP8SSNLg2y3euHSFAr6SpwTp","md":"/search?tbs\u003dsbi:AMhZZivE8u-bCXFQ9dJA3nBq6vktRQlW0lFE5HacPZ1xtNIeKUwvPuFJwcl-9ec-OGvgASAP_1shsyekf0juk_16tnM9JNIvjvlW8PwM3fq0cViRnAqVEftTlR--tdU9ov8DwB5NYF_1SpDaEFxK97MnMhmYdoLUH3t9rGaOSGkK1rtHUkc3vKiuRui0GGiU5q0MsOMoubPAY_1z2b-8Un9AIGGUM87k0RR5RgEnw9pbGboDvJ8aA4_1SW3eFQVVpU3jpht77yd1p6qfzBQiFTRmNeDle4ekirlz9wiYo2FXMQs6E1cU4b72F_1kQuZPg1hXGQ6F8rLpt7Mv_1RTk2G9osD0CY6RXTKXFuWxWoNxYyHkJ-g9jBWM_1_1BpVo\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":275,"cl":15,"pt":"Apple da un paso más hacia el iWatch -","fn":"apple-iwatch-octubre.jpg","oh":1000}
{"os":"94KB","cb":3,"is":"512\u0026nbsp;\u0026#215;\u0026nbsp;512","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJd001bPJcFSAakgELELCMpwgaiAEKOggCEhTjDIkJmAiTCaQNhQ3iDOEM5A3dDhogiB9tnoX8bHUeuRll-iWDVC-7sc0mE8y-afbuNCis12MKSggDEhSzHbQdtQLHEuwG6Qa2AssSyBLKEhowizolYXFTDISL-9MRO-1HIeFLE_1Y6yjBQ3MAmTp9OYfLCD6Uvcgmg_1ahtMZBloqNpDCHvklpbREe7ag","sc":1,"isu":"marketing3cero.com","ow":512,"ity":"png","ct":3,"th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJd001bPJcFSAakgELELCMpwgaiAEKOggCEhTjDIkJmAiTCaQNhQ3iDOEM5A3dDhogiB9tnoX8bHUeuRll-iWDVC-7sc0mE8y-afbuNCis12MKSggDEhSzHbQdtQLHEuwG6Qa2AssSyBLKEhowizolYXFTDISL-9MRO-1HIeFLE_1Y6yjBQ3MAmTp9OYfLCD6Uvcgmg_1ahtMZBloqNpDCHvklpbREe7ag","id":"d001bPJcFSCkXM:","cr":9,"s":"Apple asegura que la contratación de los expertos en automoción no tiene nada que ver con el proyecto CarPlay","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTV0Z5Ht9hnQO1zWK_bW3eCK8Ez8uyrsfgQS-2_UNSwzu4InNf3","md":"/search?tbs\u003dsbi:AMhZZitD1mvBoWGVJ1X_1MLduF7j73Eo8Wg_1GT4Y1ifwQ1aqRVOnhcJblzYkF_1J7O842NIKfG0APHE0YdDPlKfSDNiNMaKUCLRx8WFClQEjsad0jo1b-RoBhLv8d9Ve4AZRXZXT_118Wi3yC9YrHcnm2C6UHR67U2NjPdhvLzF-niHQIDNcQDAb_1yCy_1hIPNcRHIUJzDaQGm9GFeZlyFPxaUhv6xgiAq2x8xG6wFhec7ZZjCl6W4HUizbgRD2j1OdaViMeknOOUrb2fPexyifsrk_1LDHzl87E5WWgognSt893b-dhYDPWgQvjBB2KF1o-nQI98Kfd0f2jZWv5v06ieyToXM6rU-dnGfBjib94pvSRrxNj354SJZmI\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":9,"pt":"Apple contrata a expertos en automoción para un proyecto de \u0026quot;alto ...","fn":"Candy Apple Red 2.png","oh":512}
{"os":"89KB","cb":9,"is":"894\u0026nbsp;\u0026#215;\u0026nbsp;893","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJIg4W18BX-UQakgELELCMpwgaiAEKOggCEhSJCZgI4wykDeQNkwmrFd0VhQ2SCRogE-XrOo_18dHTpPXdxQlRRAZI-dc06KgOe1CCmdBgq2tgKSggDEhTRBrQdxxLTBrMd0AbSBqcCyBKhAhowgw67lS8TBT4fc4oVgXHvN6AV3nN9nyQm_19zML_1RXv_1NVU6hQZLsAlPEAXNUnTDLGDCHpXe1xmyzDNQ","sc":1,"isu":"solidwastemag.com","ow":894,"ity":"jpg","ct":3,"th":224,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJIg4W18BX-UQakgELELCMpwgaiAEKOggCEhSJCZgI4wykDeQNkwmrFd0VhQ2SCRogE-XrOo_18dHTpPXdxQlRRAZI-dc06KgOe1CCmdBgq2tgKSggDEhTRBrQdxxLTBrMd0AbSBqcCyBKhAhowgw67lS8TBT4fc4oVgXHvN6AV3nN9nyQm_19zML_1RXv_1NVU6hQZLsAlPEAXNUnTDLGDCHpXe1xmyzDNQ","id":"Ig4W18BX-UQMyM:","cr":15,"s":"New York City will reduce the amount of food waste sent to landfills by converting it into energy. In late December 2013, Deputy Mayor Cas Calloway ...","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSsFTJ1u4Ten29ImGQ_-8vYhT2v3PCvX3J1JB6U_eCWhpswe5Ci6g","md":"/search?tbs\u003dsbi:AMhZZivyMM8kSjRSC-4iKjYWQba5OLZuIBxQYU_1qToVVNDouQowRDMkPeBFfpqXcL3LYMdheDE0r0XBl6lIOniUC8RIGzBgGSOsr7rVxTjB3vOtFnDuvZIfjLu_1Km7oZtzQY9MQm0acJGtugNAf9tJ6QwL3-MK9-YaRspzO_1-sBPhbpzOgbOgQRRl_1GrnmuSXlFYNHbhUMvA6EcSs7EemmkxiiPOObEeeSzGXrvTHuC1F-5cmvMsfcPNHIVaWwCL9xHo2OVx8zw3jjlavrR0JwGPee6X5PgixjMzbiOLA9LUABO6fI3PtcCZLOY7PsFSX4aHdA51EVoteysr6R2UUxJDlQa0Y462kmaBVDCEetHAULzwqVzeMps\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":15,"pt":"Big Apple to heat homes with food waste - Solid Waste \u0026amp; Recycling ...","fn":"apple_by_grv422-d5554a4.jpg","oh":893}
{"os":"113KB","cb":12,"is":"2560\u0026nbsp;\u0026#215;\u0026nbsp;1600","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJiaeM5TDhdf4akAELELCMpwgahgEKOggCEhTDCZsPmg-1DK8VvQn6D5wMvQ-0DBogsahcAR-OQjOYNII6zAHx8idOaxCcKehJfYEyuZ-6B7oKSAgDEhLWAZQLyAHMATnpFeoVyQEk7AQaMA3KHcL44HhMYRi12X4Qq6k0_1KeWMqwRxnv3kE1gkI0jWsUx56M5prFkUIT3bvEjcgwhOyuFeaIkiZY","isu":"pcsitetube.com","ow":2560,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJiaeM5TDhdf4akAELELCMpwgahgEKOggCEhTDCZsPmg-1DK8VvQn6D5wMvQ-0DBogsahcAR-OQjOYNII6zAHx8idOaxCcKehJfYEyuZ-6B7oKSAgDEhLWAZQLyAHMATnpFeoVyQEk7AQaMA3KHcL44HhMYRi12X4Qq6k0_1KeWMqwRxnv3kE1gkI0jWsUx56M5prFkUIT3bvEjcgwhOyuFeaIkiZY","id":"iaeM5TDhdf5BXM:","cr":9,"s":"apple Apple: conferencia para desarrolladores","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTzh7ifK5XXTi0hgs56F82vxfLv5VApsIsiZD6_7hMNlowZ8StnaA","md":"/search?tbs\u003dsbi:AMhZZiuBINzYAUaiGe8DrnBX6VHXBbmsw6sVQKgh7GisfjDcHhhtHvPDzU34jj7UlFt3oQbFnOe3UmBgkKWCRgihS71FUzTHLAuOby1uFeQNtc1AtGOB1LZ3L7tkuemp6tjJZjlgbVcReazHTWZauGbt1KHPyT9QQXhifdLSsOFZ3qVlN_1FLXuuWMX0sN9m9pxAxwRPG6rmgNWl32wQo7zQ5sV66-vhh80QkjW7Mgvmph4gaW5qwL1c2s1dqnJFtBii5YbphUPs6zd6v2wFt0erWGwBf3debpG5ZgoZlQNogTxttxtmnpnn-g8FxJHi6axAiRHzdpfjDKQ3w5gSGDIWVIb3RtlGMnoJflYOTUuKq4SV7qyoRHRg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":9,"pt":"Apple: conferencia para desarrolladores - Pcsitetube","fn":"apple.jpg","oh":1600}
{"os":"146KB","is":"1271\u0026nbsp;\u0026#215;\u0026nbsp;1449","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJDj61pr482XQakQELELCMpwgahwEKOggCEhSJCZgI5A3jDL4NqxWICd0VjQmrDBogjOVdSH91fGv4nbFWQxbBe93amKHoSTJeBnYgZQoTpbUKSQgDEhO1ArMdxxK2Ap0KtB2cCrQCKP8IGjBQqblA4V8saR6v0vS6G2JG0UjTQhUplUnVY6o0z-BMtpWyc6-AdcpoKckvK5bjsXcMIb6RIhRbgtEO","sc":1,"isu":"nexusmods.com","ow":1271,"ity":"png","th":240,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJDj61pr482XQakQELELCMpwgahwEKOggCEhSJCZgI5A3jDL4NqxWICd0VjQmrDBogjOVdSH91fGv4nbFWQxbBe93amKHoSTJeBnYgZQoTpbUKSQgDEhO1ArMdxxK2Ap0KtB2cCrQCKP8IGjBQqblA4V8saR6v0vS6G2JG0UjTQhUplUnVY6o0z-BMtpWyc6-AdcpoKckvK5bjsXcMIb6RIhRbgtEO","id":"Dj61pr482XTd0M:","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTJFUg_ghQ0y5Aiy60_JDA-6lO86XYE5GiaH3eNuSrghubmltjy","s":"img 3 loading.. ...","md":"/search?tbs\u003dsbi:AMhZZivAP7gbUeXkyhjMoFcAiH3PvjTwesjR3fgn_1rELAFhj_1Srt4ErQZArsYrBZ3dJy3n4xvTxtd1tgGE6HgX27tDeMMTRmXtDYHFb3hqAiPiq-ib7x7faM2_1J8uRrI1ZGuYfFXOFWCKwhiVfyzSu36GUrKbaHvtvyi0rCjQCRxSkKfJOlJs_1btQ8hClmjLJdz13ky7fGyP5-ka3zrlPvUypcl0JiLaWG9VHDYNNehQ2cTCgTwXUdJVK7wnRoFmlJPAPH06pssdV7KajiHVZ_1edECnc4_1NzcC0Kskz7PITH2VFZoWNnb4bQ8qdmGsGalX39Rk1bobELR_1kmUFARPe9R5QxN8UydSV7oF_1OEJjXElInxpDVKf4M\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":210,"pt":"The Apple at Skyrim Nexus - mods and community","fn":"54693-1-1402169126.png","oh":1449}
{"os":"7.4MB","is":"3968\u0026nbsp;\u0026#215;\u0026nbsp;4496","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJrTI6opaq4cEakgELELCMpwgaiAEKOggCEhSLDasV3RWFDZkKkwnyDpcK3Q6SCRogRCCcfnz5k2r0-xzrnKxu4uwFwuzR7JCGEyBT5YOol78KSggDEhTRBscS0gbQBrQd0wahAaIBpwLrBhowl3JsVlH2dg0fc4r0DlMTVtVYoNolDiXGwrig22jikan1Vgznw7mRY4C7W80mLCLmDCHv5r5Tp7Rwhw","sc":1,"isu":"blog.loseit.com","ow":3968,"ity":"jpg","ct":3,"th":239,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJrTI6opaq4cEakgELELCMpwgaiAEKOggCEhSLDasV3RWFDZkKkwnyDpcK3Q6SCRogRCCcfnz5k2r0-xzrnKxu4uwFwuzR7JCGEyBT5YOol78KSggDEhTRBscS0gbQBrQd0wahAaIBpwLrBhowl3JsVlH2dg0fc4r0DlMTVtVYoNolDiXGwrig22jikan1Vgznw7mRY4C7W80mLCLmDCHv5r5Tp7Rwhw","id":"rTI6opaq4cHh-M:","cr":9,"s":"It\u0026#39;s no secret that apples offer a nutrient goldmine. Here are three ways that the nutrients in apples keep those doctors away and help keep your body ...","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQvqH1aYdncoxPWHtKwsHkmnTKs1wK_0VrwiCV8JdwME8nFNX1Kvg","md":"/search?tbs\u003dsbi:AMhZZiv6zr3gdqob4PGStWXclLcnl-WvgttNFPuFWzasgvAKbJPvlXsloOseUhF10KfGVLd4EWCalkUW0sNgF2Kne7dbkR1lDryIPa8GYr7sCEedGytUkoYXkkc7XXiH6KdJx2ENAmIm4xkaA97V-jS7c6wW9pjgrop6nKQiiwxL-7Selh6qsAogfGNV5hlP4xTM2E7D6RbK9sRB65PLYxQnfoNfPX9m6FXnc1H8Lkf4pWNTZ_143AXGTnyFPyDvDeu5X9LY1o1PgRyMUesNR73_1KZuX0Y0maYFga2QdcboN4tcMhihkKA-KPdu0HVOZu9ianEK-7PUh4mnKQd5JtP6cjfUUTRvi4DoQZSCtiOV9fRyv5YbXUqmw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":211,"cl":6,"pt":"The Apple: A Perfect Fruit for Weight Loss?","fn":"istock_000014459318_double.jpg","oh":4496}
{"os":"571KB","cb":3,"is":"1726\u0026nbsp;\u0026#215;\u0026nbsp;701","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSqwIJ-w6zb1Fsvk4algILELCMpwgajAIKOggCEhTcDN8M3QvmDNsMxxXWFNsLlAvMFRogIgh2lXNI3mbh0tEe1NWhW6JIW0Bj0RZo3gKqTi50mBsKSAgDEhLOEvEGzxK9AeYFHsIBrhKfEh0aMKw90W-q2KdQd3cYsy_1UPzBcgqPkUdRBwZMb3QQOvlg7YGmuCmDdIZA6-prgtYEHZwo6CAISFNwM3wzdC-YM2wzHFdYU2wuUC8wVGiAiCHaVc0jeZuHS0R7U1aFbokhbQGPRFmjeAqpOLnSYGwpICAMSEs4S8QbPEr0B5gUewgGuEp8SHRowrD3Rb6rYp1B3dxizL9Q_1MFyCo-RR1EHBkxvdBA6-WDtgaa4KYN0hkDr6muC1gQdnDCFN9Uqeu-k3kA","sc":1,"isu":"store.apple.com","ow":1726,"ity":"","ct":3,"th":143,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESqwIJ-w6zb1Fsvk4algILELCMpwgajAIKOggCEhTcDN8M3QvmDNsMxxXWFNsLlAvMFRogIgh2lXNI3mbh0tEe1NWhW6JIW0Bj0RZo3gKqTi50mBsKSAgDEhLOEvEGzxK9AeYFHsIBrhKfEh0aMKw90W-q2KdQd3cYsy_1UPzBcgqPkUdRBwZMb3QQOvlg7YGmuCmDdIZA6-prgtYEHZwo6CAISFNwM3wzdC-YM2wzHFdYU2wuUC8wVGiAiCHaVc0jeZuHS0R7U1aFbokhbQGPRFmjeAqpOLnSYGwpICAMSEs4S8QbPEr0B5gUewgGuEp8SHRowrD3Rb6rYp1B3dxizL9Q_1MFyCo-RR1EHBkxvdBA6-WDtgaa4KYN0hkDr6muC1gQdnDCFN9Uqeu-k3kA","id":"-w6zb1Fsvk6mQM:","s":"Compare iPad models","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcTzXqq0qY_SDijIMbH8ukitbu4t1zBvh-NmNhgJb_LpbPK65pSS3A","md":"/search?tbs\u003dsbi:AMhZZiuFGBRgQPFBACblJYMBVE5dF7a3hp0acFRNWxt5dyfpZC_12aEXgiIGNgTYoNO0GlcjfdP0ICJpCYMax17oU4lDsAhiDYtnERPgPyoakp2iIe28bmNfPsKDYkIBJo0c7rj8paSanJIqm7a2bJgQWyMbf_1oidRlVO7kxyJcX2GCMMWuJyVvB627_1RxR7Xt3bzeNpb8NPJT0Fxa0TnjomIXbiuwY5_12FzH3u_1AeYr_1O2PPu7vsyfuggZ5LvH47hqB1IqyHzusKL6lBW5aD-XIu2n5HR7EQxj1Cq41iCcTumhXyYdwCHdWxhNdMr2FQz_1g_1aNA2H8CiB319rRSExdAtQuXj7neD_1BV8NjPJSdplMBhsVn5UiAcWr-9ntns_1Jb7FdewHla2vxHuYyW0A00T8Hc6WMml_1LI-7_1Lu3fzKyN-CFvU97ZDt4sqSTM2VNjsp5MmJlWgU91PwreaAlsvErmTqeUd39rLfFvcB3fB_1TX3ZxqrqKQy6YmpS6MGmvMmw1JQrzbUqjjlugZ9UnuiYODsoAmapzHQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":353,"pt":"iPad - Shop iPad - Apple Store (","fn":"ipad-compare-lob-holiday-bb-2015","oh":701}
{"os":"866KB","cb":21,"is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJQbo2lWHQ6jUajwELELCMpwgahQEKOggCEhSKCdQhjwmdDLQMwAmECKUMsgyfDBogX2yKBN-IL8C8d4GUHlkUrF_1aIG-sBZ-8guc14YFV3HoKRwgDEhHPASmyAv8IR7MCKNgB1QG0AhowL0Th0_1LMCirxZpLNqqw58V-HFSolZM5P25irRB_1bhi5y5S0NYwHm0yCY4yb-1qNxDCF5ftRLvLhLVA","isu":"hdw.eweb4.com","ow":1920,"ity":"jpg","ct":21,"th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJQbo2lWHQ6jUajwELELCMpwgahQEKOggCEhSKCdQhjwmdDLQMwAmECKUMsgyfDBogX2yKBN-IL8C8d4GUHlkUrF_1aIG-sBZ-8guc14YFV3HoKRwgDEhHPASmyAv8IR7MCKNgB1QG0AhowL0Th0_1LMCirxZpLNqqw58V-HFSolZM5P25irRB_1bhi5y5S0NYwHm0yCY4yb-1qNxDCF5ftRLvLhLVA","id":"Qbo2lWHQ6jX9yM:","cr":21,"s":"1920 x 1200 - 866k - jpg 2926 Apple ...","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSPjPjdbGqt07-RGFAL0GHck5nPPwMnMI8pgFCxMYxlDiEBwhsKQQ","md":"/search?tbs\u003dsbi:AMhZZitJ5AbHiKq1cJL1V4m2IFSzJ8sHxzKjrj7n185cOoMbJNR1BdSGJ6nr9n2O5geKchP1eMZdIiMivI5qPGh_1vLsz_17fmXIOOqBm04MteQ5lYEEzOSA37-zp5dRJ9inSzdBRqbjix_1BfewQiQplCpwGtHsGfg1hirLD57X_1KrgFvn75Vpq2ohpOO7K6zYExltZrN-xeOpDnGZSsUVJCYBySMvRRcA_13x2nP8TV0NrV1qU-tVN1ZNIjCABm_1kuso7qYhUYAAWOOqBMJpVjPatf-CzxdsVtcxUeMYZYhs6xlRRE1-L1GllAKVGo_1tjvlH4rYCqMtbkhTDZCLG6iPjAr4SjlX1dItw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":21,"pt":"Apple Mac Wallpapers - Full HD wallpaper search","fn":"Apple-on-the-red.jpg","oh":1200}
{"os":"592KB","is":"1212\u0026nbsp;\u0026#215;\u0026nbsp;592","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ_16MwA_1IQQvwakgELELCMpwgaiAEKOggCEhTBG8IbwyG8IPga6xOKJbwbihCtChogJvFzLNgwo1zTGncc8mML3TxaG37vaNwF070dxwuKcsMKSggDEhS-CsIKvwqLFbANrw2FFYYV-h-KFRowtAIEDiG6iJzf0DR3f1Tz7_1w1nPPpZ62FJU_1zOEBMLf4ahsCLwkgz5AGGg_1sHkoLsDCEZnhd_16OOiFA","isu":"apple.com","ow":1212,"ity":"jpg","th":157,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ_16MwA_1IQQvwakgELELCMpwgaiAEKOggCEhTBG8IbwyG8IPga6xOKJbwbihCtChogJvFzLNgwo1zTGncc8mML3TxaG37vaNwF070dxwuKcsMKSggDEhS-CsIKvwqLFbANrw2FFYYV-h-KFRowtAIEDiG6iJzf0DR3f1Tz7_1w1nPPpZ62FJU_1zOEBMLf4ahsCLwkgz5AGGg_1sHkoLsDCEZnhd_16OOiFA","id":"_6MwA_IQQvx-TM:","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQr3PMkInhylRv6S7V6vKyJDzUA1I3oL6niah8IBR47CIJGQRl4","s":"Image of Santa Monica Apple Store","md":"/search?tbs\u003dsbi:AMhZZisy0A6MC4a4OpNheGaFR3yKrSaidWzJDjZIrvcgeke9KZXfnda_1wYGjchTqkvTw5B0jOD8ywfIn1acJ6dw3QM6g_1r0ZyZAaDwmIUkJgVZ5sTOlF7EpjTNKxKNLR6k8EQ--KB7-Qyh_1sBuVDAIkrElPJJUVJdJUR-uSKPy6_11lFaRBNnlCDCmt3cj8RMYohAM2BJCBrZw65GHfLsOsXxdPxZvQp8JJuuhWFUJXSkwT8VyXUyTJUHsxZliaQT8AeHfJ2F5SvJ43zPwgjRhSA9zZYW1B7fFl8sLCnaAX3B7AzP4keLYIAg_1FVLVZ9VHG0cYAB5EHYCLnWxfFlf2PIJ_1boglL5IDiFF3TzCBVAwmdgITTeW00M\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":321,"cl":6,"pt":"Apple - Jobs at Apple - Retail (us)","fn":"hero_retail_store_santamonica.jpg","oh":592}
{"os":"368KB","is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJjEqQobA_1yUcajwELELCMpwgahQEKOggCEhTZCb8IuQibCMAIzgmjCLIM3AndCRogqzoaYZ1AsFsTKEHNIhy931DlWNpX6Pv8Q94UiMJVgQkKRwgDEhHUAUGXBjfXAdoBONwB1QGWBhowmhhTdvRc--cptMZAP0kNmmycSjR8TNqggmkBTmDA9T0hynQLoznTVpJ2VLCJSTnJDCGWbax-OZz0FQ","isu":"tntnphotos.com","ow":1920,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJjEqQobA_1yUcajwELELCMpwgahQEKOggCEhTZCb8IuQibCMAIzgmjCLIM3AndCRogqzoaYZ1AsFsTKEHNIhy931DlWNpX6Pv8Q94UiMJVgQkKRwgDEhHUAUGXBjfXAdoBONwB1QGWBhowmhhTdvRc--cptMZAP0kNmmycSjR8TNqggmkBTmDA9T0hynQLoznTVpJ2VLCJSTnJDCGWbax-OZz0FQ","id":"jEqQobA_yUdkkM:","cr":12,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTsANgxAIPKKUgxgL6FIBG-k1g7RLiakILS0trv8h8-htU8TLa2_A","s":"Checkers Apple Logo","md":"/search?tbs\u003dsbi:AMhZZit7ePFwkx751nk85_1x98lLqzTMxKP4vKGMOq0SCYYcgABNF7uZzh9M-MGzEdt7HLjqVbR-Pd1XNm0TQwoawpQttX9K5iJEBAuS0v_1GNP38zKToMfsa4jfrX4c2OVB259QwFy6jYMpImgyvZVMQ0E2i7MtFyrA-GrnifaZnvu99Vut2Kxej_10V2RAdMvHY5DI9KzeDI3UbTSawnuPSX0dovXGc8QETXqaVfGO92iClaSEJgwHZKI0LgMXE2bxnsSwSvZ0g71JsgL5UiojzZNC-RIYqhwdcQLAlMYB_1O8F5R7nQBj1jraug7lPmFIHBWGWK8IA2myrUPBclicz5roDo7EuCtlMg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":12,"pt":"tntn photos Checkers Apple Logo | tntn photos","fn":"1488098.jpg","oh":1200}
{"os":"34KB","is":"640\u0026nbsp;\u0026#215;\u0026nbsp;360","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJeedRwERxVIoakgELELCMpwgaiAEKOggCEhTWIZobrhSND8UUjhm1FLQVwhSDGRogAKa4ieosXndcD48Jec6VYuC4hFEXl-9x5Q4uz6-P0dwKSggDEhSSBuwFghKYEoUGhgaXEu0FhAaTBhowYwzviCP67Wv2C9mF5hdamQzRyuwGSIgb6Biv5_1XAYKMOIj2cZx2XMzlVZjCizoZYDCEOtU6wGM2wGw","isu":"cnn.com","ow":640,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJeedRwERxVIoakgELELCMpwgaiAEKOggCEhTWIZobrhSND8UUjhm1FLQVwhSDGRogAKa4ieosXndcD48Jec6VYuC4hFEXl-9x5Q4uz6-P0dwKSggDEhSSBuwFghKYEoUGhgaXEu0FhAaTBhowYwzviCP67Wv2C9mF5hdamQzRyuwGSIgb6Biv5_1XAYKMOIj2cZx2XMzlVZjCizoZYDCEOtU6wGM2wGw","id":"eedRwERxVIo53M:","cr":12,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcSvX0cLXNdbFJrrYzJBPbu7poXJp0jgyII_QtVrOMvsZpSd3a7aMw","s":"Apple is expected to roll out its entry in the field this week. Could it","md":"/search?tbs\u003dsbi:AMhZZivn00MjeXztSQ7zCSAZrNbf6yBUffTCxXUZACNKGogTY6uy7hCYYOtJgTbWG3DbjsFOx3r1PgCK9oz8wuOdxB6Z84XZ4kp-l7ai_1rmU6cpUKch7rx1J4hPKdMxenAM4mxSZOWsHbMU9SXtH5_1a6fY0I_16VF0-0HoFjVBu3KxzMggaSbFi4CShxlfQ8x2cGssN3bVBx2ogmtsfrGtxQffRBAJpxE_1kg7omdmOjcQS5n8n3UTUuxQj1qoSATU8Rt7HYhq12gePNxD09SetTmzRKwIBHr2igJKuAwDhLNTiAjsXoadEDPi70tCZ92O7Wh5A_1aZcMpuJsL_1A1-R7dRRg-e152Q4cruHqU7s_1WqxB75YRMqF3R4\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"pt":"Apple Watch: A wearables revolution? (Opinion) - CNN.","fn":"130905192139-apple-iwatch-concept-horizontal-gallery.jpg","oh":360}
{"os":"396KB","is":"1696\u0026nbsp;\u0026#215;\u0026nbsp;960","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJyzCoOM7RnFgakgELELCMpwgaiAEKOggCEhTSHa0VpxeqEbkftx-rEZkPpxGpERogZ67SGsKw3oM8nsy-22rNMrMSF1rFIXBPzytzyxlpnCEKSggDEhTKCLADrwPEAa4DqwOpA8kIoR6FDBowl2P39YpQBDo5qZ8_1L59VpTZmg3tSn0D7ylNmpHfDwONnFMln4BwHEG8UzJD-V_1KjDCE76bibfv2l1g","sc":1,"isu":"informabtl.com","ow":1696,"ity":"jpg","th":169,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJyzCoOM7RnFgakgELELCMpwgaiAEKOggCEhTSHa0VpxeqEbkftx-rEZkPpxGpERogZ67SGsKw3oM8nsy-22rNMrMSF1rFIXBPzytzyxlpnCEKSggDEhTKCLADrwPEAa4DqwOpA8kIoR6FDBowl2P39YpQBDo5qZ8_1L59VpTZmg3tSn0D7ylNmpHfDwONnFMln4BwHEG8UzJD-V_1KjDCE76bibfv2l1g","id":"yzCoOM7RnFgwgM:","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcS2ME5LtmRhSM-8SSepPYR3nL0Lk15KuaV8U1npRXXGFCFEIsNB","s":"Apple","md":"/search?tbs\u003dsbi:AMhZZivCHSgCC2IbFj6Ntb6UuO6D8FV0TU5IITc8mXINmFpRVro27tZf9NXWqro3ef5xcy5K_1KzKxTDbbXx9ql_1icPjOMq9sVOmJcSz5_1btuTUMJ5hnSvcwN1IB7x1Odnq5hBFKOL9ubvCBBd1SIMydJE9jMJGFwlDp1R4I2JczpGveYpNx3YMMICECBQZSqBN4r3IEZXFZ9INjdj-0q_1vSbdHXJ64jsHgr9hVI5zJhLVo-4OorxYpohyjxr3ltTHsuAbNMGZqm1H1jDjjuE19ZfqSTA5rzb0dE1w19DYPl1ruZiK-Ll1prXAqWvmrZ4LEFLl8c5J0L1VpYTD4u7gDUpW54fPUkvw1hBk7Jq2Gv5QVheHJzPnos\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":299,"pt":"Apple a la alza con excelentes ganancias alrededor del mundo ...","fn":"Apple-.jpg","oh":960}
{"os":"12KB","cb":3,"is":"640\u0026nbsp;\u0026#215;\u0026nbsp;400","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJlRjvS5GLds8ajwELELCMpwgahQEKOggCEhTPCcAIsQybCLIMwgndCb8IzgncDxog3u5WJZ-Y560DKJlrBUtpd4mYatLaNaK22LoG_1ZdQPSYKRwgDEhHVAUGWBkDYAdcBswKXBtQBRhow6oKg2_17Yesu9DKIHCe0I703LmbpHk4dn6plLRv-U1UJVVeSNSs24ZLV5wiCS6EhoDCHCXafrhVWGVw","sc":1,"isu":"atvglobal.com","ow":640,"ity":"jpg","ct":6,"th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJlRjvS5GLds8ajwELELCMpwgahQEKOggCEhTPCcAIsQybCLIMwgndCb8IzgncDxog3u5WJZ-Y560DKJlrBUtpd4mYatLaNaK22LoG_1ZdQPSYKRwgDEhHVAUGWBkDYAdcBswKXBtQBRhow6oKg2_17Yesu9DKIHCe0I703LmbpHk4dn6plLRv-U1UJVVeSNSs24ZLV5wiCS6EhoDCHCXafrhVWGVw","id":"lRjvS5GLds-cFM:","cr":21,"s":"apple1.jpg","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcTwYYV17TVqp0PknDza8FpF1uCuJVkixEkCcEXpoguOP8qW27YRXw","md":"/search?tbs\u003dsbi:AMhZZis4G68tg1KJi78plnKa-5rRX-UiedDr6gbrGsSU7TYuxrq9cGUilrs7wdvTIN6mbEbG90ENlku1MFCOxfb5PRysdRzO_1R7ufacD7iywz7CPM2LPy9GX7CmBDh-DpVMJyiIbKy27DSfxxUSI80-9OvYhtUvUpnMdBrgq9N16OPiqEds6c2eTTIeDnRE72LzqbxxPhFCMq4DymN_1p-c0n656upipDwBdmTA1fBkHpdBe21PKHm6jABactqlLLjds3dYzhTZ097Od0jh26BBam_1EX-lhRMY1mOYGLGzcGc-B_1WvidU60cFNhK9AZDioXzM2k1-DllMIcn_1T2lwB4pYKZwfjcTUmg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":21,"pt":"Apple iphone five and Its FunctionsATV GLOBAL | ATV GLOBAL","fn":"apple1.jpg","oh":400}
{"os":"67KB","cb":6,"is":"900\u0026nbsp;\u0026#215;\u0026nbsp;360","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJDouPfB6WnkQajwELELCMpwgahQEKOggCEhTGDOEW8QruCvIKghCBEN0MygyAEBogTeFM1vMLngUDhwMq7CoWylCfJRBZfgoAQABMxbs2Dd8KRwgDEhEgHzWwBvITkAKRApQEnAyZDBowRR4Yw-wHT15Sq2XHTQD4-SgcEOz4QycPDutiBG6Q73MMlMDLfflOvTDC9lVKGDsIDCFtYKZ5uMftvg","sc":1,"isu":"apple.com","ow":900,"ity":"jpg","ct":6,"th":142,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJDouPfB6WnkQajwELELCMpwgahQEKOggCEhTGDOEW8QruCvIKghCBEN0MygyAEBogTeFM1vMLngUDhwMq7CoWylCfJRBZfgoAQABMxbs2Dd8KRwgDEhEgHzWwBvITkAKRApQEnAyZDBowRR4Yw-wHT15Sq2XHTQD4-SgcEOz4QycPDutiBG6Q73MMlMDLfflOvTDC9lVKGDsIDCFtYKZ5uMftvg","id":"DouPfB6WnkQAJM:","cr":18,"s":"Apple procurement family","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQ5qdbzidGCstyQhbrYkKc-F9yD4BSSzJ6y8eZfpKiaiQa2m5cT","md":"/search?tbs\u003dsbi:AMhZZiuTvNXZI7qOa33WRvJT4XOzbvBmokOXAFzKNejl25yOvnd5kG9oCKGX6l0A6_1_1Xgruhoqc4eGo5vjau32UuwJMwHIO313i1t_1KtgpSwdBcizjvlZ5lUGka8g2WThKxxKa1dTL_1jUG1jlWzVt3Vt4F5s_1V6vVripl2okMozUPdyLwZYmQrETRpBhxsKKxzEedQje4GCaAsD6CTajF5wPTSYe6T-RFztjS1x5asboBCci2boyqPpEmOpt7lSJrfu891nbgoLVMqKSJ1Rm6HkQbCGkD3Z2heHi-MdTKj1E4hhP-33_1mqfVv-tc9HssSYUAC9ljZxadLaElwC3wDGAkJNfl50sFJQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":355,"cl":18,"pt":"Apple - Apple and Procurement","fn":"hero20120508.jpg","oh":360}
{"os":"107KB","is":"1280\u0026nbsp;\u0026#215;\u0026nbsp;720","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ5thaTCNCfnIakgELELCMpwgaiAEKOggCEhSMFYgVzAvJCOAn-BSKFaQO9xSRFhoggze1psH3sE0-C_1S17nqSEVgC-T5NGF1_16M7evdNjSgsKSggDEhTsEq8HhgelBocHuxKeAqkHvBKdEhowLz6kfNR21yaMvaWv73_1xblwPGggLk4csgm9HtqF0VU6koHq57aNCqocD_1XCiZi5wDCGBZd9ZcDJQqQ","isu":"cultofmac.com","ow":1280,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ5thaTCNCfnIakgELELCMpwgaiAEKOggCEhSMFYgVzAvJCOAn-BSKFaQO9xSRFhoggze1psH3sE0-C_1S17nqSEVgC-T5NGF1_16M7evdNjSgsKSggDEhTsEq8HhgelBocHuxKeAqkHvBKdEhowLz6kfNR21yaMvaWv73_1xblwPGggLk4csgm9HtqF0VU6koHq57aNCqocD_1XCiZi5wDCGBZd9ZcDJQqQ","id":"5thaTCNCfnLgpM:","cr":12,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcRwBE1g_ZDN5fVU30fpREUlmGYH5UuK7Gx54UObXvXXkmjDEzo0","s":"Eddy Cue thinks 2014 will be the best product pipeline Apple\u0026#39;s had in 25 years, and according to the company\u0026#39;s latest filings with the Securities and ...","md":"/search?tbs\u003dsbi:AMhZZivkouumDoRHXH1EUn3ht8LXlmgzhLRUwPsVrEJ9-OhiawzOQt5dqaLJ5MHs6sCf-NaP08vjtyNUdUU2lUnA7nEaDfBCrgc7lG5CsQrYS2Iqlcn9BfjPqsg1NM280iFf1RJqK-hwLOaUl7n_1UV-tooyuEi6L_1raresp2fhrgoPam9150PhWjg6ggbVrB0vbrtKQU81LSx335KNjtyObjQhXYRqJGHyEEb1ie_1ofnmyKPeDC9nln_1YZbULEiZrbH1iubrCTYbcDA_1rWIshmLLl-Iogb9kbsbb847w6cu-UzfuXmO3QNhcjKxHK9C8nfm-pn6a2BnfVD93LD6d-nVK3wuV92--ahUsWdYTZkvB8sDF-CiNHZk\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":12,"pt":"Apple\u0026#39;s $425 million spike in R\u0026amp;D spending points to new products ...","fn":"apple-money-aktie.jpg","oh":720}
{"os":"247KB","is":"1920\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJoAjV5or40SoakQELELCMpwgahwEKOggCEhSfFbQMvQmdDLYP1CGcDKAVignGCRognO48D789bFbUTIEO9LUNwwjgamEmxObqdO0DP4HxGccKSQgDEhO3A7gDuwP4COAI4gjfCGGJCcIBGjBx9ISTj2wwA8UHQnL7RxppMtmRt4V9xJX1OBxEr5RmPiXClhs08CYQVcx03VN6cGcMIQ9juPfT8CC0","sc":1,"isu":"taringa.net","ow":1920,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJoAjV5or40SoakQELELCMpwgahwEKOggCEhSfFbQMvQmdDLYP1CGcDKAVignGCRognO48D789bFbUTIEO9LUNwwjgamEmxObqdO0DP4HxGccKSQgDEhO3A7gDuwP4COAI4gjfCGGJCcIBGjBx9ISTj2wwA8UHQnL7RxppMtmRt4V9xJX1OBxEr5RmPiXClhs08CYQVcx03VN6cGcMIQ9juPfT8CC0","id":"oAjV5or40SovPM:","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcQ5z8QAX11OW6N-fYznvVeXqualMcsm7f4jX9l8JxaoLlwUQlY4Eg","s":"apple","md":"/search?tbs\u003dsbi:AMhZZissWnKr_1G6OzAerSEWVlckCK1wPAQ1vktbkkWy7CCdHpKy3Vtk4L6rS4x0TGsWdQy-0GDKLrqNTYYLOMe8RqvPBkv_15U2CQ0k4yp4bIRJKE4FPHDVZ540MSCeLgw1pehk-Wh68CtOfl6prhLe7Hif3i5Yw7K8fyoNIx7UfspplTC4GOm-M1YupqE5UHmN2etp-vwym6Z43BXrj7Nk0z_14umefjf3G44MCw1BNrJ_114681ja6uwexgLj434M2WffRV2m080TcefCtVvMZXf_1fKPh-tVliH5Me6f4Rb23S1JQpTQxYKcWfE6R8A-c-n2B5b7YIW6HRW7CwGQL55IXQN8IrH8o6DRtCnGqcwRdW99J9EV7Cko\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"pt":"Acusan a Apple de mentir sobre almacenamiento de sus product ...","fn":"rainbowapple1920x1200.jpg","oh":1200}
{"os":"60KB","cb":21,"is":"1680\u0026nbsp;\u0026#215;\u0026nbsp;1050","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJtnVkJGAThYMajwELELCMpwgahQEKOggCEhTOCdkJvwjACLIMmwjcCcIJxA-5CBogR1hWJJ2o2BtdNo5n5b0XgCuYOiaCbXL9Jcs9smSXgfUKRwgDEhHVAdwBsQyWBjhB1wHUATesGRowilO2yPQo9_1q8RMU2mFGbfCyYwpFABtZjqpsE7hVylrV0VUuy9jr_19c5VpQJlgrjRDCG2Xbmi-wS5UA","isu":"wallpaperput.com","ow":1680,"ity":"jpg","th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJtnVkJGAThYMajwELELCMpwgahQEKOggCEhTOCdkJvwjACLIMmwjcCcIJxA-5CBogR1hWJJ2o2BtdNo5n5b0XgCuYOiaCbXL9Jcs9smSXgfUKRwgDEhHVAdwBsQyWBjhB1wHUATesGRowilO2yPQo9_1q8RMU2mFGbfCyYwpFABtZjqpsE7hVylrV0VUuy9jr_19c5VpQJlgrjRDCG2Xbmi-wS5UA","id":"tnVkJGAThYM2wM:","cr":21,"s":"apple logo HD wallpaper Wallpaper","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQXKJjNofa5JyUz_YB2kz0-GGRbiqyFbJ296VyDED2q43dVnqxc","md":"/search?tbs\u003dsbi:AMhZZitWQ7-ftM0eByc8q0gQyfhXwTebwTWCS8jNrvPdvD4B6Kwi4fUGFvzhIz_1gGLh_12vJPjkEgFn7F07U4s7tbGIaZa051oWNz7edFrd900VQfG7Q7oSvjFo3z6vgnSAL7HMREaqdb2-ney9945Ljr1Wrwt3xIAdU4gmr0J1ZvRS2fmWSdHu30JwhO5oGjSIUz57uruwXgoTm10i288V1hIwiodX868LEZ6_1Y-m62I6W18VYyjWAbnI64wL8pQjjBHKOTGzNomPhwA4wvz86Q7nh5ODybJ8ccg-yTFIJU5YDZZaDRNag7H1J351u5SjOBU60tvDOa29kdhMBKRObeRidne_1JtTgw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":21,"pt":"Apple Logo HD Wallpaper #1423 Wallpaper computer | best website ...","fn":"apple-logo-HD-wallpaper.jpg","oh":1050}
{"os":"203KB","cb":3,"is":"1024\u0026nbsp;\u0026#215;\u0026nbsp;768","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJB9AGgRe4UvoakQELELCMpwgahwEKOggCEhTJE7UKoA_1gGZkPyxOsCrcfwhOOExog9B6wfoJwkY3oZQ88RXqiq_1qSZEwh-xvfO6xdsEr-d-cKSQgDEhPxC5gXmReWF_1IWYoMM8Rb3FvALGjDJcLJJ_1WAB5wXsMqfRIlwmm1sktMP7WtIVUi1O76XYQVb18b2m0DHaIRUjr8pwH3AMIW7r_1CnMCycU","isu":"taringa.net","ow":1024,"ity":"jpg","th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJB9AGgRe4UvoakQELELCMpwgahwEKOggCEhTJE7UKoA_1gGZkPyxOsCrcfwhOOExog9B6wfoJwkY3oZQ88RXqiq_1qSZEwh-xvfO6xdsEr-d-cKSQgDEhPxC5gXmReWF_1IWYoMM8Rb3FvALGjDJcLJJ_1WAB5wXsMqfRIlwmm1sktMP7WtIVUi1O76XYQVb18b2m0DHaIRUjr8pwH3AMIW7r_1CnMCycU","id":"B9AGgRe4UvpFEM:","cr":15,"s":"para","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQI8S4w92eL_LKrAgoiG1KhCWuY8prGvabO7v7sxIM4eU8KLcUs","md":"/search?tbs\u003dsbi:AMhZZitBqJ3RzsjadQ6lBZDB41WMV1lTtwT8-z8GXZja7ov8ybSYAIYcqMTGP7BA79ayO_1Rna4J9ZF1SEbS5qzOEOoaIlc8-ZrhXZ8nIee90T9KCA05SwS9XtPyEhN0odswAZWgjX8tHd-ty5-HwwrSqKVxcA-PnDnLgsVETk_123TUe8ldlZiSXbKl54aafW-9dqwperurCgiun1UlApH1LI7aQjdSVdyLUvWHMqNEC8ZC8tFq4v6p9hi5hGlXfbNhdkPJAkiJvzR6fqnfV9dR33riTd5dVXnTVueS4WieMKECumkA7jP7gCzJzOb0m7ejgQ4_1viLYSA2cLTaF1OMejnSX-BDAOfUccIxwoI2XcMp9vFzrpg5Wc\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"cl":12,"pt":"Wallpapers y fotos de Apple - Taringa!","fn":"77_apple_computers_freedesktopwallpaper_l.jpg","oh":768}
{"os":"137KB","cb":6,"is":"1024\u0026nbsp;\u0026#215;\u0026nbsp;1024","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJdvJk3P1TSzoakAELELCMpwgahgEKOggCEhSVCsgJ3A-nEqURwBG7D78RvA-KCRog4VO3Cf_1-JzRAaBUIMMHy7kYGT52pKEZHID_1_1sGySWSYKSAgDEhLDDvELtA4p8Astrw6xDokL-QsaMBY2qOb52Az38uh0RLAtF2WcWzTgU64y07-5QzY_1n7WlgtA8yUPwJCqleoJwFHEVtwwhKuSPqDsf5-M","isu":"taringa.net","ow":1024,"ity":"jpg","ct":21,"th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJdvJk3P1TSzoakAELELCMpwgahgEKOggCEhSVCsgJ3A-nEqURwBG7D78RvA-KCRog4VO3Cf_1-JzRAaBUIMMHy7kYGT52pKEZHID_1_1sGySWSYKSAgDEhLDDvELtA4p8Astrw6xDokL-QsaMBY2qOb52Az38uh0RLAtF2WcWzTgU64y07-5QzY_1n7WlgtA8yUPwJCqleoJwFHEVtwwhKuSPqDsf5-M","id":"dvJk3P1TSzqlRM:","cr":15,"s":"Apple \u2013 $98.3 mil millones (\u20ac72.6 mil millones)","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSszFt07hpaF-sfTeE0CvQQqe1RM-2AwFxCsrU3QSqNcADwbQzYMg","md":"/search?tbs\u003dsbi:AMhZZitqv0AGtud2pEcuXcrqbodoxG2unznLj92ZTA5dsRH2LUe_1bLhBMowGa9zX1TTHZnM-CVVtOWGib1b2OHCpJDcff55A_1Dg82c9glQedfRc93qGvLXem3gxus4YBSlCJf1FRlodQ5bjKyFhb3sv8WzaVQyFIU2b0ZgS-08j48bcYbDn1UHRpcuCU0ADlh9cxKFyIr0hwWgzRk4H4v4I8MMFgmuJ6NE6w2-vwoX15GSOzg01n38kpURlvkctlXCD3h5lbH7L1l9eqTf-uMeBmkNujzkWn44zK2tCjq0qr8srfw4g9O04cNq2QMlV9_1nWw_1HnnD-Km3ihZwszi0eXrQkt8SsQOBg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":12,"pt":"Apple le gana a coca cola. - Taringa!","fn":"apple-power-logo-wallpaper-ipad.jpg","oh":1024}
{"os":"349KB","cb":6,"is":"1600\u0026nbsp;\u0026#215;\u0026nbsp;1200","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJk4d4PYzD2jMakQELELCMpwgahwEKOggCEhSrFYsNqAyZCt0VjA2XCoUNiQm8ERogPLIQa1H-YZjYTlmgMleqjJwjt6v11krkzGzGMiUTFksKSQgDEhOiAdIG0QYM0wbHEtkG2AahAbQdGjAUykq0P_1d6P5EmKbl4Cmp1dTboCJ2GUR_1fuJzfyCOAnBULRdszCdFxl_1PGGHIDIOYMIdy7roF83hZn","sc":1,"isu":"hype.my","ow":1600,"ity":"jpg","ct":15,"th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJk4d4PYzD2jMakQELELCMpwgahwEKOggCEhSrFYsNqAyZCt0VjA2XCoUNiQm8ERogPLIQa1H-YZjYTlmgMleqjJwjt6v11krkzGzGMiUTFksKSQgDEhOiAdIG0QYM0wbHEtkG2AahAbQdGjAUykq0P_1d6P5EmKbl4Cmp1dTboCJ2GUR_1fuJzfyCOAnBULRdszCdFxl_1PGGHIDIOYMIdy7roF83hZn","id":"k4d4PYzD2jO8SM:","cr":3,"s":"US Gala Apples","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSwhbabSnDP0GugNQ92FAs38owSk4ZU6IhfnRMAfaMFG53czHYEVA","md":"/search?tbs\u003dsbi:AMhZZiuOdoKAXO8bmXke-ud76xtdWdvwNtOq-wsB5dWrjz2XZB9w2uZa_1QbdMQF715W3cF699anTjhuDiig9IU2hU8EYMbqMV3t-NIPJa2aM2MDwng2vk5H9oyS2Cx2H24LzuyH4q9yGFNi3lN_155J0W29LacTA49PVATgYzvGeiHtgHnqMG0QkpY2JF-h84ZOh6nKOOltO3fWpX2-MnJqAkh6kSWSDeN0grjU2wbKrcbLBP8US-ZakmkFw2n7QzVH1wcWuiQ_19h9m6sBYhnqwXrjBVOmaAyAjd-tMbHcTy1HXvXoj8YFUB6tfhK0AfRKRfc6Edr1m5eTfB3fsV8NV4z7F05jPNooi9QM6S9SLCuZNV3LSfzTeQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"cl":3,"pt":"US Gala \u0026amp; Granny Smith Apples Barred From Entering Malaysia | Hype.","fn":"US-Gala-Apples.jpg","oh":1200}
{"os":"27KB","is":"560\u0026nbsp;\u0026#215;\u0026nbsp;392","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJGHt9vuZTJeYakAELELCMpwgahgEKOggCEhTCCbQMrhXACLIMsQzOCdsPmQ-wDBogG2RIYN93i2_129LMTZ2uBYS8miwB5NiXTH91BUM63WgkKSAgDEhKpA8EDRsYDugK7Ar0B8wi1ByMaMJF1J_1vVQA8mPVHdUdeW_1q7OpIKrazb4M2KDRuPlmhXjRmd7Cl3HAxw4QPSENch8sgwhDFl0JU_1oTNw","sc":1,"isu":"theverge.com","ow":560,"ity":"jpg","th":188,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJGHt9vuZTJeYakAELELCMpwgahgEKOggCEhTCCbQMrhXACLIMsQzOCdsPmQ-wDBogG2RIYN93i2_129LMTZ2uBYS8miwB5NiXTH91BUM63WgkKSAgDEhKpA8EDRsYDugK7Ar0B8wi1ByMaMJF1J_1vVQA8mPVHdUdeW_1q7OpIKrazb4M2KDRuPlmhXjRmd7Cl3HAxw4QPSENch8sgwhDFl0JU_1oTNw","id":"GHt9vuZTJeancM:","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcRvn6Dyd59378tvAdSoJXHj-H3guBopcjGW6lIulP1xmrtPBPVDpQ","s":"560-apple-ipod-people","md":"/search?tbs\u003dsbi:AMhZZisRD9874jDxKRunyCjFkg_1PH9-ZNpQc325MJR4OVsDmUkOjIFk8q8PBsEOwoA6l8OixdXsVx0vD-NX5tm5syBRhIKAzB012BlmLwyTCCfiSy-qO4xjGi-_1qVrkVo0b6Y70j2D-FpUrqmasKppxjjNpazUU8g1ky0yWci5dgpEXpBqNrftzVJ5vsDZ3FGWEie1LGgbbZX-mMuljF7vycyaUgXibkaKfURpbrGN9OU03vQZl7Ksu2OzC21xLyKQx_1iymCGK-vFLW_1bjsVzc09itpjsO4bu-1uWQyQI2utcZQ8dg37Jql5OZTq1dZlr9mC00R1Glbp_1sNvUSdaiMbAEP7Duv3hKQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":268,"pt":"What if Apple bought Beats not for headphones, but wearables ...","fn":"560-apple-ipod-people.jpg","oh":392}
{"os":"58KB","is":"660\u0026nbsp;\u0026#215;\u0026nbsp;371","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJeuKLpMtlrwMakgELELCMpwgaiAEKOggCEhTEFNYL9ArXC44V9wuSC5YL3Av1FBogjNfm9Dx2JhiJnj5_173J3W8uOr0vbthqJZG3hzMaFzs0KSggDEhTtBb4GxQWxEr0G7AXJAuYFlxKwEhowaTgTYFPSU49AswQuBUNA1WQDEbE1KR3CDpgGpDfykGxKxm6UDdwmqb9ymBGTtgXoDCE2DVaW4cQyfA","isu":"qtooth.com","ow":660,"ity":"jpg","ct":6,"th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJeuKLpMtlrwMakgELELCMpwgaiAEKOggCEhTEFNYL9ArXC44V9wuSC5YL3Av1FBogjNfm9Dx2JhiJnj5_173J3W8uOr0vbthqJZG3hzMaFzs0KSggDEhTtBb4GxQWxEr0G7AXJAuYFlxKwEhowaTgTYFPSU49AswQuBUNA1WQDEbE1KR3CDpgGpDfykGxKxm6UDdwmqb9ymBGTtgXoDCE2DVaW4cQyfA","id":"euKLpMtlrwOUIM:","cr":12,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcS-j9zLhmR85Y2L4nTmz7VEeyZuh5Vxh9p5qkwI_SjlR4zskLhK","s":"Apple Applies to Trademark \u0026#39;iWatch\u0026#39; Name in Japan","md":"/search?tbs\u003dsbi:AMhZZivbKNrmZy6dOErDqWm7642A7IT8-EPcVBJquU7necwUhJ5XYBGAXeDepNzAo6XuMRi5G4dj_1jjrDDm6xCWDHqEGg2oratzWZDZBi9mElN4BG4hcBQL2uVMhYVUPwCTeawrKFE6gxX6FRrCyJizsj19snH6dQmabA0qnzf54vBAGiChAbA-lxVMMuH4png4AKc7zTNjdmokd_1yrkiznB3DejIZggYsdX-lvyS7Dm3UBYyJLhW7XkJoKMHh73Pr612ZZQ7LBunRxQKaH3jD50HiLbZy0LUZSKhXV-7b6qzQh2Oe9FUHdQutJ_1P1UTXCUpNVjj4mGyIPiN-c1vM24oks1peZija0U0WkvcKz8TyWb2CAfs5mE\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"pt":"Apple Archives - QTOOTH | Wireless Living","fn":"apple-iwatch-qtooth.jpg","oh":371}
{"os":"27KB","cb":21,"is":"800\u0026nbsp;\u0026#215;\u0026nbsp;450","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJ_117wY6xPq1cakQELELCMpwgahwEKOggCEhSECMAIiAi1CLIMnwzZCIwJwAmKCRogFDeYvjOy0IV7KgHZyRa9n18cEqyTdqCrygALsqhdMZIKSQgDEhPcAewFONoBlgHtBZcB2wHsAZcGGjCXblv8hqwGxfgKk22dWyHDKkLawUpC6op14Dqcrk0MohriPkknNuPQjhddSPKfA5oMIXrrgLKLCZE1","isu":"idownloadblog.com","ow":800,"ity":"jpg","ct":21,"th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJ_117wY6xPq1cakQELELCMpwgahwEKOggCEhSECMAIiAi1CLIMnwzZCIwJwAmKCRogFDeYvjOy0IV7KgHZyRa9n18cEqyTdqCrygALsqhdMZIKSQgDEhPcAewFONoBlgHtBZcB2wHsAZcGGjCXblv8hqwGxfgKk22dWyHDKkLawUpC6op14Dqcrk0MohriPkknNuPQjhddSPKfA5oMIXrrgLKLCZE1","id":"_17wY6xPq1cJJM:","cr":21,"s":"","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQergq0MEWd3HKEQ99wKzK6E9J_PH73IjgeN5azmRCEcAPBqYzt","md":"/search?tbs\u003dsbi:AMhZZitaLbQvW4MPon0q3hCCHyo_13gVuEoHTJWtKURpm6-oHSd8u0dwpUQXrNb85c2dttIFd-OKOUSuR40wOHs9kW5NhLRgxNWCaRBtrrOq8tUnJE1kMt3nazxaEiMdpc2GGIlyZQP_1KehALMd23DtWVzfgDMkLiTr-OOKasimPK-KbR9BJ-TP0y04b2GbAdJ-ilnsGqpq4RL6LHs0p7IHNuHcLQ0s3L5_1VlGw0fC8HynuFSIWQHmIdmt2L6hFbwrGRI-Smp51VPqxUkXNDmnmL5evyuJixDwqi82WP7nWa3ZbRlVoSA9yLcgTgAVSMgCOQouhxkNuoUTnBzaHDJL5TSsO3nGdcnR5qytCkX5NiylwduPdQ7Ez4\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":21,"pt":"FT: Apple to buy Beats Music for $3.2 billion","fn":"Apple-Beats.jpg","oh":450}
{"os":"24KB","is":"992\u0026nbsp;\u0026#215;\u0026nbsp;558","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpgEJeIyiEHvoslQakQELELCMpwgahwEKOggCEhSuDLoI3AmGGukKvxSAGr4I2w-WDRog9hZWlYrphm1KCSSiNuvVw5IUdYVBiovw9Fh5wkc7j7QKSQgDEhPbAdkBtQfcAZcB7QXoAcQOPuMFGjCifLbh72MRF-L67o_1_1j2RuAaPgWWbrpl9VmWW5VKiXKSGaNC_1jPD4w1UKb-2xwyVsMIedb7I0RD57G","isu":"abcnews.go.com","ow":992,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpgEJeIyiEHvoslQakQELELCMpwgahwEKOggCEhSuDLoI3AmGGukKvxSAGr4I2w-WDRog9hZWlYrphm1KCSSiNuvVw5IUdYVBiovw9Fh5wkc7j7QKSQgDEhPbAdkBtQfcAZcB7QXoAcQOPuMFGjCifLbh72MRF-L67o_1_1j2RuAaPgWWbrpl9VmWW5VKiXKSGaNC_1jPD4w1UKb-2xwyVsMIedb7I0RD57G","id":"eIyiEHvoslQSIM:","cr":12,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTvvMU-p7Udj0SmUczkFb0NtLX5LMWy2HcT_fjIzKxW3QwKiO7C","s":"PHOTO: iPad 5","md":"/search?tbs\u003dsbi:AMhZZitQLDF65LC8ggx9CqUZmSSzDVI6iplzjDMG9-dgN-iSm6NUHaI3dtxR5472fTI29YqTeLyb6ZbAHUtfIRWFFxRcD2xtjqxDT1QsZEtmSQ24ouWYdhmEWeSX9koKb9f9eWEDf96ORrTijUFdL3YxSNmophub1ak8bGayPFO-1iXqq_1Cd7Z3IE_1_1riwfQV9QwqDJsTknR1d4jL0P49MRrD9ZhGkhUNbQ7Ge3FEmQ9RYucH9w614rgYzZAkJRZTf-o8voT_14mxQK7dMbrvkXiU7FAlB3wIhTNtN_1Zyi0M8EyV2fNchHEwky10YNWdh5oEer2OXbLBfd8rDcGwiyvq2oE91fH3ROhw8Yl_1bZzyr90kDDvvYhKY\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":21,"pt":"New iPads: Release Date, Rumors and Everything Else You Need to ...","fn":"Apple-iPad-5-100_16x9_992.jpg","oh":558}
{"os":"69KB","cb":12,"is":"850\u0026nbsp;\u0026#215;\u0026nbsp;612","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJjMHYIenmykYakgELELCMpwgaiAEKOggCEhTaD9kZog_16Ga0Q4Rm_1GdEZkgr5GRogJAVaJ5eGIvhaRMT-gWReJOPS3vq5Kl5IN7llE5bkZc4KSggDEhSXF5YXgwy-DvcWmRfsBLAMuA6YFxowhVlNcfL02B08qvLfgFi7thMhuIRcrQkv0l8t-1_1_12Cn39x6MVYWqPBEd6-_1jyBMrDCEj8J8nHZb76w","isu":"digitaltrends.com","ow":850,"ity":"jpg","th":190,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJjMHYIenmykYakgELELCMpwgaiAEKOggCEhTaD9kZog_16Ga0Q4Rm_1GdEZkgr5GRogJAVaJ5eGIvhaRMT-gWReJOPS3vq5Kl5IN7llE5bkZc4KSggDEhSXF5YXgwy-DvcWmRfsBLAMuA6YFxowhVlNcfL02B08qvLfgFi7thMhuIRcrQkv0l8t-1_1_12Cn39x6MVYWqPBEd6-_1jyBMrDCEj8J8nHZb76w","id":"jMHYIenmykZ2QM:","cr":18,"s":"Apple wins big: Samsung violated Apple patents, must pay $1.05 billion in damages,","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQIjLdxVuO793TCO2z80CzcGEYBb9b6-XsFTmiAbBiSEG7u9NbL0w","md":"/search?tbs\u003dsbi:AMhZZitSMRa9npEwgVmZ64vT0B1IEusGttFg-9YlKmDy_1M_1HiViPg8a9C1k1x1Zq2wzT76VWX0-0_162EJQxqbCok8VUx9FLWmnvXB18cFvWv-UzSS8GdvTD7d911koOW6Zck8kLExU0Em1KyFMSlj2NKQyYBdxju07KiQl8zWH7UI6Q44_1-J4vaq6gvWQEItz95SB8NVLcytRO0CIIx7yf5ADNJy2tVCtjwR6y5IAJoifMRFkeChtYdXQ_1iirZmydGdPgqUKQ32HDjItRkc_1LIK5Z8DFA6-pthuS7HJXo8dbNkAcovYaIOCMIFA2Vla5f6GzyO3hA-O0Nf40bsSNRZ2UH-otM0M179ZMARPjhF1_1GzZ88XAZufI\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":265,"cl":6,"pt":"Jury Has Been Selected For Apple v. Samsung 2014 Court Fight ...","fn":"apple-vs-samsung.jpg","oh":612}
{"os":"48KB","is":"960\u0026nbsp;\u0026#215;\u0026nbsp;540","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJ7N6n1Qph2jQakgELELCMpwgaiAEKOggCEhSkDeMMkwmJCeYNkgmYCOIM4QyFDRogDq_1ePH381DjZUzyuMC-tw1Ut3Mt-g-wO9PDhdD5DLAIKSggDEhTRBrQdxxLTBsgSoQKnAtAG0gazHRowIsy5GxwRQeAeK1nA3RYwUTXX3PN7h2kiw-guMn_1DlUHYAvmRwIURl4E2SofHTzJSDCGQ8ohIz44J3Q","sc":1,"isu":"bbc.co.uk","ow":960,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJ7N6n1Qph2jQakgELELCMpwgaiAEKOggCEhSkDeMMkwmJCeYNkgmYCOIM4QyFDRogDq_1ePH381DjZUzyuMC-tw1Ut3Mt-g-wO9PDhdD5DLAIKSggDEhTRBrQdxxLTBsgSoQKnAtAG0gazHRowIsy5GxwRQeAeK1nA3RYwUTXX3PN7h2kiw-guMn_1DlUHYAvmRwIURl4E2SofHTzJSDCGQ8ohIz44J3Q","id":"7N6n1Qph2jSaXM:","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcTSF6WrkYZAaVw705zcKNrntjo7iQlJFKcLgtO6WOv7psHor1U_","s":"Nursery rhymes and songs: Five red apples","md":"/search?tbs\u003dsbi:AMhZZitkYHLnZaYOLDiudRkpXCPUf-lP1ZRYGrsiCtvQNsFD0QG0K4PpJltwpCdXjYP046cN1-zP9bk0SYwqDyz9wh_1c4tjg_1Y39M2XT4P9YKrN1wUF5WwqgQnF5DElHaRJJx9cV8m5HP9sk8ar04X9gNgptcSBTbhBz9HPH8y34FhCa4ZQtkh7HetwCUy40tYQkn2mx24p7_1kShPRDlWvUQG9_1tQzTDU64z8VwSaGKr8bdMKzcYaX_148ZQor_1O7mucAduBczkf-OIovbDywsquth7Hp47mRFVP3dnHLISGvQw6vjYLTFAf7zpRPtpN9SQwg6-FD-9wY7x9w4hJKshpq1UT9TgywJCor7PsdYwM6Nr4eEHwl8aw\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"pt":"BBC - School Radio - Nursery songs and rhymes - Nursery rhymes and ...","fn":"apple_960x540.jpg","oh":540}
{"os":"54KB","cb":9,"is":"1024\u0026nbsp;\u0026#215;\u0026nbsp;768","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJJTSdhMmeARkajwELELCMpwgahQEKOggCEhTwCbAQthCBCLUQowjTCZoIpAiGChogTEiZyIxogDbzvnAH7FjzQ3g1awN4R_1x6BqanNBbZx0UKRwgDEhHcAegB2gFBxw6WBj6xDDDVARowFuPavNuY9kh12VOidGYjUP6ECvT7vMLkmGkuTv_1QaiaIuE0zKDqI86QV4DuKAWLtDCHbg_1ibXdr5BQ","isu":"taringa.net","ow":1024,"ity":"jpg","ct":15,"th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJJTSdhMmeARkajwELELCMpwgahQEKOggCEhTwCbAQthCBCLUQowjTCZoIpAiGChogTEiZyIxogDbzvnAH7FjzQ3g1awN4R_1x6BqanNBbZx0UKRwgDEhHcAegB2gFBxw6WBj6xDDDVARowFuPavNuY9kh12VOidGYjUP6ECvT7vMLkmGkuTv_1QaiaIuE0zKDqI86QV4DuKAWLtDCHbg_1ibXdr5BQ","id":"JTSdhMmeARlxNM:","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTvzHjL51wnjO6hrfbA1ijQ-qBKNgDKdgvdbeGzSVtt8y8ShlBt","s":"¿Apple teme al resto de la competencia?","md":"/search?tbs\u003dsbi:AMhZZivuC9vTxFEQX7fq-QyBv9FcaU0KBzem9RQCWc7f_1P-BBqXxtwHNC_1YUjCbtru1QzOwzQrex4nq9n57SgKvlaqo_1tesYxyiPBA8YlHGUCzfHjHPnv-6jR2aF0ORkVzdKGCxf3BMxCorjYuBTxOhbnzz48dEFBoDbN-vrj9Ynl4ppNfa-wejzPaHocT35OefZLlOsnB7GZ_1H21g9KewOMTGaEjcyAGOho6CMwthEWGPTvK8M7I2-DZzxe4DaaX750lWO7NYar7HxJI2D_1RRRkp6ddVK7SyXbqJa8GC_1YMwO6EJ_1xiAz4NuHHZBRJWKWIfAkFy9OBzQdBgxcJNS3Bnz9aXK04mrg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"pt":"Apple teme al resto de la competencia? - Taringa!","fn":"Apple-Logo-wallpaper.jpg","oh":768}
{"os":"139KB","is":"720\u0026nbsp;\u0026#215;\u0026nbsp;720","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJGzVd4vgzFJAakgELELCMpwgaiAEKOggCEhSYCIkJ4wykDeQNiAmFDZMJ4QyrFRogaxqrPkJNKEhFMEyJNO924iwFKQdQWLOSihTWX-BuQoQKSggDEhSzHbUCxxK0HbYC6QbKEssS7AbrBhowkfwHaXZ3zWNTVtJR-p1TKQX5oNK65G9S9UAILmRJoTfyAulNVE05WAY-4EJ7t5UlDCHfTjjCLCe2Gw","sc":1,"isu":"applegazette.com","ow":720,"ity":"jpg","th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJGzVd4vgzFJAakgELELCMpwgaiAEKOggCEhSYCIkJ4wykDeQNiAmFDZMJ4QyrFRogaxqrPkJNKEhFMEyJNO924iwFKQdQWLOSihTWX-BuQoQKSggDEhSzHbUCxxK0HbYC6QbKEssS7AbrBhowkfwHaXZ3zWNTVtJR-p1TKQX5oNK65G9S9UAILmRJoTfyAulNVE05WAY-4EJ7t5UlDCHfTjjCLCe2Gw","id":"GzVd4vgzFJCrdM:","cr":9,"s":"It has appeared on the site as ...","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcQwCnAE8xbPzkn3RFlaf3wJMnNqJrRnd0q7dwZ2mi7teEXodD-A","md":"/search?tbs\u003dsbi:AMhZZiuAtPuDhZmgVtnVDXN5CNfC2PCnxIBbZEffSdocZsTTpOmfskkFSfEbUg9tWjFRTLCasHJojFE6YdxD_1epGlU-En_1o55pmEiWtoVdV8KRDx0KJpRSnhQk5mv4IcBGUbTz_1-dyxbT1R-l0uhSw3BE8Q0Daxf-TWPCk3JQfbdUCxo69RRFPyjO7gneWOVVtKNSDXrPzpJ719q_1j5hM7ILl6s1gaOSzj1lFnVHvEArBCsuFL9AiTXo_12eMYsEBsWQAUMy9LTFT4vQexpmZkcb4PlPoRE47a3ZC2nr5wAGKo66GvyQvBUt98rEYxbxd70ng1lKFsZZIOOVCty2FdiV_1Pamy4IVEkrkuVjGZeL13vax4SeDmxik\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":9,"pt":"A Visual History of the Apple Logo - Apple Gazette","fn":"apple_logo_red_wo_background.jpg","oh":720}
{"os":"232KB","cb":21,"is":"1023\u0026nbsp;\u0026#215;\u0026nbsp;643","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpAEJbueSXgGOc8kajwELELCMpwgahQEKOggCEhTACNkJsgy_1CJsIhAjCCc4JuQjPCRogtCFXVIIo06BBUQ8YtTZX5lAvJYsVtRI7MYNpn1Mw7wYKRwgDEhHVATjUAUHcAZcG1wGWBjfYARowKJGcrPDwNjN6C5NEnzvNZSmCTcNvPr9nqhv24VWYuCEWYUdy5rBX4iNKMynijQJ4DCGyQolkDneYTg","isu":"balearesuniversal.com","ow":1023,"ity":"png","ct":21,"th":178,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpAEJbueSXgGOc8kajwELELCMpwgahQEKOggCEhTACNkJsgy_1CJsIhAjCCc4JuQjPCRogtCFXVIIo06BBUQ8YtTZX5lAvJYsVtRI7MYNpn1Mw7wYKRwgDEhHVATjUAUHcAZcG1wGWBjfYARowKJGcrPDwNjN6C5NEnzvNZSmCTcNvPr9nqhv24VWYuCEWYUdy5rBX4iNKMynijQJ4DCGyQolkDneYTg","id":"bueSXgGOc8mP_M:","cr":21,"s":"Apple vuelve a ser demandada por inflar el precio del reproductor iPod tras bloquear a sus competidores","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSLPL-tFtV-FVNZidP6iNwYcWzVMVhxFHZ5hgkyKssXw1N2gY7z","md":"/search?tbs\u003dsbi:AMhZZiuiz9B6a-vtRlX93MKQGhIZCKs52NZGR-mxWONaQZa2yIaPfAc0hMsOXVXiQs9OY51O_1f8ZFa6qNv5CMyVt4VV7WmDbh86J7Bpj_18MFTawk-oMN83VCLxBLflDptbfx9EvC9ues4Q7Md0hWiSlHtWQV31ir6ONfo6RrjRI7OCCxfzdRUXbL73zatmG5yvdoBN2vpBDQ0M85Nr4O5z9Z9pjpKHCFWbx5Y45YlfjeHMznx4dlXR3XktiZq1IxLll89w1CChTzeXMSkZxm9xIG1ZtnM9Axsd9WEiItGfBc62cbLcqYvspw6NJPE_1eud9TXvwwh8YIgzDdtt5jJdFaNxSCNu1LSog\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":283,"cl":21,"pt":"Apple vuelve a ser demandada por inflar el precio del reproductor ...","fn":"apple.png","oh":643}
{"os":"37KB","cb":12,"is":"1136\u0026nbsp;\u0026#215;\u0026nbsp;782","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSowEJ6SPSfunRFysajgELELCMpwgahAEKOggCEhTdCbEMsAzPCc4JmwjACL0IwgnMCRogiWpXXh8umNvv2D3CI-h5Gy1FWwoidrZKCGpB1z4M7A0KRggDEhA5QEGwDJYGqBmXBrEMPecVGjCahbwG9mBzVTG_1vxbfhlY3axzdzVAHX5D_10UbzT0TM1aArwxuT2dChmEXmRzjZjhYMIW7r_1CnMCycU","isu":"taringa.net","ow":1136,"ity":"jpg","ct":6,"th":186,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESowEJ6SPSfunRFysajgELELCMpwgahAEKOggCEhTdCbEMsAzPCc4JmwjACL0IwgnMCRogiWpXXh8umNvv2D3CI-h5Gy1FWwoidrZKCGpB1z4M7A0KRggDEhA5QEGwDJYGqBmXBrEMPecVGjCahbwG9mBzVTG_1vxbfhlY3axzdzVAHX5D_10UbzT0TM1aArwxuT2dChmEXmRzjZjhYMIW7r_1CnMCycU","id":"6SPSfunRFyvEpM:","cr":18,"s":"apple","tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQfhZ5eq38hjts2Tbt2SiHQRhyj8BmIhbS4-idqhgeSmSyEX4Zamw","md":"/search?tbs\u003dsbi:AMhZZisZoF-3t0x2_1TpvaarF18kowu-EWeZrvzX8rS5ID8QJ1lurekcubDwAS0f4nTNfSv06P-Zj_1GrtDup_1-GJCc6djSM2kbTIYuAFP_1f6tT5LN6RgvbjvFd-dbGsQ7_1vq6lXH2lLK0YD3PAqeexykVrbiTdZjdC1bbwdSKwqNHeHv3y2u8OjJnR2EPbHQko_1GAjzl45eAIvfY6GLaVXx6DIYgOW5AkpdsQ05VNKdtgrZYCJ_16GAGLOcuMzcHyrqi9DgjxQ0NR4ZZFsDdgyr7FO41etBPsRKsxcXEggoecJuxwqQnLSqF0lLW_1LIZZ1fifPkezS7zEDV7COVf8Norjd0Q7o4a3oWQ\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":271,"cl":6,"pt":"Wallpapers y fotos de Apple - Taringa!","fn":"HomerApple.jpg","oh":782}
{"os":"243KB","cb":6,"is":"2048\u0026nbsp;\u0026#215;\u0026nbsp;1152","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJkKpoYx18U5cakgELELCMpwgaiAEKOggCEhSaD8MJtQyiD5wM-g-9CZUP-hqbDxogkWtFZz-yRRq6JrZ4rmT3CsEazglAF2LqaRbUjV6NwMYKSggDEhTMAekVlAvqFdYBmAusA_1gWyQHIARowXzHHgvhYf17oxNrCcJAroRbMEiNL_1aAmdfeoTV94brdOycHt42i7IXrnjPfWdyy3DCGY7UJPMXYAkw","isu":"queaprendemoshoy.com","ow":2048,"ity":"jpg","th":168,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJkKpoYx18U5cakgELELCMpwgaiAEKOggCEhSaD8MJtQyiD5wM-g-9CZUP-hqbDxogkWtFZz-yRRq6JrZ4rmT3CsEazglAF2LqaRbUjV6NwMYKSggDEhTMAekVlAvqFdYBmAusA_1gWyQHIARowXzHHgvhYf17oxNrCcJAroRbMEiNL_1aAmdfeoTV94brdOycHt42i7IXrnjPfWdyy3DCGY7UJPMXYAkw","id":"kKpoYx18U5e3IM:","cr":18,"s":"Apple vende Apple thumtop5aplicaiconesipad","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcS5KpzQS8uOneLSOpKbcPymaz478R3FNMrFLa0hnj_qXK93KAEsJQ","md":"/search?tbs\u003dsbi:AMhZZismx9vzD4SPhnbc9r5xdCGp1CidVZPeVBE_1Tt7vJF8enmPsygGTdvoP3OKRxXaNUwvEmPElpdn579ObmNvjsw4aeJl3klRu0AwRGjaUbexnN7hN7F58fLetIu6zi5bM5w1uv4UbVxDaxbuuGI8mg_1twILqZm3-2UG-vnRbVCccbjycjwzT4oN4xtVKIW8RmY22aqaImczSPehU4ojnvUYqjq6VkqrN1ynwTJ1NriFAREIjIkPvzBg7hxOH9L9M72LuXpBfKVABDYE2LupJY7zTh_1LlsbL96Y16BC6Bvhsb7EoafDk1tvsiGBlI2piewANxd0VrdYUvf_1hypSxDKMZHWYfo8lZqCM5HSE6HezO3zQsDVlQE\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":300,"cl":12,"pt":"Es Apple una burbuja ? | Qué Aprendemos Hoy","fn":"apple1.jpg","oh":1152}
{"os":"1.4MB","cb":15,"is":"2598\u0026nbsp;\u0026#215;\u0026nbsp;1949","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJRDtVwRFRtWIakgELELCMpwgaiAEKOggCEhTQFr0N_1xbcFv0W2BaCF4Mipg3uFBogI9XvM_1jbqw1lryUGnQSStyRltm_1FnEbwq3Y9ftFm1mkKSggDEhTlBqYU5AagEogKlAK6Bp8SpxSiChowg5zFg_1pdEjTJDr1HsIwFlQmLAp1-MeZQLvAislHhu-t2qXnGzrRp0t-sq0f_1MMPEDCE6H614YbEetw","sc":1,"isu":"impulsonews.net","ow":2598,"ity":"jpg","th":194,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJRDtVwRFRtWIakgELELCMpwgaiAEKOggCEhTQFr0N_1xbcFv0W2BaCF4Mipg3uFBogI9XvM_1jbqw1lryUGnQSStyRltm_1FnEbwq3Y9ftFm1mkKSggDEhTlBqYU5AagEogKlAK6Bp8SpxSiChowg5zFg_1pdEjTJDr1HsIwFlQmLAp1-MeZQLvAislHhu-t2qXnGzrRp0t-sq0f_1MMPEDCE6H614YbEetw","id":"RDtVwRFRtWK0yM:","cr":12,"s":"Apple y Samsung empataron como las dos compañías con más teléfonos enviados durante el último trimestre de 2014. Ambas compañías movieron 74.5 millones de ...","tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcRm5I3woZUBop0F0z-2URDzksz4uhd-1YUkH4MfZRwAKmQzDlP2","md":"/search?tbs\u003dsbi:AMhZZit3oQ5--Xtzqy0bnpnWL-n5Ge2OcGp_17kAP8V5fAQlfjGKm8WNK4yWzzOhlSA521e-76B8KjfC-ybfnuIWHvw0J5SJB3vbB9S6o5BE_1jGQGB3BpqzcRsUHci6eRy0n0tpK_1BRLwXqHQZ8j-D9eu8BMyvO3540n_1nsWJxDaxsFxAWDFJts2vPO99PML4QBcFiSMo_1Pi5QumstiraG_1OgvXSYnM8clgjgLq_1MMDz7c1ATx0_1MUeF7R03C4WkMBz92oVPglhENsfObBJcJMeHQZ1NYOGJK7th5E5NFfe0_1zmzi3qfzENdPMRNNrQKalV4Fb1aYrLEu_1R3SFUcpnvpLIH660CSo5bpwK5SDoo8DyrN1qxJsoDo\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":259,"cl":15,"pt":"LA COMPETENCIA TECNOLÓGICA Y ECONÓMICA DE APPLE Y SAMSUNG ...","fn":"apple-vs-samsung.jpg","oh":1949}
{"os":"1.8MB","is":"5000\u0026nbsp;\u0026#215;\u0026nbsp;5000","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJpINDPXjq2zsakgELELCMpwgaiAEKOggCEhSJCZgI5A3jDKsVvg3dFaQNkwnJCRogjBunFOL1LCw0kknVRTiW8Bu4hedwKmxC5HXAX3EqC7sKSggDEhSzHccStQK0HZ0KtgKcCtEG6wbKEhowiIoYvn9T5f_1LPW70Gg84oQnh1UKK9sAlrzkN30ht6HjVtqNNQVCDY6X-PznHq7N3DCGh79Ip9o1jAA","sc":1,"isu":"thefishbowlnetwork.com","ow":5000,"ity":"jpg","th":225,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJpINDPXjq2zsakgELELCMpwgaiAEKOggCEhSJCZgI5A3jDKsVvg3dFaQNkwnJCRogjBunFOL1LCw0kknVRTiW8Bu4hedwKmxC5HXAX3EqC7sKSggDEhSzHccStQK0HZ0KtgKcCtEG6wbKEhowiIoYvn9T5f_1LPW70Gg84oQnh1UKK9sAlrzkN30ht6HjVtqNNQVCDY6X-PznHq7N3DCGh79Ip9o1jAA","id":"pINDPXjq2ztFbM:","cr":3,"s":"Apple","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcTCu0VZ5i170_xB7l6hTkWpm6Jw5bEVDU3bXnWskrdtpfkBp_3vQw","md":"/search?tbs\u003dsbi:AMhZZivee0lSHL8zKfFE07_1GytkO3cukMjhQKwKWc23uqO571JyzDCVjS6E4xy4AG2gWmQfkDB2YCY3FtfT5732aN2n83kNKI_1qHQBffBS6PJeVlgCNhP8nTYoXL9Oe_1NoLsVPty7BlnNefciXIDHWnEQ5BTfP8t0TyOxI7UmhE85op9lcVmcEVPNfjyTB3rMKFjwHcJcT1AobWg9QJ113cN11N1D24_10dTsM8ZReaMm_1a7aKOw9QJY9rjFETafVADyFOHwU11xoWsT3x3Nug63TaY5Vnp3vtFVCTphsWCAhoovD8K21hmRphHrKPXyoyFQLK1DtRwYhomvprf7OWhkDxNhzQfpFt5qu4vnxKEg6qjiVAp06JKg\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":225,"cl":3,"pt":"apples | The Fishbowl Network","fn":"apple.jpg","oh":5000}
{"os":"326KB","cb":18,"is":"2250\u0026nbsp;\u0026#215;\u0026nbsp;2421","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJBIkXAdCZ7nMakgELELCMpwgaiAEKOggCEhSJCZMJ4wykDZgI4gzJCd0Org3kDRogADgVJ-_176lVFeNufpcyUmoDKluN5pbZW_1VWn59cKdLUKSggDEhS0HccS0QazHdMG6QbSBtAGoQLIEhowoeJQIfx3nNIecxSJjBKqiVIWrigmVgdT_191sq69bZzvYBqlNFSUwlF2GvKkkuK3kDCGiev-2Bz6mew","sc":1,"isu":"rosieschwartz.com","ow":2250,"ity":"jpg","ct":21,"th":233,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJBIkXAdCZ7nMakgELELCMpwgaiAEKOggCEhSJCZMJ4wykDZgI4gzJCd0Org3kDRogADgVJ-_176lVFeNufpcyUmoDKluN5pbZW_1VWn59cKdLUKSggDEhS0HccS0QazHdMG6QbSBtAGoQLIEhowoeJQIfx3nNIecxSJjBKqiVIWrigmVgdT_191sq69bZzvYBqlNFSUwlF2GvKkkuK3kDCGiev-2Bz6mew","id":"BIkXAdCZ7nMsYM:","cr":3,"s":"An easy-to-make baked apple dessert that\u0026#39;s yummy enough for company","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQ5GfCp4urNtrCeJenbWJ4OPlNyhB8SWOQRMW0-NgMCn1O3LElg","md":"/search?tbs\u003dsbi:AMhZZitFPvP3FQ3RRYRZIxUkmHp2CR_14AT0t7yeGODPHOma-akMvg8EcMpBrFeMewMlbbpgMgD4hCcYFOVk4i3IV3VXYPX-GY_1BoOnE2eym8rQ8gvMI9y_1rMK2sseoLmoVoft6Wf7Xmo8fKb8T3eDxoJl0yFevFRP7DJbflbwhFjOJjABMXFh5OYGHwDD9EgRGZO4i4cHToNQKPW4xedExinSz-X4yf-PewAX9ZAUOpgx0hHHhJSVbaaimRjAWFxjddJfgl4-lJ05fZmJU0_1ZvpNo-pjNvk1iBLTWIg4sOMLEVvxdJMmib0XeH-Ud3R9qwze2h13vz9HPQ7llnDCbSPAKDfblb5770FYcV8nSsfrrYXLOG62S84\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":216,"cl":6,"pt":"Top 5 reasons to eat apples | Enlightened Eater","fn":"ee-apples.jpg","oh":2421}
{"os":"8KB","cb":12,"is":"247\u0026nbsp;\u0026#215;\u0026nbsp;250","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpwEJrv-XyE-fqS4akgELELCMpwgaiAEKOggCEhSJCYUNqxXjDN0ViAmLDZgIkgmkDRogwD-k9qX_1b-HhR9ojLu9te7meQKEpLgyhTmEgOKN-xM0KSggDEhS0HccSnAGzHdEG0wbrBukGoQGiARowoO7vgh9RpS3u3EPSgQlvP1gR3vM6miyJQ7mcFSbqAWcYC_1ltxMlAXXr7lIMlsDnEDCEQHzvyE8OeAw","sc":1,"isu":"theproducemom.com","ow":247,"ity":"jpg","ct":12,"th":200,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpwEJrv-XyE-fqS4akgELELCMpwgaiAEKOggCEhSJCYUNqxXjDN0ViAmLDZgIkgmkDRogwD-k9qX_1b-HhR9ojLu9te7meQKEpLgyhTmEgOKN-xM0KSggDEhS0HccSnAGzHdEG0wbrBukGoQGiARowoO7vgh9RpS3u3EPSgQlvP1gR3vM6miyJQ7mcFSbqAWcYC_1ltxMlAXXr7lIMlsDnEDCEQHzvyE8OeAw","id":"rv-XyE-fqS7ehM:","cr":15,"s":"NOW \u2013 HOW DO I LIKE THEM APPLES?","tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcREUqWzBiIdAh7Po2YoUhwaMfVAI2fKqGmdGH5_GZvaLbOKd2_f","md":"/search?tbs\u003dsbi:AMhZZivLWjUjoFeFtDI2coeT2B5rCK8ui2Jhpli8uz1oBk_1AZ_1RmCsarTsR-gm8ctJEbkmiv7mnZ-fADrMW2enT8ECDoUDq_16zfJgafcTCtfNPpvxaFZiIFaLhkOfet1U8c3sqlHkmHlWJ1BmjaxgK0U8lC0XzAphQt5PAQ0GMDsrO99yN-gSYwGtTYcFhVo-yNtOwc1UbGDWxfvcEQCyRnXHlRxYckcI-I0wPVQye3tMzsECqLys-eGTZXAow-M4x6CE9ElRY6tOZvxDBicxmPNOs9eI4Izxmp8QTTInAqhZutGlueKXbzD4Gs8CJeciTJ39sCw7RWS3IxjGU6OxL9oESDTrmiHfBYL_1yPhY-2MXGMn1phrk6M\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":197,"cl":15,"pt":"Know Your Apple Varieties - The Produce Mom","fn":"Apple-fuji.jpg","oh":250}
{"os":"880KB","cb":18,"is":"2560\u0026nbsp;\u0026#215;\u0026nbsp;1600","msu":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAQSpQEJYLHgwSvN1YgakAELELCMpwgahgEKOggCEhSyDMMJtQzCCYQIwAmaD8AInQywCRog2jaQdZ-Q3lpOqxMHJXiMIUTDGWiJc7iTEe26Cl9d16oKSAgDEhI5I9YBzAHVAbAMmATJAdgBlAsaMKcnvm_1_1YM9XhaLExE8Rq7SujxLyOnFbmgr3ni10OSkgflVL7-Cwl_1xqSiNbw8eqcAwhbuv8KcwLJxQ","isu":"taringa.net","ow":2560,"ity":"jpg","ct":6,"th":177,"si":"/search?q\u003dapple\u0026sa\u003dX\u0026es_sm\u003d122\u0026biw\u003d1024\u0026bih\u003d719\u0026tbm\u003disch\u0026tbs\u003dsimg:CAESpQEJYLHgwSvN1YgakAELELCMpwgahgEKOggCEhSyDMMJtQzCCYQIwAmaD8AInQywCRog2jaQdZ-Q3lpOqxMHJXiMIUTDGWiJc7iTEe26Cl9d16oKSAgDEhI5I9YBzAHVAbAMmATJAdgBlAsaMKcnvm_1_1YM9XhaLExE8Rq7SujxLyOnFbmgr3ni10OSkgflVL7-Cwl_1xqSiNbw8eqcAwhbuv8KcwLJxQ","id":"YLHgwSvN1Yh_NM:","cr":9,"s":"descargar","tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSTYwRqBBevSP0i6NqfwZL7LXNovXIQH2T0kh2pozN3luSIwJOC","md":"/search?tbs\u003dsbi:AMhZZiuPxOHqz0fDyCMFzCQT0gAv6oP3ZGQ1Z0JhLFHY-TC-mFFJ1siXs3V1uXc4_13vIZnb4S-5612rcIKMUzVawv1MY7KVQnIZBKQKCEpaS0N5Vk3gaVPLPvhCiQ6E-zcKdFbcWbUkmbMntezeYBGxLPdEAg5TMgsG5Hag8nUe2zg6o_1SAAQzfQlG6840Z5kWF-dXT66mL9CLYiqk7jZKGl0fse3bOLQ60mSDV3wD3XZ9-4-5FNMwWz0T9Q30kAXLXdvbN_1vQ0cbD_1Fz4lRam3-Nnry6rNiGaNNle-Ctyfn_15J67neXduTaUWqZ1yOdy8scSAONJe4xaAwnwS4gTrlNv5GyZmJklUKsArdZUb7abDuwTyc5hDI\u0026ei\u003dDDdUVL-fE4SpNq-ngPgK","tw":284,"cl":15,"pt":"Wallpapers y fotos de Apple - Taringa!","fn":"apple_in_the_spotlight_by_atomicpinkgoth1.jpg","oh":1600}
\ No newline at end of file
diff --git a/googleapi/tests/html_files/test_shopping_search.html b/googleapi/tests/html_files/test_shopping_search.html
new file mode 100644
index 0000000..b1f610c
--- /dev/null
+++ b/googleapi/tests/html_files/test_shopping_search.html
@@ -0,0 +1 @@
+Disgaea 4 - Google Search
\ No newline at end of file
diff --git a/googleapi/tests/html_files/test_standard_search.html b/googleapi/tests/html_files/test_standard_search.html
new file mode 100644
index 0000000..2b9279a
--- /dev/null
+++ b/googleapi/tests/html_files/test_standard_search.html
@@ -0,0 +1,10 @@
+github - Google Search
Sign up for GitHub. By clicking "Sign up for GitHub", you agree to our terms of
+service and privacy policy. We will send you account related emails occasionally.
GitHub is a web-based Git repository hosting service, which offers all of the
+distributed revision control and source code management (SCM) functionality of
+Git ...
Sep 30, 2013 ...GitHub is more than just a programmer's tool. If you want to collaborate on
+anything, you should give it a try. Part 1 of a two-part look at getting ...
Discover, share, and discuss code snippets using the integrated GitHub Gists
+support. Download the app for free and signup at http://github.com/signup for a
+free ...
Firefox = Mozilla\
+ \ Firefox (identified as Mozilla before 2005)
\r\n
Chrome\
+ \ = Google Chrome
\r\n
Mozilla = The Mozilla Suite\
+ \ (Gecko, Netscape)
\r\n
Safari = Apple Safari (and\
+ \ Konqueror. Both identified as Mozilla before 2007)
\r\n
Opera\
+ \ = Opera (from 2011; Opera Mini is included here)
\r\n
Netscape\
+ \ = Netscape Navigator (identified as Mozilla after 2006)
\r\n
AOL\
+ \ = America Online (based on both Internet Explorer and Mozilla)
\r\n\
+
\r\n\r\n\r\n
Statistics Can Be Misleading
\r\n
\r\n
The pure\
+ \ and simple truth is rarely pure and never simple
\r\n
Oscar Wilde
\r\
+ \n
\r\n\r\n
W3Schools' statistics may not be relevant\
+ \ to your web site. Different sites \r\nattract different\
+ \ audiences. Some web sites attract developers \r\nusing professional hardware,\
+ \ while other sites attract hobbyists using older computers.
\r\n
Anyway,\
+ \ data collected from W3Schools' log-files over many years clearly shows the\
+ \ long \r\nterm trends.
Free\
+ \ open-source web browser developed by Google.\
+ \ \r\nChromium is the name of the open source project behind GoogleChrome,\
+ \ released under the BSD license.
GitHub brings together the world's largest community of developers\
+ \ to discover, share, and build better software. From open source projects\
+ \ to private team ...
GitHub es una forja (plataforma de desarrollo colaborativo)\
+ \ para alojar proyectos utilizando el sistema de control de versiones Git.\
+ \ Se utiliza principalmente para ...
Desarrollador\u200E: \u200ETom Preston-Werner; Chris Wa...
Tipo\u200E: \u200ERepositorio, \u200ENegocio\u200E, sitio web y servicio ...
7 ene. 2019 - Today we're announcing two major\
+ \ updates to make GitHub more accessible to developers: unlimited\
+ \ free private repositories, and a simpler, ...
Learn more about the GitHub Community Forum and discover resources\
+ \ to help you ... Discussion and support using the GitHub API, building\
+ \ GitHub Apps, and ...
The latest Tweets from GitHub (@github). How people build\
+ \ software. Need help? Send us a message at https://t.co/YU5nzbpDIg for\
+ \ support. San Francisco, CA.
GitHub es una forja para alojar proyectos utilizando el sistema\
+ \ de control de versiones Git. Se utiliza principalmente para la creaci\xF3\
+ n de c\xF3digo fuente de programas de computadora. El software que opera GitHub\
+ \ fue escrito en Ruby on Rails. Desde enero de 2010, GitHub opera bajo el\
+ \ nombre de GitHub, Inc.Wikipedia