From edfba29dfd063b0b0450f252261fd644dad98842 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 15 Sep 2010 14:27:27 -0300 Subject: [PATCH 01/67] Re-bumped version to 0.11 --- scrapy/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scrapy/__init__.py b/scrapy/__init__.py index de7d7c611..37cb3a0a0 100644 --- a/scrapy/__init__.py +++ b/scrapy/__init__.py @@ -2,8 +2,8 @@ Scrapy - a screen scraping framework written in Python """ -version_info = (0, 10, 2, '') -__version__ = "0.10.2" +version_info = (0, 11, 0, 'dev') +__version__ = "0.11" import sys, os, warnings From b6c2b55e5b2d5ff2bb6d13d46d27cd5f273f6cdc Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 15:47:33 -0300 Subject: [PATCH 02/67] Splitted settings classes from settings singleton. Closes #244 --HG-- rename : scrapy/conf/__init__.py => scrapy/conf.py rename : scrapy/conf/default_settings.py => scrapy/settings/default_settings.py rename : scrapy/tests/test_conf.py => scrapy/tests/test_settings.py --- docs/topics/settings.rst | 38 +++----- .../googledir/googledir/settings.py | 5 - examples/experimental/imdb/imdb/settings.py | 5 - scrapy/conf.py | 40 ++++++++ scrapy/conf/__init__.py | 94 ------------------- scrapy/contrib/downloadermiddleware/retry.py | 3 - scrapy/settings/__init__.py | 59 ++++++++++++ scrapy/{conf => settings}/default_settings.py | 0 scrapy/shell.py | 3 +- .../templates/project/module/settings.py.tmpl | 4 - .../test_downloadermiddleware_httpcache.py | 2 +- scrapy/tests/test_engine.py | 2 +- scrapy/tests/test_middleware.py | 2 +- scrapy/tests/test_pipeline_media.py | 2 +- .../tests/{test_conf.py => test_settings.py} | 2 +- 15 files changed, 118 insertions(+), 143 deletions(-) create mode 100644 scrapy/conf.py delete mode 100644 scrapy/conf/__init__.py create mode 100644 scrapy/settings/__init__.py rename scrapy/{conf => settings}/default_settings.py (100%) rename scrapy/tests/{test_conf.py => test_settings.py} (98%) diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst index 2f32be53e..a63eb1f62 100644 --- a/docs/topics/settings.rst +++ b/docs/topics/settings.rst @@ -39,10 +39,9 @@ different precedence. Here is the list of them in decreasing order of precedence: 1. Global overrides (most precedence) - 2. Environment variables - 3. scrapy_settings - 4. Default settings per-command - 5. Default global settings (less precedence) + 2. Project settings module + 3. Default settings per-command + 4. Default global settings (less precedence) These mechanisms are described in more detail below. @@ -65,27 +64,14 @@ Example:: scrapy crawl domain.com --set LOG_FILE=scrapy.log -2. Environment variables ------------------------- +2. Project settings module +-------------------------- -You can populate settings using environment variables prefixed with -``SCRAPY_``. For example, to change the log file location un Unix systems:: +The project settings module is the standard configuration file for your Scrapy +project. It's where most of your custom settings will be populated. For +example:: ``myproject.settings``. - $ export SCRAPY_LOG_FILE=scrapy.log - $ scrapy crawl example.com - -In Windows systems, you can change the environment variables from the Control -Panel following `these guidelines`_. - -.. _these guidelines: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sysdm_advancd_environmnt_addchange_variable.mspx - -3. scrapy_settings ------------------- - -scrapy_settings is the standard configuration file for your Scrapy project. -It's where most of your custom settings will be populated. - -4. Default settings per-command +3. Default settings per-command ------------------------------- Each :doc:`Scrapy tool ` command can have its own default @@ -93,11 +79,11 @@ settings, which override the global default settings. Those custom command settings are specified in the ``default_settings`` attribute of the command class. -5. Default global settings +4. Default global settings -------------------------- -The global defaults are located in scrapy.conf.default_settings and documented -in the :ref:`topics-settings-ref` section. +The global defaults are located in the ``scrapy.settings.default_settings`` +module and documented in the :ref:`topics-settings-ref` section. How to access settings ====================== diff --git a/examples/experimental/googledir/googledir/settings.py b/examples/experimental/googledir/googledir/settings.py index 4e3c11163..38f1df2a5 100644 --- a/examples/experimental/googledir/googledir/settings.py +++ b/examples/experimental/googledir/googledir/settings.py @@ -4,11 +4,6 @@ # default. All the other settings are documented here: # # http://doc.scrapy.org/topics/settings.html -# -# Or you can copy and paste them from where they're defined in Scrapy: -# -# scrapy/conf/default_settings.py -# BOT_NAME = 'googledir' BOT_VERSION = '1.0' diff --git a/examples/experimental/imdb/imdb/settings.py b/examples/experimental/imdb/imdb/settings.py index de026dc14..e0a8db52a 100644 --- a/examples/experimental/imdb/imdb/settings.py +++ b/examples/experimental/imdb/imdb/settings.py @@ -4,11 +4,6 @@ # default. All the other settings are documented here: # # http://doc.scrapy.org/topics/settings.html -# -# Or you can copy and paste them from where they're defined in Scrapy: -# -# scrapy/conf/default_settings.py -# BOT_NAME = 'imdb' BOT_VERSION = '1.0' diff --git a/scrapy/conf.py b/scrapy/conf.py new file mode 100644 index 000000000..c47c38626 --- /dev/null +++ b/scrapy/conf.py @@ -0,0 +1,40 @@ +""" +Scrapy settings manager + +See documentation in docs/topics/settings.rst +""" + +import os +import cPickle as pickle + +from scrapy.settings import CrawlerSettings +from scrapy.utils.conf import init_env + +ENVVAR = 'SCRAPY_SETTINGS_MODULE' + +def get_project_settings(): + if ENVVAR not in os.environ: + project = os.environ.get('SCRAPY_PROJECT', 'default') + init_env(project) + settings_module_path = os.environ.get(ENVVAR, 'scrapy_settings') + try: + settings_module = __import__(settings_module_path, {}, {}, ['']) + except ImportError: + settings_module = None + settings = CrawlerSettings(settings_module) + + # XXX: remove this hack + pickled_settings = os.environ.get("SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE") + settings.overrides = pickle.loads(pickled_settings) if pickled_settings else {} + + # XXX: deprecate and remove this functionality + for k, v in os.environ.items(): + if k.startswith('SCRAPY_'): + settings.overrides[k[7:]] = v + + return settings + +if os.environ.get('SCRAPY_SETTINGS_DISABLED'): + settings = CrawlerSettings() +else: + settings = get_project_settings() diff --git a/scrapy/conf/__init__.py b/scrapy/conf/__init__.py deleted file mode 100644 index e9f3fb136..000000000 --- a/scrapy/conf/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -Scrapy settings manager - -See documentation in docs/topics/settings.rst -""" - -import os -import cPickle as pickle - -from scrapy.conf import default_settings -from scrapy.utils.conf import init_env - -import_ = lambda x: __import__(x, {}, {}, ['']) - - -class Settings(object): - - def __init__(self, values=None): - self.values = values.copy() if values else {} - self.global_defaults = default_settings - - def __getitem__(self, opt_name): - if opt_name in self.values: - return self.values[opt_name] - return getattr(self.global_defaults, opt_name, None) - - def get(self, name, default=None): - return self[name] if self[name] is not None else default - - def getbool(self, name, default=False): - """ - True is: 1, '1', True - False is: 0, '0', False, None - """ - return bool(int(self.get(name, default))) - - def getint(self, name, default=0): - return int(self.get(name, default)) - - def getfloat(self, name, default=0.0): - return float(self.get(name, default)) - - def getlist(self, name, default=None): - value = self.get(name) - if value is None: - return default or [] - elif hasattr(value, '__iter__'): - return value - else: - return str(value).split(',') - - -class EnvironmentSettings(Settings): - - ENVVAR = 'SCRAPY_SETTINGS_MODULE' - - def __init__(self): - super(EnvironmentSettings, self).__init__() - self.defaults = {} - self.disabled = os.environ.get('SCRAPY_SETTINGS_DISABLED', False) - if self.ENVVAR not in os.environ: - project = os.environ.get('SCRAPY_PROJECT', 'default') - init_env(project) - settings_module_path = os.environ.get(self.ENVVAR, 'scrapy_settings') - self.set_settings_module(settings_module_path) - - # XXX: find a better solution for this hack - pickled_settings = os.environ.get("SCRAPY_PICKLED_SETTINGS_TO_OVERRIDE") - self.overrides = pickle.loads(pickled_settings) if pickled_settings else {} - - def set_settings_module(self, settings_module_path): - self.settings_module_path = settings_module_path - try: - self.settings_module = import_(settings_module_path) - except ImportError: - self.settings_module = None - - def __getitem__(self, opt_name): - if not self.disabled: - if opt_name in self.overrides: - return self.overrides[opt_name] - if 'SCRAPY_' + opt_name in os.environ: - return os.environ['SCRAPY_' + opt_name] - if hasattr(self.settings_module, opt_name): - return getattr(self.settings_module, opt_name) - if opt_name in self.defaults: - return self.defaults[opt_name] - return super(EnvironmentSettings, self).__getitem__(opt_name) - - def __str__(self): - return "" % self.settings_module_path - - -settings = EnvironmentSettings() diff --git a/scrapy/contrib/downloadermiddleware/retry.py b/scrapy/contrib/downloadermiddleware/retry.py index 854dbb56a..9c0a2c788 100644 --- a/scrapy/contrib/downloadermiddleware/retry.py +++ b/scrapy/contrib/downloadermiddleware/retry.py @@ -11,9 +11,6 @@ once the spider has finished crawling all regular (non failed) pages. Once there is no more failed pages to retry this middleware sends a signal (retry_complete), so other extensions could connect to that signal. -Default values are located in scrapy.conf.default_settings, like any other -setting - About HTTP errors to consider: - You may want to remove 400 from RETRY_HTTP_CODES, if you stick to the HTTP diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py new file mode 100644 index 000000000..30b80a1cf --- /dev/null +++ b/scrapy/settings/__init__.py @@ -0,0 +1,59 @@ +from . import default_settings + + +class Settings(object): + + def __init__(self, values=None): + self.values = values.copy() if values else {} + self.global_defaults = default_settings + + def __getitem__(self, opt_name): + if opt_name in self.values: + return self.values[opt_name] + return getattr(self.global_defaults, opt_name, None) + + def get(self, name, default=None): + return self[name] if self[name] is not None else default + + def getbool(self, name, default=False): + """ + True is: 1, '1', True + False is: 0, '0', False, None + """ + return bool(int(self.get(name, default))) + + def getint(self, name, default=0): + return int(self.get(name, default)) + + def getfloat(self, name, default=0.0): + return float(self.get(name, default)) + + def getlist(self, name, default=None): + value = self.get(name) + if value is None: + return default or [] + elif hasattr(value, '__iter__'): + return value + else: + return str(value).split(',') + + +class CrawlerSettings(Settings): + + def __init__(self, settings_module=None, **kw): + super(CrawlerSettings, self).__init__(**kw) + self.settings_module = settings_module + self.overrides = {} + self.defaults = {} + + def __getitem__(self, opt_name): + if opt_name in self.overrides: + return self.overrides[opt_name] + if self.settings_module and hasattr(self.settings_module, opt_name): + return getattr(self.settings_module, opt_name) + if opt_name in self.defaults: + return self.defaults[opt_name] + return super(CrawlerSettings, self).__getitem__(opt_name) + + def __str__(self): + return "" % self.settings_module.__name__ diff --git a/scrapy/conf/default_settings.py b/scrapy/settings/default_settings.py similarity index 100% rename from scrapy/conf/default_settings.py rename to scrapy/settings/default_settings.py diff --git a/scrapy/shell.py b/scrapy/shell.py index 12947f480..a4f4594b0 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -18,7 +18,8 @@ from scrapy.utils.misc import load_object from scrapy.utils.response import open_in_browser from scrapy.utils.url import any_to_uri from scrapy.utils.console import start_python_console -from scrapy.conf import settings, Settings +from scrapy.conf import settings +from scrapy.settings import Settings from scrapy.http import Request, Response, TextResponse class Shell(object): diff --git a/scrapy/templates/project/module/settings.py.tmpl b/scrapy/templates/project/module/settings.py.tmpl index 07f576f91..ce2751f0f 100644 --- a/scrapy/templates/project/module/settings.py.tmpl +++ b/scrapy/templates/project/module/settings.py.tmpl @@ -5,10 +5,6 @@ # # http://doc.scrapy.org/topics/settings.html # -# Or you can copy and paste them from where they're defined in Scrapy: -# -# scrapy/conf/default_settings.py -# BOT_NAME = '$project_name' BOT_VERSION = '1.0' diff --git a/scrapy/tests/test_downloadermiddleware_httpcache.py b/scrapy/tests/test_downloadermiddleware_httpcache.py index 4e569ea7a..ae6339208 100644 --- a/scrapy/tests/test_downloadermiddleware_httpcache.py +++ b/scrapy/tests/test_downloadermiddleware_httpcache.py @@ -3,7 +3,7 @@ import unittest, tempfile, shutil, time from scrapy.http import Response, HtmlResponse, Request from scrapy.spider import BaseSpider from scrapy.contrib.downloadermiddleware.httpcache import FilesystemCacheStorage, HttpCacheMiddleware -from scrapy.conf import Settings +from scrapy.settings import Settings from scrapy.exceptions import IgnoreRequest diff --git a/scrapy/tests/test_engine.py b/scrapy/tests/test_engine.py index 6549fefa6..8f4ab8fb7 100644 --- a/scrapy/tests/test_engine.py +++ b/scrapy/tests/test_engine.py @@ -17,7 +17,7 @@ from twisted.web import server, static, util from twisted.trial import unittest from scrapy import signals -from scrapy.conf import Settings +from scrapy.settings import Settings from scrapy.crawler import Crawler from scrapy.xlib.pydispatch import dispatcher from scrapy.tests import tests_datadir diff --git a/scrapy/tests/test_middleware.py b/scrapy/tests/test_middleware.py index 1eca89b27..145b86b02 100644 --- a/scrapy/tests/test_middleware.py +++ b/scrapy/tests/test_middleware.py @@ -1,6 +1,6 @@ from twisted.trial import unittest -from scrapy.conf import Settings +from scrapy.settings import Settings from scrapy.exceptions import NotConfigured from scrapy.middleware import MiddlewareManager diff --git a/scrapy/tests/test_pipeline_media.py b/scrapy/tests/test_pipeline_media.py index 6877fcfad..a9731e6bd 100644 --- a/scrapy/tests/test_pipeline_media.py +++ b/scrapy/tests/test_pipeline_media.py @@ -2,7 +2,7 @@ from twisted.trial import unittest from twisted.python import failure from twisted.internet import defer, reactor -from scrapy.conf import Settings +from scrapy.settings import Settings from scrapy.crawler import Crawler from scrapy.http import Request, Response from scrapy.spider import BaseSpider diff --git a/scrapy/tests/test_conf.py b/scrapy/tests/test_settings.py similarity index 98% rename from scrapy/tests/test_conf.py rename to scrapy/tests/test_settings.py index 9eddb0206..dfccf5dff 100644 --- a/scrapy/tests/test_conf.py +++ b/scrapy/tests/test_settings.py @@ -1,6 +1,6 @@ import unittest -from scrapy.conf import Settings +from scrapy.settings import Settings class SettingsTest(unittest.TestCase): From a4639ffb06ff261e9587588ae58794a39b3b0f31 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 16:08:18 -0300 Subject: [PATCH 03/67] Removed hacky SCRAPY_SETTINGS_DISABLED environment variable --- bin/runtests.sh | 3 --- scrapy/conf.py | 5 +---- scrapy/tests/test_cmdline/__init__.py | 1 - scrapy/tests/test_commands.py | 1 - scrapyd/eggutils.py | 1 - 5 files changed, 1 insertion(+), 10 deletions(-) diff --git a/bin/runtests.sh b/bin/runtests.sh index a714a208d..3c8079210 100755 --- a/bin/runtests.sh +++ b/bin/runtests.sh @@ -12,9 +12,6 @@ else exit 1 fi -# disable custom settings for running tests in a neutral environment -export SCRAPY_SETTINGS_DISABLED=1 - # use vsftpd (if available) for testing ftp feed storage if type vsftpd >/dev/null 2>&1; then vsftpd_conf=$(mktemp /tmp/vsftpd-XXXX) diff --git a/scrapy/conf.py b/scrapy/conf.py index c47c38626..795c8d7c0 100644 --- a/scrapy/conf.py +++ b/scrapy/conf.py @@ -34,7 +34,4 @@ def get_project_settings(): return settings -if os.environ.get('SCRAPY_SETTINGS_DISABLED'): - settings = CrawlerSettings() -else: - settings = get_project_settings() +settings = get_project_settings() diff --git a/scrapy/tests/test_cmdline/__init__.py b/scrapy/tests/test_cmdline/__init__.py index 3588436b9..d08f266f1 100644 --- a/scrapy/tests/test_cmdline/__init__.py +++ b/scrapy/tests/test_cmdline/__init__.py @@ -10,7 +10,6 @@ class CmdlineTest(unittest.TestCase): def setUp(self): self.env = os.environ.copy() self.env['PYTHONPATH'] = os.path.dirname(scrapy.__path__[0]) - self.env.pop('SCRAPY_SETTINGS_DISABLED', None) self.env['SCRAPY_SETTINGS_MODULE'] = 'scrapy.tests.test_cmdline.settings' def _execute(self, *new_args, **kwargs): diff --git a/scrapy/tests/test_commands.py b/scrapy/tests/test_commands.py index 47f67338a..e2b671d19 100644 --- a/scrapy/tests/test_commands.py +++ b/scrapy/tests/test_commands.py @@ -61,7 +61,6 @@ class CommandTest(ProjectTest): super(CommandTest, self).setUp() self.call('startproject', self.project_name) self.cwd = join(self.temp_path, self.project_name) - self.env.pop('SCRAPY_SETTINGS_DISABLED', None) self.env['SCRAPY_SETTINGS_MODULE'] = '%s.settings' % self.project_name diff --git a/scrapyd/eggutils.py b/scrapyd/eggutils.py index 27e661cd0..c507f0be5 100644 --- a/scrapyd/eggutils.py +++ b/scrapyd/eggutils.py @@ -18,7 +18,6 @@ def get_spider_list_from_eggfile(eggfile, project): env = os.environ.copy() env['SCRAPY_PROJECT'] = project env['SCRAPY_EGGFILE'] = f.name - env.pop('SCRAPY_SETTINGS_DISABLED', None) proc = Popen(pargs, stdout=PIPE, cwd=tmpdir, env=env) out = proc.communicate()[0] return out.splitlines() From 2459d20cc0d3fd45acd1eeb2a98a6f12a2d57d2e Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 16:09:13 -0300 Subject: [PATCH 04/67] Added support for unifying access to per-spider settings. Refs #245 --- scrapy/crawler.py | 1 + scrapy/settings/__init__.py | 22 ++++++++++++++++++++++ scrapy/spider.py | 16 ++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/scrapy/crawler.py b/scrapy/crawler.py index 7b153979e..22d0f2f91 100644 --- a/scrapy/crawler.py +++ b/scrapy/crawler.py @@ -54,6 +54,7 @@ class Crawler(object): @defer.inlineCallbacks def _start_spider(self, spider, requests): """Don't call this method. Use self.queue to start new spiders""" + spider.set_crawler(self) yield defer.maybeDeferred(self.engine.open_spider, spider) for request in requests: self.engine.crawl(request, spider) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 30b80a1cf..7ca18b3ca 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -57,3 +57,25 @@ class CrawlerSettings(Settings): def __str__(self): return "" % self.settings_module.__name__ + + +class SpiderSettings(Settings): + + def __init__(self, spider, crawler_settings, **kw): + super(SpiderSettings, self).__init__(**kw) + self.spider = spider + self.cset = crawler_settings + + def __getitem__(self, opt_name): + if opt_name in self.cset.overrides: + return self.cset.overrides[opt_name] + if hasattr(self.spider, opt_name): + return getattr(self.spider, opt_name) + if self.cset.settings_module and hasattr(self.cset.settings_module, opt_name): + return getattr(self.cset.settings_module, opt_name) + if opt_name in self.cset.defaults: + return self.cset.defaults[opt_name] + return super(SpiderSettings, self).__getitem__(opt_name) + + def __str__(self): + return "" % self.spider.name diff --git a/scrapy/spider.py b/scrapy/spider.py index b2d2f0e46..cb090e3db 100644 --- a/scrapy/spider.py +++ b/scrapy/spider.py @@ -5,6 +5,7 @@ See documentation in docs/topics/spiders.rst """ from scrapy import log +from scrapy.settings import SpiderSettings from scrapy.http import Request from scrapy.utils.misc import arg_to_iter from scrapy.utils.trackref import object_ref @@ -33,6 +34,21 @@ class BaseSpider(object_ref): """ log.msg(message, spider=self, level=level) + def set_crawler(self, crawler): + assert not hasattr(self, '_crawler'), "Spider already bounded to %s" % crawler + self._crawler = crawler + + @property + def crawler(self): + assert hasattr(self, '_crawler'), "Spider not bounded to any crawler" + return self._crawler + + @property + def settings(self): + if not hasattr(self, '_settings'): + self._settings = SpiderSettings(self, self.crawler.settings) + return self._settings + def start_requests(self): reqs = [] for url in self.start_urls: From ed4aec187f7868a7fcc7c7279489f02be79a8cf9 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 16:09:13 -0300 Subject: [PATCH 05/67] Ported code to use new unified access to spider settings, keeping backwards compatibility for old spider attributes. Refs #245 --- docs/faq.rst | 2 +- docs/topics/commands.rst | 10 ++--- docs/topics/downloader-middleware.rst | 10 ++--- docs/topics/settings.rst | 4 +- .../downloadermiddleware/defaultheaders.py | 10 +---- .../downloadermiddleware/downloadtimeout.py | 6 ++- .../contrib/downloadermiddleware/robotstxt.py | 3 +- .../contrib/downloadermiddleware/useragent.py | 10 +++-- scrapy/core/downloader/__init__.py | 25 ++++++----- scrapy/core/downloader/webclient.py | 6 +-- ...est_downloadermiddleware_defaultheaders.py | 37 +++++++++------- ...st_downloadermiddleware_downloadtimeout.py | 39 ++++++++-------- .../test_downloadermiddleware_useragent.py | 44 ++++++++++--------- scrapy/tests/test_engine.py | 6 +-- scrapy/utils/deprecate.py | 9 ++++ scrapy/utils/test.py | 17 +++++++ 16 files changed, 129 insertions(+), 109 deletions(-) create mode 100644 scrapy/utils/deprecate.py diff --git a/docs/faq.rst b/docs/faq.rst index c0b76b21f..966de7456 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -171,7 +171,7 @@ higher) in your spider:: name = 'myspider' - download_delay = 2 + DOWNLOAD_DELAY = 2 # [ ... rest of the spider code ... ] diff --git a/docs/topics/commands.rst b/docs/topics/commands.rst index d58973eb6..6339a4607 100644 --- a/docs/topics/commands.rst +++ b/docs/topics/commands.rst @@ -73,10 +73,10 @@ information on which commands must be run from inside projects, and which not. Also keep in mind that some commands may have slightly different behaviours when running them from inside projects. For example, the fetch command will use -spider-overridden behaviours (such as custom ``user_agent`` attribute) if the -url being fetched is associated with some specific spider. This is intentional, -as the ``fetch`` command is meant to be used to check how spiders are -downloading pages. +spider-overridden behaviours (such as custom :settings:`USER_AGENT` per-spider +setting) if the url being fetched is associated with some specific spider. This +is intentional, as the ``fetch`` command is meant to be used to check how +spiders are downloading pages. .. _topics-commands-ref: @@ -243,7 +243,7 @@ Downloads the given URL using the Scrapy downloader and writes the contents to standard output. The interesting thing about this command is that it fetches the page how the -the spider would download it. For example, if the spider has an ``user_agent`` +the spider would download it. For example, if the spider has an ``USER_AGENT`` attribute which overrides the User Agent, it will use that one. So this command can be used to "see" how your spider would fetch certain page. diff --git a/docs/topics/downloader-middleware.rst b/docs/topics/downloader-middleware.rst index d4139ff54..eb7a33009 100644 --- a/docs/topics/downloader-middleware.rst +++ b/docs/topics/downloader-middleware.rst @@ -177,9 +177,7 @@ DefaultHeadersMiddleware .. class:: DefaultHeadersMiddleware This middleware sets all default requests headers specified in the - :setting:`DEFAULT_REQUEST_HEADERS` setting plus those found in spider - ``default_request_headers`` attribute. Spider headers has precedence over - global headers. + :setting:`DEFAULT_REQUEST_HEADERS` setting. DownloadTimeoutMiddleware ------------------------- @@ -189,10 +187,8 @@ DownloadTimeoutMiddleware .. class:: DownloadTimeoutMiddleware - This middleware sets download timeout for requests based on - `download_timeout` spider attribute. It doesn't override timeout if - `download_timeout` is already set in request meta. Otherwise, - :setting:`DOWNLOAD_TIMEOUT` setting is used as default download timeout. + This middleware sets the download timeout for requests specified in the + :setting:`DOWNLOAD_TIMEOUT` setting. HttpAuthMiddleware ------------------ diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst index a63eb1f62..e3b452419 100644 --- a/docs/topics/settings.rst +++ b/docs/topics/settings.rst @@ -398,9 +398,7 @@ setting (which is enabled by default). By default, Scrapy doesn't wait a fixed amount of time between requests, but uses a random interval between 0.5 and 1.5 * :setting:`DOWNLOAD_DELAY`. -Another way to change the download delay (per spider, instead of globally) is -by using the ``download_delay`` spider attribute, which takes more precedence -than this setting. +You can also change this setting per spider. .. setting:: DOWNLOAD_HANDLERS diff --git a/scrapy/contrib/downloadermiddleware/defaultheaders.py b/scrapy/contrib/downloadermiddleware/defaultheaders.py index 1bef04cdd..61a05fc50 100644 --- a/scrapy/contrib/downloadermiddleware/defaultheaders.py +++ b/scrapy/contrib/downloadermiddleware/defaultheaders.py @@ -10,18 +10,10 @@ from scrapy.utils.python import WeakKeyCache class DefaultHeadersMiddleware(object): def __init__(self, settings=conf.settings): - self.global_default_headers = settings.get('DEFAULT_REQUEST_HEADERS') self._headers = WeakKeyCache(self._default_headers) def _default_headers(self, spider): - headers = dict(self.global_default_headers) - spider_headers = getattr(spider, 'default_request_headers', None) or {} - for k, v in spider_headers.iteritems(): - if v: - headers[k] = v - else: - headers.pop(k, None) - return headers.items() + return spider.settings.get('DEFAULT_REQUEST_HEADERS').items() def process_request(self, request, spider): for k, v in self._headers[spider]: diff --git a/scrapy/contrib/downloadermiddleware/downloadtimeout.py b/scrapy/contrib/downloadermiddleware/downloadtimeout.py index 0c250d4c4..01ccf7bfb 100644 --- a/scrapy/contrib/downloadermiddleware/downloadtimeout.py +++ b/scrapy/contrib/downloadermiddleware/downloadtimeout.py @@ -4,6 +4,7 @@ Download timeout middleware See documentation in docs/topics/downloader-middleware.rst """ from scrapy.utils.python import WeakKeyCache +from scrapy.utils import deprecate class DownloadTimeoutMiddleware(object): @@ -12,7 +13,10 @@ class DownloadTimeoutMiddleware(object): self._cache = WeakKeyCache(self._download_timeout) def _download_timeout(self, spider): - return getattr(spider, "download_timeout", None) + if hasattr(spider, 'download_timeout'): + deprecate.attribute(spider, 'download_timeout', 'DOWNLOAD_TIMEOUT') + return spider.download_timeout + return spider.settings.getint('DOWNLOAD_TIMEOUT') def process_request(self, request, spider): timeout = self._cache[spider] diff --git a/scrapy/contrib/downloadermiddleware/robotstxt.py b/scrapy/contrib/downloadermiddleware/robotstxt.py index fe47317f7..314a9586d 100644 --- a/scrapy/contrib/downloadermiddleware/robotstxt.py +++ b/scrapy/contrib/downloadermiddleware/robotstxt.py @@ -54,8 +54,7 @@ class RobotsTxtMiddleware(object): def spider_opened(self, spider): self._spider_netlocs[spider] = set() - self._useragents[spider] = getattr(spider, 'user_agent', None) \ - or settings['USER_AGENT'] + self._useragents[spider] = spider.settings['USER_AGENT'] def spider_closed(self, spider): for netloc in self._spider_netlocs[spider]: diff --git a/scrapy/contrib/downloadermiddleware/useragent.py b/scrapy/contrib/downloadermiddleware/useragent.py index 56df2b999..752a8577b 100644 --- a/scrapy/contrib/downloadermiddleware/useragent.py +++ b/scrapy/contrib/downloadermiddleware/useragent.py @@ -1,18 +1,20 @@ """Set User-Agent header per spider or use a default value from settings""" -from scrapy.conf import settings from scrapy.utils.python import WeakKeyCache +from scrapy.utils import deprecate class UserAgentMiddleware(object): """This middleware allows spiders to override the user_agent""" - def __init__(self, settings=settings): + def __init__(self): self.cache = WeakKeyCache(self._user_agent) - self.default_useragent = settings.get('USER_AGENT') def _user_agent(self, spider): - return getattr(spider, 'user_agent', None) or self.default_useragent + if hasattr(spider, 'user_agent'): + deprecate.attribute(spider, 'user_agent', 'USER_AGENT') + return spider.user_agent + return spider.settings['USER_AGENT'] def process_request(self, request, spider): ua = self.cache[spider] diff --git a/scrapy/core/downloader/__init__.py b/scrapy/core/downloader/__init__.py index 38dcabf55..8eb99d9d0 100644 --- a/scrapy/core/downloader/__init__.py +++ b/scrapy/core/downloader/__init__.py @@ -12,6 +12,7 @@ from scrapy.exceptions import IgnoreRequest from scrapy.conf import settings from scrapy.utils.defer import mustbe_deferred from scrapy.utils.signal import send_catch_log +from scrapy.utils import deprecate from scrapy import signals from scrapy import log from .middleware import DownloaderMiddlewareManager @@ -21,18 +22,21 @@ from .handlers import DownloadHandlers class SpiderInfo(object): """Simple class to keep information and state for each open spider""" - def __init__(self, download_delay=None, max_concurrent_requests=None): - if download_delay is None: - self._download_delay = settings.getfloat('DOWNLOAD_DELAY') + def __init__(self, spider): + if hasattr(spider, 'download_delay'): + deprecate.attribute(spider, 'download_delay', 'DOWNLOAD_DELAY') + self._download_delay = spider.download_delay else: - self._download_delay = float(download_delay) + self._download_delay = spider.settings.getfloat('DOWNLOAD_DELAY') if self._download_delay: self.max_concurrent_requests = 1 - elif max_concurrent_requests is None: - self.max_concurrent_requests = settings.getint('CONCURRENT_REQUESTS_PER_SPIDER') else: - self.max_concurrent_requests = max_concurrent_requests - if self._download_delay and settings.getbool('RANDOMIZE_DOWNLOAD_DELAY'): + if hasattr(spider, 'max_concurrent_requests'): + deprecate.attribute(spider, 'max_concurrent_requests', 'CONCURRENT_REQUESTS_PER_SPIDER') + self.max_concurrent_requests = spider.max_concurrent_requests + else: + self.max_concurrent_requests = spider.settings.getint('CONCURRENT_REQUESTS_PER_SPIDER') + if self._download_delay and spider.settings.getbool('RANDOMIZE_DOWNLOAD_DELAY'): # same policy as wget --random-wait self.random_delay_interval = (0.5*self._download_delay, \ 1.5*self._download_delay) @@ -178,10 +182,7 @@ class Downloader(object): def open_spider(self, spider): """Allocate resources to begin processing a spider""" assert spider not in self.sites, "Spider already opened: %s" % spider - self.sites[spider] = SpiderInfo( - download_delay=getattr(spider, 'download_delay', None), - max_concurrent_requests=getattr(spider, 'max_concurrent_requests', None) - ) + self.sites[spider] = SpiderInfo(spider) def close_spider(self, spider): """Free any resources associated with the given spider""" diff --git a/scrapy/core/downloader/webclient.py b/scrapy/core/downloader/webclient.py index 0aeb861e0..b08e8ad81 100644 --- a/scrapy/core/downloader/webclient.py +++ b/scrapy/core/downloader/webclient.py @@ -8,10 +8,6 @@ from twisted.internet import defer from scrapy.http import Headers from scrapy.utils.httpobj import urlparse_cached from scrapy.core.downloader.responsetypes import responsetypes -from scrapy.conf import settings - - -DOWNLOAD_TIMEOUT = settings.getint('DOWNLOAD_TIMEOUT') def _parsed_url_args(parsed): @@ -89,7 +85,7 @@ class ScrapyHTTPClientFactory(HTTPClientFactory): followRedirect = False afterFoundGet = False - def __init__(self, request, timeout=DOWNLOAD_TIMEOUT): + def __init__(self, request, timeout=180): self.url = urldefrag(request.url)[0] self.method = request.method self.body = request.body or None diff --git a/scrapy/tests/test_downloadermiddleware_defaultheaders.py b/scrapy/tests/test_downloadermiddleware_defaultheaders.py index 5dfe5546c..cc227e20c 100644 --- a/scrapy/tests/test_downloadermiddleware_defaultheaders.py +++ b/scrapy/tests/test_downloadermiddleware_defaultheaders.py @@ -4,39 +4,44 @@ from scrapy.conf import settings from scrapy.contrib.downloadermiddleware.defaultheaders import DefaultHeadersMiddleware from scrapy.http import Request from scrapy.spider import BaseSpider +from scrapy.utils.test import get_crawler class TestDefaultHeadersMiddleware(TestCase): - def setUp(self): - self.spider = BaseSpider('foo') - self.mw = DefaultHeadersMiddleware() - self.default_request_headers = dict([(k, [v]) for k, v in \ - settings.get('DEFAULT_REQUEST_HEADERS').iteritems()]) + def get_defaults_spider_mw(self): + crawler = get_crawler() + spider = BaseSpider('foo') + spider.set_crawler(crawler) + defaults = dict([(k, [v]) for k, v in \ + crawler.settings.get('DEFAULT_REQUEST_HEADERS').iteritems()]) + return defaults, spider, DefaultHeadersMiddleware() def test_process_request(self): + defaults, spider, mw = self.get_defaults_spider_mw() req = Request('http://www.scrapytest.org') - self.mw.process_request(req, self.spider) - self.assertEquals(req.headers, self.default_request_headers) + mw.process_request(req, spider) + self.assertEquals(req.headers, defaults) def test_spider_default_request_headers(self): + defaults, spider, mw = self.get_defaults_spider_mw() spider_headers = {'Unexistant-Header': ['value']} # override one of the global default headers by spider - if self.default_request_headers: - k = set(self.default_request_headers).pop() + if defaults: + k = set(defaults).pop() spider_headers[k] = ['__newvalue__'] - self.spider.default_request_headers = spider_headers + spider.DEFAULT_REQUEST_HEADERS = spider_headers req = Request('http://www.scrapytest.org') - self.mw.process_request(req, self.spider) - self.assertEquals(req.headers, dict(self.default_request_headers, **spider_headers)) + mw.process_request(req, spider) + self.assertEquals(req.headers, dict(spider_headers)) def test_update_headers(self): + defaults, spider, mw = self.get_defaults_spider_mw() headers = {'Accept-Language': ['es'], 'Test-Header': ['test']} req = Request('http://www.scrapytest.org', headers=headers) self.assertEquals(req.headers, headers) - self.mw.process_request(req, self.spider) - self.default_request_headers.update(headers) - self.assertEquals(req.headers, self.default_request_headers) - + mw.process_request(req, spider) + defaults.update(headers) + self.assertEquals(req.headers, defaults) diff --git a/scrapy/tests/test_downloadermiddleware_downloadtimeout.py b/scrapy/tests/test_downloadermiddleware_downloadtimeout.py index fd60bee9e..fbe371996 100644 --- a/scrapy/tests/test_downloadermiddleware_downloadtimeout.py +++ b/scrapy/tests/test_downloadermiddleware_downloadtimeout.py @@ -3,31 +3,32 @@ import unittest from scrapy.contrib.downloadermiddleware.downloadtimeout import DownloadTimeoutMiddleware from scrapy.spider import BaseSpider from scrapy.http import Request +from scrapy.utils.test import get_crawler class DownloadTimeoutMiddlewareTest(unittest.TestCase): - def setUp(self): - self.mw = DownloadTimeoutMiddleware() - self.spider = BaseSpider('foo') - self.req = Request('http://scrapytest.org/') + def get_request_spider_mw(self): + crawler = get_crawler() + spider = BaseSpider('foo') + spider.set_crawler(crawler) + request = Request('http://scrapytest.org/') + return request, spider, DownloadTimeoutMiddleware() - def tearDown(self): - del self.mw - del self.spider - del self.req - - def test_spider_has_no_download_timeout(self): - assert self.mw.process_request(self.req, self.spider) is None - assert 'download_timeout' not in self.req.meta + def test_default_download_timeout(self): + req, spider, mw = self.get_request_spider_mw() + assert mw.process_request(req, spider) is None + self.assertEquals(req.meta.get('download_timeout'), 180) def test_spider_has_download_timeout(self): - self.spider.download_timeout = 2 - assert self.mw.process_request(self.req, self.spider) is None - self.assertEquals(self.req.meta.get('download_timeout'), 2) + req, spider, mw = self.get_request_spider_mw() + spider.DOWNLOAD_TIMEOUT = 2 + assert mw.process_request(req, spider) is None + self.assertEquals(req.meta.get('download_timeout'), 2) def test_request_has_download_timeout(self): - self.spider.download_timeout = 2 - self.req.meta['download_timeout'] = 1 - assert self.mw.process_request(self.req, self.spider) is None - self.assertEquals(self.req.meta.get('download_timeout'), 1) + req, spider, mw = self.get_request_spider_mw() + spider.DOWNLOAD_TIMEOUT = 2 + req.meta['download_timeout'] = 1 + assert mw.process_request(req, spider) is None + self.assertEquals(req.meta.get('download_timeout'), 1) diff --git a/scrapy/tests/test_downloadermiddleware_useragent.py b/scrapy/tests/test_downloadermiddleware_useragent.py index 866777341..44ac74c8b 100644 --- a/scrapy/tests/test_downloadermiddleware_useragent.py +++ b/scrapy/tests/test_downloadermiddleware_useragent.py @@ -3,47 +3,49 @@ from unittest import TestCase from scrapy.spider import BaseSpider from scrapy.http import Request from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware +from scrapy.utils.test import get_crawler class UserAgentMiddlewareTest(TestCase): - def setUp(self): - self.spider = BaseSpider('foo') - self.mw = UserAgentMiddleware() - - def tearDown(self): - del self.mw + def get_spider_and_mw(self, default_useragent): + crawler = get_crawler({'USER_AGENT': default_useragent}) + spider = BaseSpider('foo') + spider.set_crawler(crawler) + return spider, UserAgentMiddleware() def test_default_agent(self): - self.mw.default_useragent = 'default_useragent' + spider, mw = self.get_spider_and_mw('default_useragent') req = Request('http://scrapytest.org/') - assert self.mw.process_request(req, self.spider) is None + assert mw.process_request(req, spider) is None self.assertEquals(req.headers['User-Agent'], 'default_useragent') - # None or not present user_agent attribute is the same - self.spider.user_agent = None + def test_remove_agent(self): + # settings UESR_AGENT to None should remove the user agent + spider, mw = self.get_spider_and_mw('default_useragent') + spider.USER_AGENT = None req = Request('http://scrapytest.org/') - assert self.mw.process_request(req, self.spider) is None - self.assertEquals(req.headers['User-Agent'], 'default_useragent') + assert mw.process_request(req, spider) is None + assert req.headers.get('User-Agent') is None def test_spider_agent(self): - self.mw.default_useragent = 'default_useragent' - self.spider.user_agent = 'spider_useragent' + spider, mw = self.get_spider_and_mw('default_useragent') + spider.USER_AGENT = 'spider_useragent' req = Request('http://scrapytest.org/') - assert self.mw.process_request(req, self.spider) is None + assert mw.process_request(req, spider) is None self.assertEquals(req.headers['User-Agent'], 'spider_useragent') def test_header_agent(self): - self.mw.default_useragent = 'default_useragent' - self.spider.user_agent = 'spider_useragent' + spider, mw = self.get_spider_and_mw('default_useragent') + spider.USER_AGENT = 'spider_useragent' req = Request('http://scrapytest.org/', headers={'User-Agent': 'header_useragent'}) - assert self.mw.process_request(req, self.spider) is None + assert mw.process_request(req, spider) is None self.assertEquals(req.headers['User-Agent'], 'header_useragent') def test_no_agent(self): - self.mw.default_useragent = None - self.spider.user_agent = None + spider, mw = self.get_spider_and_mw(None) + spider.USER_AGENT = None req = Request('http://scrapytest.org/') - assert self.mw.process_request(req, self.spider) is None + assert mw.process_request(req, spider) is None assert 'User-Agent' not in req.headers diff --git a/scrapy/tests/test_engine.py b/scrapy/tests/test_engine.py index 8f4ab8fb7..2664daf69 100644 --- a/scrapy/tests/test_engine.py +++ b/scrapy/tests/test_engine.py @@ -17,8 +17,7 @@ from twisted.web import server, static, util from twisted.trial import unittest from scrapy import signals -from scrapy.settings import Settings -from scrapy.crawler import Crawler +from scrapy.utils.test import get_crawler from scrapy.xlib.pydispatch import dispatcher from scrapy.tests import tests_datadir from scrapy.spider import BaseSpider @@ -95,8 +94,7 @@ class CrawlerRun(object): dispatcher.connect(self.request_received, signals.request_received) dispatcher.connect(self.response_downloaded, signals.response_downloaded) - settings = Settings() - self.crawler = Crawler(settings) + self.crawler = get_crawler() self.crawler.install() self.crawler.configure() self.crawler.queue.append_spider(self.spider) diff --git a/scrapy/utils/deprecate.py b/scrapy/utils/deprecate.py new file mode 100644 index 000000000..58f580259 --- /dev/null +++ b/scrapy/utils/deprecate.py @@ -0,0 +1,9 @@ +"""Some helpers for deprecation messages""" + +import warnings + +def attribute(obj, oldattr, newattr, version='0.12'): + cname = obj.__class__.__name__ + warnings.warn("%s.%s attribute is deprecated and will be no longer supported " + "in Scrapy %s, use %s.%s attribute instead" % \ + (cname, oldattr, version, cname, newattr), DeprecationWarning, stacklevel=3) diff --git a/scrapy/utils/test.py b/scrapy/utils/test.py index 428b43f43..597ee909c 100644 --- a/scrapy/utils/test.py +++ b/scrapy/utils/test.py @@ -7,6 +7,9 @@ import os import libxml2 from twisted.trial.unittest import SkipTest +from scrapy.crawler import Crawler +from scrapy.settings import CrawlerSettings + def libxml2debug(testfunction): """Decorator for debugging libxml2 memory leaks inside a function. @@ -39,3 +42,17 @@ def assert_aws_environ(): if 'AWS_ACCESS_KEY_ID' not in os.environ: raise SkipTest("AWS keys not found") + +def get_crawler(settings_dict=None): + """Return an unconfigured Crawler object. If settings_dict is given, it + will be used as the settings present in the settings module of the + CrawlerSettings. + """ + class SettingsModuleMock(object): + pass + settings_module = SettingsModuleMock() + if settings_dict: + for k, v in settings_dict.items(): + setattr(settings_module, k, v) + settings = CrawlerSettings(settings_module) + return Crawler(settings) From 97d77c79c28bfbde9781ae88e45d0a236cc10a6a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 16:09:13 -0300 Subject: [PATCH 06/67] Added tests for CrawlerSettings and SpiderSettings classes --- scrapy/tests/test_settings.py | 54 ++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/scrapy/tests/test_settings.py b/scrapy/tests/test_settings.py index dfccf5dff..9da67652c 100644 --- a/scrapy/tests/test_settings.py +++ b/scrapy/tests/test_settings.py @@ -1,6 +1,8 @@ import unittest -from scrapy.settings import Settings +from scrapy.settings import Settings, SpiderSettings +from scrapy.utils.test import get_crawler +from scrapy.spider import BaseSpider class SettingsTest(unittest.TestCase): @@ -46,6 +48,56 @@ class SettingsTest(unittest.TestCase): self.assertEqual(settings.get('TEST_STRx'), None) self.assertEqual(settings.get('TEST_STRx', 'default'), 'default') +class CrawlerSettingsTest(unittest.TestCase): + + def test_global_defaults(self): + crawler = get_crawler() + self.assertEqual(crawler.settings.getint('DOWNLOAD_TIMEOUT'), 180) + + def test_defaults(self): + crawler = get_crawler() + crawler.settings.defaults['DOWNLOAD_TIMEOUT'] = '99' + self.assertEqual(crawler.settings.getint('DOWNLOAD_TIMEOUT'), 99) + + def test_settings_module(self): + crawler = get_crawler({'DOWNLOAD_TIMEOUT': '3'}) + self.assertEqual(crawler.settings.getint('DOWNLOAD_TIMEOUT'), 3) + + def test_overrides(self): + crawler = get_crawler({'DOWNLOAD_TIMEOUT': '3'}) + crawler.settings.overrides['DOWNLOAD_TIMEOUT'] = '15' + self.assertEqual(crawler.settings.getint('DOWNLOAD_TIMEOUT'), 15) + +class SpiderSettingsTest(unittest.TestCase): + + def test_global_defaults(self): + crawler = get_crawler() + settings = SpiderSettings(BaseSpider('name'), crawler.settings) + self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 180) + + def test_defaults(self): + crawler = get_crawler() + crawler.settings.defaults['DOWNLOAD_TIMEOUT'] = '99' + settings = SpiderSettings(BaseSpider('name'), crawler.settings) + self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 99) + + def test_crawler_defaults(self): + crawler = get_crawler({'DOWNLOAD_TIMEOUT': '3'}) + settings = SpiderSettings(BaseSpider('name'), crawler.settings) + self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 3) + + def test_spider_overrides_crawler(self): + crawler = get_crawler({'DOWNLOAD_TIMEOUT': '3'}) + crawler.settings.defaults['DOWNLOAD_TIMEOUT'] = '99' + settings = SpiderSettings(BaseSpider('name', DOWNLOAD_TIMEOUT='12'), crawler.settings) + self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 12) + + def test_overrides_most_precedence(self): + crawler = get_crawler({'DOWNLOAD_TIMEOUT': '3'}) + crawler.settings.overrides['DOWNLOAD_TIMEOUT'] = '15' + settings = SpiderSettings(BaseSpider('name', DOWNLOAD_TIMEOUT='12'), crawler.settings) + self.assertEqual(settings.getint('DOWNLOAD_TIMEOUT'), 15) + if __name__ == "__main__": unittest.main() From 9599bde3e90ea9758e3f74e39aa87d70779b9758 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 16:09:13 -0300 Subject: [PATCH 07/67] Removed RequestLimitMiddleware --- docs/topics/settings.rst | 13 ---- docs/topics/spider-middleware.rst | 19 ------ .../contrib/spidermiddleware/requestlimit.py | 65 ------------------- scrapy/settings/default_settings.py | 3 - 4 files changed, 100 deletions(-) delete mode 100644 scrapy/contrib/spidermiddleware/requestlimit.py diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst index e3b452419..0f2f99811 100644 --- a/docs/topics/settings.rst +++ b/docs/topics/settings.rst @@ -768,18 +768,6 @@ Default: ``+2`` Adjust redirect request priority relative to original request. A negative priority adjust means more priority. -.. setting:: REQUESTS_QUEUE_SIZE - -REQUESTS_QUEUE_SIZE -------------------- - -Default: ``0`` - -Scope: ``scrapy.contrib.spidermiddleware.limit`` - -If non zero, it will be used as an upper limit for the amount of requests that -can be scheduled per domain. - .. setting:: ROBOTSTXT_OBEY ROBOTSTXT_OBEY @@ -866,7 +854,6 @@ Default:: { 'scrapy.contrib.spidermiddleware.httperror.HttpErrorMiddleware': 50, 'scrapy.contrib.itemsampler.ItemSamplerMiddleware': 100, - 'scrapy.contrib.spidermiddleware.requestlimit.RequestLimitMiddleware': 200, 'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': 500, 'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': 700, 'scrapy.contrib.spidermiddleware.urllength.UrlLengthMiddleware': 800, diff --git a/docs/topics/spider-middleware.rst b/docs/topics/spider-middleware.rst index fbbdccfe8..1db93259a 100644 --- a/docs/topics/spider-middleware.rst +++ b/docs/topics/spider-middleware.rst @@ -245,25 +245,6 @@ RefererMiddleware Populates Request referer field, based on the Response which originated it. -RequestLimitMiddleware ----------------------- - -.. module:: scrapy.contrib.spidermiddleware.requestlimit - :synopsis: Request limit Spider Middleware - -.. class:: RequestLimitMiddleware - - Limits the maximum number of requests in the scheduler for each spider. When - a spider tries to schedule more than the allowed amount of requests, the new - requests (returned by the spider) will be dropped. - - The :class:`RequestLimitMiddleware` can be configured through the following - settings (see the settings documentation for more info): - - * :setting:`REQUESTS_QUEUE_SIZE` - If non zero, it will be used as an - upper limit for the amount of requests that can be scheduled per - domain. Can be set per spider using ``requests_queue_size`` attribute. - UrlLengthMiddleware ------------------- diff --git a/scrapy/contrib/spidermiddleware/requestlimit.py b/scrapy/contrib/spidermiddleware/requestlimit.py deleted file mode 100644 index bd52576f7..000000000 --- a/scrapy/contrib/spidermiddleware/requestlimit.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -Request Limit Spider middleware - -See documentation in docs/topics/spider-middleware.rst -""" -from itertools import imap -from scrapy.xlib.pydispatch import dispatcher - -from scrapy import signals -from scrapy.project import crawler -from scrapy.exceptions import NotConfigured -from scrapy.conf import settings -from scrapy.http import Request -from scrapy import log - -class RequestLimitMiddleware(object): - - def __init__(self): - self.max_queue_size = settings.getint("REQUESTS_QUEUE_SIZE") - if not self.max_queue_size: - raise NotConfigured - - self.max_pending = {} - self.dropped_count = {} - - dispatcher.connect(self.spider_opened, signal=signals.spider_opened) - dispatcher.connect(self.spider_closed, signal=signals.spider_closed) - - def spider_opened(self, spider): - self.max_pending[spider] = getattr(spider, 'requests_queue_size', self.max_queue_size) - self.dropped_count[spider] = 0 - - def spider_closed(self, spider): - dropped_count = self.dropped_count[spider] - if dropped_count: - max_pending = self.max_pending[spider] - log.msg('Dropped %d request(s) because the scheduler queue size limit (%d requests) was exceeded' % \ - (dropped_count, max_pending), level=log.DEBUG, spider=spider) - del self.dropped_count[spider] - del self.max_pending[spider] - - def process_spider_output(self, response, result, spider): - max_pending = self.max_pending.get(spider, 0) - if max_pending: - return imap(lambda v: self._limit_requests(v, spider, max_pending), result) - else: - return result - - def _limit_requests(self, request_or_other, spider, max_pending): - if isinstance(request_or_other, Request): - free_slots = max_pending - self._pending_count(spider) - if free_slots > 0: - # Scheduler isn't saturated and it is fine to schedule more requests. - return request_or_other - else: - # Skip the request and give engine time to handle other tasks. - self.dropped_count[spider] += 1 - return None - else: - # Return others (non-requests) as is. - return request_or_other - - def _pending_count(self, spider): - pending = crawler.engine.scheduler.pending_requests.get(spider, []) - return len(pending) diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index 724f24237..4f0071a96 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -194,8 +194,6 @@ REDIRECT_MAX_METAREFRESH_DELAY = 100 REDIRECT_MAX_TIMES = 20 # uses Firefox default setting REDIRECT_PRIORITY_ADJUST = +2 -REQUESTS_QUEUE_SIZE = 0 - # contrib.middleware.retry.RetryMiddleware default settings RETRY_TIMES = 2 # initial response + 2 retries = 3 requests RETRY_HTTP_CODES = ['500', '503', '504', '400', '408'] @@ -220,7 +218,6 @@ SPIDER_MIDDLEWARES = {} SPIDER_MIDDLEWARES_BASE = { # Engine side 'scrapy.contrib.spidermiddleware.httperror.HttpErrorMiddleware': 50, - 'scrapy.contrib.spidermiddleware.requestlimit.RequestLimitMiddleware': 200, 'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': 500, 'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': 700, 'scrapy.contrib.spidermiddleware.urllength.UrlLengthMiddleware': 800, From f29b346f793e58743eb62e6224f780566d7933da Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 22 Sep 2010 22:21:29 -0300 Subject: [PATCH 08/67] Fixed access to settings module name, broken after recent changes to Settings classes --- scrapy/cmdline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy/cmdline.py b/scrapy/cmdline.py index 9706828ed..134d88bb0 100644 --- a/scrapy/cmdline.py +++ b/scrapy/cmdline.py @@ -89,7 +89,7 @@ def _check_deprecated_scrapy_ctl(argv, inproject): with open(cfg_path, 'w') as f: f.write("# generated automatically - feel free to edit" + os.linesep) f.write("[settings]" + os.linesep) - f.write("default = %s" % settings.settings_module_path + os.linesep) + f.write("default = %s" % settings.settings_module.__name__ + os.linesep) def _run_print_help(parser, func, *a, **kw): try: From 37c25fe9a89f5f319d781738d3e8f7631ac6668a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 12:32:49 -0300 Subject: [PATCH 09/67] Fixed CrawlerSettings.__str__() method when settings_module is None --- scrapy/settings/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 7ca18b3ca..55374de76 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -56,7 +56,11 @@ class CrawlerSettings(Settings): return super(CrawlerSettings, self).__getitem__(opt_name) def __str__(self): - return "" % self.settings_module.__name__ + if self.settings_module: + return "" % \ + (self.settings_module.__name__, self.settings_module.__file__) + else: + return "" class SpiderSettings(Settings): From 754d0f53f9d6381e9eeb2b87fe23a0c0ef01e6f1 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 12:33:24 -0300 Subject: [PATCH 10/67] Fixed unbounded spider error in shell, and enclosed fetch() method in a try/except block for logging errors more reliably --- scrapy/shell.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scrapy/shell.py b/scrapy/shell.py index a4f4594b0..573a42147 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -56,23 +56,26 @@ class Shell(object): if spider is None: spider = create_spider_for_request(self.crawler.spiders, request, \ BaseSpider('default'), log_multiple=True) + spider.set_crawler(self.crawler) self.crawler.engine.open_spider(spider) return self.crawler.engine.schedule(request, spider) def fetch(self, request_or_url, spider=None): - if isinstance(request_or_url, Request): - request = request_or_url - url = request.url - else: - url = any_to_uri(request_or_url) - request = Request(url, dont_filter=True) - response = None + # we enclose all this code in a try/except block to see errors when + # they happen in a thread try: + if isinstance(request_or_url, Request): + request = request_or_url + url = request.url + else: + url = any_to_uri(request_or_url) + request = Request(url, dont_filter=True) + response = None response = threads.blockingCallFromThread(reactor, \ self._schedule, request, spider) + self.populate_vars(url, response, request, spider) except: - log.err(Failure(), "Error fetching response", spider=spider) - self.populate_vars(url, response, request, spider) + log.err(Failure(), "Error fetching: %s" % request_or_url, spider=spider) def populate_vars(self, url=None, response=None, request=None, spider=None): item = self.item_class() From 79c0e34968a740f67c3ee3df4aff5a4c93adadbd Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 12:50:46 -0300 Subject: [PATCH 11/67] Simplified CrawlerSettings.__str__() --- scrapy/settings/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 55374de76..42cc35121 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -56,11 +56,7 @@ class CrawlerSettings(Settings): return super(CrawlerSettings, self).__getitem__(opt_name) def __str__(self): - if self.settings_module: - return "" % \ - (self.settings_module.__name__, self.settings_module.__file__) - else: - return "" + return "" % self.settings_module class SpiderSettings(Settings): From a5ee05e8140e0a055bfecb6283bfbd432a66418f Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 13:43:21 -0300 Subject: [PATCH 12/67] Added support for setting exit code in Scrapy commands. Closes #248 --- scrapy/cmdline.py | 1 + scrapy/command.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/scrapy/cmdline.py b/scrapy/cmdline.py index 134d88bb0..6884aad88 100644 --- a/scrapy/cmdline.py +++ b/scrapy/cmdline.py @@ -128,6 +128,7 @@ def execute(argv=None): opts, args = parser.parse_args(args=argv[1:]) _run_print_help(parser, cmd.process_options, args, opts) _run_print_help(parser, _run_command, cmd, args, opts) + sys.exit(cmd.exitcode) def _run_command(cmd, args, opts): if opts.profile or opts.lsprof: diff --git a/scrapy/command.py b/scrapy/command.py index a9c447e38..dc2de9ac8 100644 --- a/scrapy/command.py +++ b/scrapy/command.py @@ -21,6 +21,8 @@ class ScrapyCommand(object): # default settings to be used for this command instead of global defaults default_settings = {} + exitcode = 0 + def set_crawler(self, crawler): self._crawler = crawler From 318f7f4c58f6031485ba8966aff55676b77b7e62 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 13:49:29 -0300 Subject: [PATCH 13/67] Added support for passing code to evaluate in Scrapy shell command (closes #249) and simplified handling of shell errors --- scrapy/commands/shell.py | 16 ++++++++++++++-- scrapy/shell.py | 36 ++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/scrapy/commands/shell.py b/scrapy/commands/shell.py index 20a82c6d9..ae4426d2f 100644 --- a/scrapy/commands/shell.py +++ b/scrapy/commands/shell.py @@ -6,6 +6,7 @@ See documentation in docs/topics/shell.rst from scrapy.command import ScrapyCommand from scrapy.shell import Shell +from scrapy import log class Command(ScrapyCommand): @@ -21,6 +22,11 @@ class Command(ScrapyCommand): def long_desc(self): return "Interactive console for scraping the given url" + def add_options(self, parser): + ScrapyCommand.add_options(self, parser) + parser.add_option("-c", dest="code", + help="evaluate the code in the shell, print the result and exit") + def update_vars(self, vars): """You can use this function to update the Scrapy objects that will be available in the shell @@ -29,6 +35,12 @@ class Command(ScrapyCommand): def run(self, args, opts): url = args[0] if args else None - shell = Shell(self.crawler, update_vars=self.update_vars, inthread=True) - shell.start(url=url).addBoth(lambda _: self.crawler.stop()) + shell = Shell(self.crawler, update_vars=self.update_vars, inthread=True, \ + code=opts.code) + def err(f): + log.err(f, "Shell error") + self.exitcode = 1 + d = shell.start(url=url) + d.addErrback(err) + d.addBoth(lambda _: self.crawler.stop()) self.crawler.start() diff --git a/scrapy/shell.py b/scrapy/shell.py index 573a42147..cb6706f86 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -27,12 +27,13 @@ class Shell(object): relevant_classes = (BaseSpider, Request, Response, BaseItem, \ XPathSelector, Settings) - def __init__(self, crawler, update_vars=None, inthread=False): + def __init__(self, crawler, update_vars=None, inthread=False, code=None): self.crawler = crawler self.vars = {} self.update_vars = update_vars or (lambda x: None) self.item_class = load_object(settings['DEFAULT_ITEM_CLASS']) self.inthread = inthread + self.code = code def start(self, *a, **kw): # disable accidental Ctrl-C key press from shutting down the engine @@ -50,7 +51,10 @@ class Shell(object): elif response: request = response.request self.populate_vars(request.url, response, request, spider) - start_python_console(self.vars) + if self.code: + print eval(self.code, globals(), self.vars) + else: + start_python_console(self.vars) def _schedule(self, request, spider): if spider is None: @@ -61,21 +65,16 @@ class Shell(object): return self.crawler.engine.schedule(request, spider) def fetch(self, request_or_url, spider=None): - # we enclose all this code in a try/except block to see errors when - # they happen in a thread - try: - if isinstance(request_or_url, Request): - request = request_or_url - url = request.url - else: - url = any_to_uri(request_or_url) - request = Request(url, dont_filter=True) - response = None - response = threads.blockingCallFromThread(reactor, \ - self._schedule, request, spider) - self.populate_vars(url, response, request, spider) - except: - log.err(Failure(), "Error fetching: %s" % request_or_url, spider=spider) + if isinstance(request_or_url, Request): + request = request_or_url + url = request.url + else: + url = any_to_uri(request_or_url) + request = Request(url, dont_filter=True) + response = None + response = threads.blockingCallFromThread(reactor, \ + self._schedule, request, spider) + self.populate_vars(url, response, request, spider) def populate_vars(self, url=None, response=None, request=None, spider=None): item = self.item_class() @@ -93,7 +92,8 @@ class Shell(object): self.vars['view'] = open_in_browser self.vars['shelp'] = self.print_help self.update_vars(self.vars) - self.print_help() + if not self.code: + self.print_help() def print_help(self): self.p("Available Scrapy objects:") From b78284b680c36884e9520d7d42c3bc256c97b4bc Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 13:59:41 -0300 Subject: [PATCH 14/67] Fixed spider variable not properly populated in the Scrapy shell --- scrapy/shell.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scrapy/shell.py b/scrapy/shell.py index cb6706f86..a2bd5d7a3 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -62,7 +62,9 @@ class Shell(object): BaseSpider('default'), log_multiple=True) spider.set_crawler(self.crawler) self.crawler.engine.open_spider(spider) - return self.crawler.engine.schedule(request, spider) + d = self.crawler.engine.schedule(request, spider) + d.addCallback(lambda x: (x, spider)) + return d def fetch(self, request_or_url, spider=None): if isinstance(request_or_url, Request): @@ -72,7 +74,7 @@ class Shell(object): url = any_to_uri(request_or_url) request = Request(url, dont_filter=True) response = None - response = threads.blockingCallFromThread(reactor, \ + response, spider = threads.blockingCallFromThread(reactor, \ self._schedule, request, spider) self.populate_vars(url, response, request, spider) From 622834bc089d3462ede466e4d46975e878e1da47 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 23 Sep 2010 14:01:22 -0300 Subject: [PATCH 15/67] Removed unused imports, and use crawler.settings instead of scrapy.conf.settings in Scrapy Shell --- scrapy/shell.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scrapy/shell.py b/scrapy/shell.py index a2bd5d7a3..5c245bbe3 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -7,9 +7,7 @@ See documentation in docs/topics/shell.rst import signal from twisted.internet import reactor, threads -from twisted.python.failure import Failure -from scrapy import log from scrapy.item import BaseItem from scrapy.spider import BaseSpider from scrapy.selector import XPathSelector, XmlXPathSelector, HtmlXPathSelector @@ -18,7 +16,6 @@ from scrapy.utils.misc import load_object from scrapy.utils.response import open_in_browser from scrapy.utils.url import any_to_uri from scrapy.utils.console import start_python_console -from scrapy.conf import settings from scrapy.settings import Settings from scrapy.http import Request, Response, TextResponse @@ -31,7 +28,7 @@ class Shell(object): self.crawler = crawler self.vars = {} self.update_vars = update_vars or (lambda x: None) - self.item_class = load_object(settings['DEFAULT_ITEM_CLASS']) + self.item_class = load_object(crawler.settings['DEFAULT_ITEM_CLASS']) self.inthread = inthread self.code = code @@ -81,7 +78,7 @@ class Shell(object): def populate_vars(self, url=None, response=None, request=None, spider=None): item = self.item_class() self.vars['item'] = item - self.vars['settings'] = settings + self.vars['settings'] = self.crawler.settings if url: if isinstance(response, TextResponse): self.vars['xxs'] = XmlXPathSelector(response) From 279dcc245f73db08f28c4f6fea053e65f3c7064a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Sun, 26 Sep 2010 01:01:06 -0300 Subject: [PATCH 16/67] Fixed role name in Sphinx doc --- docs/topics/commands.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/commands.rst b/docs/topics/commands.rst index 6339a4607..0ea9e13db 100644 --- a/docs/topics/commands.rst +++ b/docs/topics/commands.rst @@ -73,7 +73,7 @@ information on which commands must be run from inside projects, and which not. Also keep in mind that some commands may have slightly different behaviours when running them from inside projects. For example, the fetch command will use -spider-overridden behaviours (such as custom :settings:`USER_AGENT` per-spider +spider-overridden behaviours (such as custom :setting:`USER_AGENT` per-spider setting) if the url being fetched is associated with some specific spider. This is intentional, as the ``fetch`` command is meant to be used to check how spiders are downloading pages. From 0bf9e4627cfcc477f23fb81edabbad85c24911bd Mon Sep 17 00:00:00 2001 From: Martin Santos Date: Tue, 28 Sep 2010 16:29:37 -0300 Subject: [PATCH 17/67] added support to CloseSpider extension, for close the spider after N pages have been crawled. Using the CLOSESPIDER_PAGECOUNT setting. closes #253 --- docs/topics/extensions.rst | 14 ++++++++++++++ scrapy/contrib/closespider.py | 11 ++++++++++- scrapy/settings/default_settings.py | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/topics/extensions.rst b/docs/topics/extensions.rst index 539d4ef1f..e2f12fbce 100644 --- a/docs/topics/extensions.rst +++ b/docs/topics/extensions.rst @@ -302,6 +302,20 @@ that amount if items and those items are passed by the item pipeline, the spider will be closed with the reason ``closespider_itempassed``. If zero (or non set), spiders won't be closed by number of passed items. +.. setting:: CLOSESPIDER_PAGECOUNT + +CLOSESPIDER_PAGECOUNT +"""""""""""""""""""""" + +Default: ``0`` + +.. versionadded: 0.11 + +An integer which specifies the maximum number of responses to crawl. If the spider +crawls more than that, the spider will be closed with the reason +``closespider_pagecount``. If zero (or non set), spiders won't be closed by +number of crawled responses. + StatsMailer extension ~~~~~~~~~~~~~~~~~~~~~ diff --git a/scrapy/contrib/closespider.py b/scrapy/contrib/closespider.py index a334c155a..0a04309cf 100644 --- a/scrapy/contrib/closespider.py +++ b/scrapy/contrib/closespider.py @@ -18,21 +18,30 @@ class CloseSpider(object): def __init__(self): self.timeout = settings.getint('CLOSESPIDER_TIMEOUT') self.itempassed = settings.getint('CLOSESPIDER_ITEMPASSED') + self.pagecount = settings.getint('CLOSESPIDER_PAGECOUNT') + self.pagecounts = defaultdict(int) self.counts = defaultdict(int) self.tasks = {} + if self.pagecount: + dispatcher.connect(self.page_count, signal=signals.response_received) if self.timeout: dispatcher.connect(self.spider_opened, signal=signals.spider_opened) if self.itempassed: dispatcher.connect(self.item_passed, signal=signals.item_passed) dispatcher.connect(self.spider_closed, signal=signals.spider_closed) + def page_count(self, response, request, spider): + self.pagecounts[spider] += 1 + if self.pagecounts[spider] == self.pagecount: + crawler.engine.close_spider(spider, 'closespider_pagecount') + def spider_opened(self, spider): self.tasks[spider] = reactor.callLater(self.timeout, \ crawler.engine.close_spider, spider=spider, \ reason='closespider_timeout') - + def item_passed(self, item, spider): self.counts[spider] += 1 if self.counts[spider] == self.itempassed: diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index 4f0071a96..0b6703189 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -19,6 +19,7 @@ BOT_NAME = 'scrapybot' BOT_VERSION = '1.0' CLOSESPIDER_TIMEOUT = 0 +CLOSESPIDER_PAGECOUNT = 0 CLOSESPIDER_ITEMPASSED = 0 COMMANDS_MODULE = '' From 7826869cb25412a743414822b8b10e2e817de460 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 28 Sep 2010 16:44:53 -0300 Subject: [PATCH 18/67] Added missing colon --- docs/topics/extensions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/extensions.rst b/docs/topics/extensions.rst index e2f12fbce..e30c389e4 100644 --- a/docs/topics/extensions.rst +++ b/docs/topics/extensions.rst @@ -309,13 +309,13 @@ CLOSESPIDER_PAGECOUNT Default: ``0`` -.. versionadded: 0.11 - An integer which specifies the maximum number of responses to crawl. If the spider crawls more than that, the spider will be closed with the reason ``closespider_pagecount``. If zero (or non set), spiders won't be closed by number of crawled responses. +.. versionadded:: 0.11 + StatsMailer extension ~~~~~~~~~~~~~~~~~~~~~ From d15a97ff61295a2c869bf4b034756b6480a68860 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 28 Sep 2010 16:45:05 -0300 Subject: [PATCH 19/67] Updated Scrapy version in debian/changelog --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index a01ddd7bb..46d5d3be1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -scrapy (0.10) unstable; urgency=low +scrapy (0.11) unstable; urgency=low * Initial release. From 2d40705ea00bbc0ce1846dbe675c133cd546d9a7 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 30 Sep 2010 20:17:44 -0300 Subject: [PATCH 20/67] CloseSpider extension: Added support for closing spider after N errors have been raised. Closes #254 --- scrapy/contrib/closespider.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scrapy/contrib/closespider.py b/scrapy/contrib/closespider.py index 0a04309cf..49fe6ecb7 100644 --- a/scrapy/contrib/closespider.py +++ b/scrapy/contrib/closespider.py @@ -7,9 +7,10 @@ See documentation in docs/topics/extensions.rst from collections import defaultdict from twisted.internet import reactor +from twisted.python import log as txlog from scrapy.xlib.pydispatch import dispatcher -from scrapy import signals +from scrapy import signals, log from scrapy.project import crawler from scrapy.conf import settings @@ -19,11 +20,15 @@ class CloseSpider(object): self.timeout = settings.getint('CLOSESPIDER_TIMEOUT') self.itempassed = settings.getint('CLOSESPIDER_ITEMPASSED') self.pagecount = settings.getint('CLOSESPIDER_PAGECOUNT') + self.errorcount = settings.getint('CLOSESPIDER_ERRORCOUNT') + self.errorcounts = defaultdict(int) self.pagecounts = defaultdict(int) self.counts = defaultdict(int) self.tasks = {} + if self.errorcount: + txlog.addObserver(self.catch_log) if self.pagecount: dispatcher.connect(self.page_count, signal=signals.response_received) if self.timeout: @@ -32,6 +37,14 @@ class CloseSpider(object): dispatcher.connect(self.item_passed, signal=signals.item_passed) dispatcher.connect(self.spider_closed, signal=signals.spider_closed) + def catch_log(self, event): + if event.get('logLevel') == log.ERROR: + spider = event.get('spider') + if spider: + self.errorcounts[spider] += 1 + if self.errorcounts[spider] == self.errorcount: + crawler.engine.close_spider(spider, 'closespider_errorcount') + def page_count(self, response, request, spider): self.pagecounts[spider] += 1 if self.pagecounts[spider] == self.pagecount: @@ -49,6 +62,8 @@ class CloseSpider(object): def spider_closed(self, spider): self.counts.pop(spider, None) + self.pagecounts.pop(spider, None) + self.errorcounts.pop(spider, None) tsk = self.tasks.pop(spider, None) if tsk and tsk.active(): tsk.cancel() From fafaee51d558e74ff6cd223aabf7089b1f994168 Mon Sep 17 00:00:00 2001 From: Martin Olveyra Date: Thu, 7 Oct 2010 14:55:00 -0200 Subject: [PATCH 21/67] htmlpage tests reorganization and fixes: improved how differences between expected and result are shown, and check also correct parsing of tag_type --- .../samples/samples_htmlpage_0.html | 190 + .../samples/samples_htmlpage_0.json | 3091 +++ .../samples/samples_htmlpage_1.html | 30 + .../samples/samples_htmlpage_1.json | 21944 ++++++++++++++++ .../samples/samples_htmlpage_2.html | 31 + .../samples/samples_htmlpage_2.json | 21768 +++++++++++++++ .../samples/samples_pageparsing_0.html | 632 + .../samples/samples_pageparsing_0.json | 78 + .../test_contrib_ibl/samples_htmlpage.json.gz | Bin 105488 -> 0 bytes .../samples_pageparsing.json.gz | Bin 9026 -> 0 bytes .../tests/test_contrib_ibl/test_htmlpage.py | 75 +- .../test_contrib_ibl/test_htmlpage_data.py | 2 +- .../test_contrib_ibl/test_pageparsing.py | 18 +- 13 files changed, 47814 insertions(+), 45 deletions(-) create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.html create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.html create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.html create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.html create mode 100644 scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.json delete mode 100644 scrapy/tests/test_contrib_ibl/samples_htmlpage.json.gz delete mode 100644 scrapy/tests/test_contrib_ibl/samples_pageparsing.json.gz diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.html b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.html new file mode 100644 index 000000000..f0d980b5d --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.html @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + +retrosixty - Charlotte Perriand Infraphil lamp, c1960s for Philips, Netherlands + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+

+ retrosixty

+

+ retrosixty

  +
+

+ + Home

+ + About Us

+ + Shipping

+ + Links

+ + Contact

  +

+ + Furniture

+ + Lighting

+ + Technology

+ + Ceramics

+ + Art

+ + Misc. Items

+ + Contemporary

+

+ + Lighting..

+

+ Please click the thumbnails for larger + images and the back button to return to the Lighting index.

+ + + + + +
+

+  

+ + +

+ +

+ +

+ +

+  

+  

+  

+

+ Designer: + + + Charlotte Perriand    

+ Manufacturer: + + Philips, Netherlands +  

+ Description: + + + + A Perriand designed 'infraphil' infrared heat lamp + designed in c1960s. This example is in good vintage + condition with some minor wear as one would expect. + Original Philips sticker intact, although it has some + wear as pictured. +

+ + As with all electrical items we always + recommend having them tested by a professional prior to + use although it is in full working order. The lamp can + be used as a table lamp, or mounted on the wall - full + adjustable...

+ Price: Â£60

+ Size: + + N/A +     +    

+ Shipping: + + £7 to mainland UK. + Please enquire for other locations.

+ Ref #: 0642

+  

+ + +

+ + + << BACK

+
+

+ retrosixty

+

+ retrosixty

+

+ retrosixty

+
+

+ retrosixty

+

+ Site Layout, Design & + Content Copyright 2006-09 - retrosixty.co.uk

+
+ + \ No newline at end of file diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json new file mode 100644 index 000000000..13fb0d730 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json @@ -0,0 +1,3091 @@ +[ + { + "attributes": {}, + "tag": "head", + "end": 6, + "start": 0, + "tag_type": 1 + }, + { + "start": 6, + "end": 11 + }, + { + "attributes": { + "content": "text/html; charset=utf-8", + "http-equiv": "Content-Type" + }, + "tag": "meta", + "end": 78, + "start": 11, + "tag_type": 1 + }, + { + "start": 78, + "end": 79 + }, + { + "attributes": { + "content": "Site Layout, Design & Content Copyright 2005 - retrosixty.co.uk", + "name": "Copyright" + }, + "tag": "meta", + "end": 180, + "start": 79, + "tag_type": 1 + }, + { + "start": 180, + "end": 181 + }, + { + "attributes": { + "content": "EN", + "http-equiv": "content-language" + }, + "tag": "meta", + "end": 230, + "start": 181, + "tag_type": 1 + }, + { + "start": 230, + "end": 231 + }, + { + "attributes": { + "content": "Max Williams", + "name": "Designer" + }, + "tag": "meta", + "end": 276, + "start": 231, + "tag_type": 1 + }, + { + "start": 276, + "end": 277 + }, + { + "attributes": { + "content": "retrosixty, retro sixty, retro, furniture, retro furniture, lighting ,retro lighting, art, retro art, ceramics, retro ceramics, technology, retro technology, fifties, sixties, seventies, 20th century design, post-war, post-war decorative, retro accessories", + "name": "Keywords" + }, + "tag": "meta", + "end": 566, + "start": 277, + "tag_type": 1 + }, + { + "start": 566, + "end": 567 + }, + { + "attributes": { + "content": "retrosixty - retrosixty.co.uk", + "name": "Title" + }, + "tag": "meta", + "end": 626, + "start": 567, + "tag_type": 1 + }, + { + "start": 626, + "end": 627 + }, + { + "attributes": { + "content": "7", + "name": "revisit-after" + }, + "tag": "meta", + "end": 666, + "start": 627, + "tag_type": 1 + }, + { + "start": 666, + "end": 667 + }, + { + "attributes": { + "content": "index,follow", + "name": "Robots" + }, + "tag": "meta", + "end": 710, + "start": 667, + "tag_type": 1 + }, + { + "start": 710, + "end": 711 + }, + { + "attributes": { + "content": "Dealers of retro furniture, post-war decorative and fine arts.", + "name": "Description" + }, + "tag": "meta", + "end": 809, + "start": 711, + "tag_type": 1 + }, + { + "start": 809, + "end": 810 + }, + { + "attributes": { + "content": "no-cache", + "http-equiv": "Cache-Control" + }, + "tag": "meta", + "end": 862, + "start": 810, + "tag_type": 1 + }, + { + "start": 862, + "end": 863 + }, + { + "attributes": { + "content": "0", + "http-equiv": "Expires" + }, + "tag": "meta", + "end": 902, + "start": 863, + "tag_type": 1 + }, + { + "start": 902, + "end": 903 + }, + { + "attributes": { + "content": "Nick Waters", + "name": "Author" + }, + "tag": "meta", + "end": 945, + "start": 903, + "tag_type": 1 + }, + { + "start": 945, + "end": 947 + }, + { + "attributes": {}, + "tag": "title", + "end": 954, + "start": 947, + "tag_type": 1 + }, + { + "start": 954, + "end": 1033 + }, + { + "attributes": {}, + "tag": "title", + "end": 1041, + "start": 1033, + "tag_type": 2 + }, + { + "start": 1041, + "end": 1043 + }, + { + "attributes": { + "language": "JavaScript" + }, + "tag": "script", + "end": 1073, + "start": 1043, + "tag_type": 1 + }, + { + "start": 1073, + "end": 2053 + }, + { + "attributes": {}, + "tag": "script", + "end": 2062, + "start": 2053, + "tag_type": 2 + }, + { + "start": 2062, + "end": 2064 + }, + { + "attributes": { + "fprolloverstyle": null + }, + "tag": "style", + "end": 2090, + "start": 2064, + "tag_type": 1 + }, + { + "start": 2090, + "end": 2154 + }, + { + "attributes": {}, + "tag": "style", + "end": 2162, + "start": 2154, + "tag_type": 2 + }, + { + "start": 2162, + "end": 2164 + }, + { + "attributes": { + "type": "text/css", + "id": "mydeco-style" + }, + "tag": "style", + "end": 2205, + "start": 2164, + "tag_type": 1 + }, + { + "start": 2205, + "end": 2265 + }, + { + "attributes": {}, + "tag": "style", + "end": 2273, + "start": 2265, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "head", + "end": 2280, + "start": 2273, + "tag_type": 2 + }, + { + "attributes": { + "onload": null, + "bottommargin": "0", + "topmargin": "0", + "rightmargin": "0", + "alink": "#000000", + "bgcolor": "#c0c0c0", + "link": "#000000", + "vlink": "#000000", + "leftmargin": "0" + }, + "tag": "body", + "end": 2423, + "start": 2280, + "tag_type": 1 + }, + { + "start": 2423, + "end": 2425 + }, + { + "attributes": { + "align": "center", + "class": "mydeco-selected" + }, + "tag": "div", + "end": 2469, + "start": 2425, + "tag_type": 1 + }, + { + "start": 2469, + "end": 2471 + }, + { + "attributes": { + "bgcolor": "#ffffff", + "border": "0", + "height": "100%", + "width": "765", + "cellpadding": "0", + "cellspacing": "0", + "id": "table1" + }, + "tag": "table", + "end": 2577, + "start": 2471, + "tag_type": 1 + }, + { + "start": 2577, + "end": 2580 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 2587, + "start": 2580, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 2591, + "start": 2587, + "tag_type": 1 + }, + { + "start": 2591, + "end": 2595 + }, + { + "attributes": { + "colspan": "3", + "style": "border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);", + "align": "center", + "height": "120" + }, + "tag": "td", + "end": 2722, + "start": 2595, + "tag_type": 1 + }, + { + "start": 2722, + "end": 2726 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 2744, + "start": 2726, + "tag_type": 1 + }, + { + "start": 2744, + "end": 2748 + }, + { + "attributes": { + "src": "../images/logo.jpg", + "alt": "retrosixty", + "border": "0", + "width": "745", + "height": "102" + }, + "tag": "img", + "end": 2831, + "start": 2748, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 2835, + "start": 2831, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 2840, + "start": 2835, + "tag_type": 2 + }, + { + "start": 2840, + "end": 2843 + }, + { + "attributes": {}, + "tag": "tr", + "end": 2848, + "start": 2843, + "tag_type": 2 + }, + { + "start": 2848, + "end": 2851 + }, + { + "attributes": {}, + "tag": "tr", + "end": 2855, + "start": 2851, + "tag_type": 1 + }, + { + "start": 2855, + "end": 2859 + }, + { + "attributes": { + "width": "177", + "style": "border-left: 1px solid rgb(0, 0, 0);", + "height": "20" + }, + "tag": "td", + "end": 2932, + "start": 2859, + "tag_type": 1 + }, + { + "start": 2932, + "end": 2936 + }, + { + "attributes": { + "style": "margin-left: 10px;" + }, + "tag": "p", + "end": 2966, + "start": 2936, + "tag_type": 1 + }, + { + "start": 2966, + "end": 2970 + }, + { + "attributes": { + "src": "../images/top.gif", + "alt": "retrosixty", + "border": "0", + "width": "160", + "height": "20" + }, + "tag": "img", + "end": 3051, + "start": 2970, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 3055, + "start": 3051, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 3060, + "start": 3055, + "tag_type": 2 + }, + { + "start": 3060, + "end": 3064 + }, + { + "attributes": { + "colspan": "2", + "style": "border-right: 1px solid rgb(0, 0, 0);", + "width": "586", + "height": "20" + }, + "tag": "td", + "end": 3150, + "start": 3064, + "tag_type": 1 + }, + { + "start": 3150, + "end": 3160 + }, + { + "attributes": {}, + "tag": "td", + "end": 3165, + "start": 3160, + "tag_type": 2 + }, + { + "start": 3165, + "end": 3168 + }, + { + "attributes": {}, + "tag": "tr", + "end": 3173, + "start": 3168, + "tag_type": 2 + }, + { + "start": 3173, + "end": 3176 + }, + { + "attributes": {}, + "tag": "tr", + "end": 3180, + "start": 3176, + "tag_type": 1 + }, + { + "start": 3180, + "end": 3184 + }, + { + "attributes": { + "width": "180", + "style": "border-left: 1px solid rgb(0, 0, 0);", + "background": "../images/bg.gif", + "valign": "top" + }, + "tag": "td", + "end": 3288, + "start": 3184, + "tag_type": 1 + }, + { + "start": 3288, + "end": 3292 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 3355, + "start": 3292, + "tag_type": 1 + }, + { + "start": 3355, + "end": 3359 + }, + { + "attributes": { + "href": "../index.html" + }, + "tag": "a", + "end": 3383, + "start": 3359, + "tag_type": 1 + }, + { + "start": 3383, + "end": 3387 + }, + { + "attributes": { + "src": "../buttons/button3.jpg", + "onmouseout": null, + "fp-title": "Home", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Home", + "border": "0", + "id": "img31", + "fp-style": "fp-btn: Linked Column 9; fp-font-style: Bold; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 3637, + "start": 3387, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 3641, + "start": 3637, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 3645, + "start": 3641, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 3708, + "start": 3645, + "tag_type": 1 + }, + { + "start": 3708, + "end": 3712 + }, + { + "attributes": { + "href": "../about.html" + }, + "tag": "a", + "end": 3736, + "start": 3712, + "tag_type": 1 + }, + { + "start": 3736, + "end": 3740 + }, + { + "attributes": { + "src": "../buttons/button32.jpg", + "onmouseout": null, + "fp-title": "About Us", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "About Us", + "border": "0", + "id": "img42", + "fp-style": "fp-btn: Linked Column 9; fp-font-style: Bold; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 3999, + "start": 3740, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 4003, + "start": 3999, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 4007, + "start": 4003, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 4070, + "start": 4007, + "tag_type": 1 + }, + { + "start": 4070, + "end": 4074 + }, + { + "attributes": { + "href": "../shipping.html" + }, + "tag": "a", + "end": 4101, + "start": 4074, + "tag_type": 1 + }, + { + "start": 4101, + "end": 4105 + }, + { + "attributes": { + "src": "../buttons/button34.jpg", + "onmouseout": null, + "fp-title": "Shipping", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Shipping", + "border": "0", + "id": "img43", + "fp-style": "fp-btn: Linked Column 9; fp-font-style: Bold; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 4364, + "start": 4105, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 4368, + "start": 4364, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 4372, + "start": 4368, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 4435, + "start": 4372, + "tag_type": 1 + }, + { + "start": 4435, + "end": 4439 + }, + { + "attributes": { + "href": "../links.html" + }, + "tag": "a", + "end": 4463, + "start": 4439, + "tag_type": 1 + }, + { + "start": 4463, + "end": 4467 + }, + { + "attributes": { + "src": "../buttons/button1.jpg", + "onmouseout": null, + "fp-title": "Links", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Links", + "border": "0", + "id": "img45", + "fp-style": "fp-btn: Linked Column 9; fp-font-style: Bold; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0; fp-orig: 0" + }, + "tag": "img", + "end": 4731, + "start": 4467, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 4735, + "start": 4731, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 4739, + "start": 4735, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 4802, + "start": 4739, + "tag_type": 1 + }, + { + "start": 4802, + "end": 4806 + }, + { + "attributes": { + "href": "../contact.php" + }, + "tag": "a", + "end": 4831, + "start": 4806, + "tag_type": 1 + }, + { + "start": 4831, + "end": 4835 + }, + { + "attributes": { + "src": "../buttons/button36.jpg", + "onmouseout": null, + "fp-title": "Contact", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Contact", + "border": "0", + "id": "img44", + "fp-style": "fp-btn: Linked Column 9; fp-font-style: Bold; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 5092, + "start": 4835, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 5096, + "start": 5092, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 5100, + "start": 5096, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 5163, + "start": 5100, + "tag_type": 1 + }, + { + "start": 5163, + "end": 5173 + }, + { + "attributes": {}, + "tag": "p", + "end": 5177, + "start": 5173, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 5240, + "start": 5177, + "tag_type": 1 + }, + { + "start": 5240, + "end": 5244 + }, + { + "attributes": { + "href": "../furniture.html" + }, + "tag": "a", + "end": 5272, + "start": 5244, + "tag_type": 1 + }, + { + "start": 5272, + "end": 5276 + }, + { + "attributes": { + "src": "../buttons/buttonB.jpg", + "onmouseout": null, + "fp-title": "Furniture", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Furniture", + "border": "0", + "id": "img33", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 5515, + "start": 5276, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 5519, + "start": 5515, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 5523, + "start": 5519, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 5586, + "start": 5523, + "tag_type": 1 + }, + { + "start": 5586, + "end": 5590 + }, + { + "attributes": { + "href": "../lighting.html" + }, + "tag": "a", + "end": 5617, + "start": 5590, + "tag_type": 1 + }, + { + "start": 5617, + "end": 5621 + }, + { + "attributes": { + "src": "../buttons/buttonD.jpg", + "onmouseout": null, + "fp-title": "Lighting", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Lighting", + "border": "0", + "id": "img34", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 5858, + "start": 5621, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 5862, + "start": 5858, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 5866, + "start": 5862, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 5929, + "start": 5866, + "tag_type": 1 + }, + { + "start": 5929, + "end": 5933 + }, + { + "attributes": { + "href": "../tech.html" + }, + "tag": "a", + "end": 5956, + "start": 5933, + "tag_type": 1 + }, + { + "start": 5956, + "end": 5960 + }, + { + "attributes": { + "src": "../buttons/buttonF.jpg", + "onmouseout": null, + "fp-title": "Technology", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Technology", + "border": "0", + "id": "img35", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 6201, + "start": 5960, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 6205, + "start": 6201, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 6209, + "start": 6205, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 6272, + "start": 6209, + "tag_type": 1 + }, + { + "start": 6272, + "end": 6276 + }, + { + "attributes": { + "href": "../ceramics.html" + }, + "tag": "a", + "end": 6303, + "start": 6276, + "tag_type": 1 + }, + { + "start": 6303, + "end": 6307 + }, + { + "attributes": { + "src": "../buttons/button11.jpg", + "onmouseout": null, + "fp-title": "Ceramics", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Ceramics", + "border": "0", + "id": "img36", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 6545, + "start": 6307, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 6549, + "start": 6545, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 6553, + "start": 6549, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 6616, + "start": 6553, + "tag_type": 1 + }, + { + "start": 6616, + "end": 6620 + }, + { + "attributes": { + "href": "../art.html" + }, + "tag": "a", + "end": 6642, + "start": 6620, + "tag_type": 1 + }, + { + "start": 6642, + "end": 6646 + }, + { + "attributes": { + "src": "../buttons/button13.jpg", + "onmouseout": null, + "fp-title": "Art", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Art", + "border": "0", + "id": "img37", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 6874, + "start": 6646, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 6878, + "start": 6874, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 6882, + "start": 6878, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 6945, + "start": 6882, + "tag_type": 1 + }, + { + "start": 6945, + "end": 6949 + }, + { + "attributes": { + "href": "../misc.html" + }, + "tag": "a", + "end": 6972, + "start": 6949, + "tag_type": 1 + }, + { + "start": 6972, + "end": 6976 + }, + { + "attributes": { + "src": "../buttons/button15.jpg", + "onmouseout": null, + "fp-title": "Misc. Items", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Misc. Items", + "border": "0", + "id": "img38", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0" + }, + "tag": "img", + "end": 7220, + "start": 6976, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 7224, + "start": 7220, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 7228, + "start": 7224, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-top: 0pt; margin-bottom: 0pt;", + "align": "center" + }, + "tag": "p", + "end": 7291, + "start": 7228, + "tag_type": 1 + }, + { + "start": 7291, + "end": 7295 + }, + { + "attributes": { + "href": "../contemp.html" + }, + "tag": "a", + "end": 7321, + "start": 7295, + "tag_type": 1 + }, + { + "start": 7321, + "end": 7325 + }, + { + "attributes": { + "src": "../buttons/button17.jpg", + "onmouseout": null, + "fp-title": "Contemporary", + "height": "31", + "width": "125", + "onmouseover": null, + "alt": "Contemporary", + "border": "0", + "id": "img46", + "fp-style": "fp-btn: Linked Column 9; fp-img-press: 0; fp-bgcolor: #7B7B7B; fp-proportional: 0; fp-orig: 0" + }, + "tag": "img", + "end": 7583, + "start": 7325, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 7587, + "start": 7583, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 7591, + "start": 7587, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 7596, + "start": 7591, + "tag_type": 2 + }, + { + "start": 7596, + "end": 7600 + }, + { + "attributes": { + "width": "433", + "class": null, + "valign": "top" + }, + "tag": "td", + "end": 7638, + "start": 7600, + "tag_type": 1 + }, + { + "start": 7638, + "end": 7642 + }, + { + "attributes": { + "style": "margin-left: 10px; margin-right: 20px;" + }, + "tag": "p", + "end": 7692, + "start": 7642, + "tag_type": 1 + }, + { + "start": 7692, + "end": 7706 + }, + { + "attributes": { + "style": "font-weight: 700;" + }, + "tag": "span", + "end": 7738, + "start": 7706, + "tag_type": 1 + }, + { + "attributes": { + "data-scrapy-annotate": "{"variant": 0, "annotations": {"content": "name"}}", + "size": "5", + "id": "anonymous_element_1", + "face": "Tahoma" + }, + "tag": "font", + "end": 7906, + "start": 7738, + "tag_type": 1 + }, + { + "start": 7906, + "end": 7929 + }, + { + "attributes": {}, + "tag": "font", + "end": 7936, + "start": 7929, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "span", + "end": 7943, + "start": 7936, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 7947, + "start": 7943, + "tag_type": 2 + }, + { + "start": 7947, + "end": 7951 + }, + { + "attributes": { + "style": "margin-left: 10px; margin-right: 20px; margin-bottom: 15px;", + "align": "justify" + }, + "tag": "p", + "end": 8038, + "start": 7951, + "tag_type": 1 + }, + { + "start": 8038, + "end": 8042 + }, + { + "attributes": { + "size": "2", + "class": null, + "face": "Tahoma" + }, + "tag": "font", + "end": 8080, + "start": 8042, + "tag_type": 1 + }, + { + "start": 8080, + "end": 8191 + }, + { + "attributes": {}, + "tag": "font", + "end": 8198, + "start": 8191, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 8202, + "start": 8198, + "tag_type": 2 + }, + { + "attributes": { + "align": "center", + "class": null + }, + "tag": "div", + "end": 8231, + "start": 8202, + "tag_type": 1 + }, + { + "start": 8231, + "end": 8236 + }, + { + "attributes": { + "border": "0", + "height": "309", + "width": "400", + "cellpadding": "0", + "cellspacing": "0", + "id": "table2" + }, + "tag": "table", + "end": 8323, + "start": 8236, + "tag_type": 1 + }, + { + "start": 8323, + "end": 8329 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 8336, + "start": 8329, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 8340, + "start": 8336, + "tag_type": 1 + }, + { + "start": 8340, + "end": 8347 + }, + { + "attributes": { + "width": "130", + "style": "border-top: 1px solid rgb(123, 123, 123); border-bottom: 1px solid rgb(123, 123, 123);", + "height": "309" + }, + "tag": "td", + "end": 8471, + "start": 8347, + "tag_type": 1 + }, + { + "start": 8471, + "end": 8478 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 8496, + "start": 8478, + "tag_type": 1 + }, + { + "start": 8496, + "end": 8509 + }, + { + "attributes": {}, + "tag": "p", + "end": 8513, + "start": 8509, + "tag_type": 2 + }, + { + "attributes": { + "align": "center", + "class": null + }, + "tag": "p", + "end": 8540, + "start": 8513, + "tag_type": 1 + }, + { + "start": 8540, + "end": 8547 + }, + { + "attributes": { + "href": "../photos/0642-01.JPG", + "target": "_blank" + }, + "tag": "a", + "end": 8595, + "start": 8547, + "tag_type": 1 + }, + { + "start": 8595, + "end": 8602 + }, + { + "attributes": { + "src": "../photos/0642-01_small.jpg", + "data-scrapy-annotate": "{"variant": 0, "annotations": {"src": "image_urls"}}", + "border": "1", + "id": "anonymous_element_2" + }, + "tag": "img", + "end": 8793, + "start": 8602, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 8797, + "start": 8793, + "tag_type": 2 + }, + { + "start": 8797, + "end": 8817 + }, + { + "attributes": {}, + "tag": "p", + "end": 8821, + "start": 8817, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 8839, + "start": 8821, + "tag_type": 1 + }, + { + "start": 8839, + "end": 8846 + }, + { + "attributes": { + "href": "../photos/0642-02.JPG", + "target": "_blank" + }, + "tag": "a", + "end": 8894, + "start": 8846, + "tag_type": 1 + }, + { + "start": 8894, + "end": 8901 + }, + { + "attributes": { + "src": "../photos/0642-02_small.jpg", + "border": "1" + }, + "tag": "img", + "end": 8951, + "start": 8901, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 8955, + "start": 8951, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 8959, + "start": 8955, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 8977, + "start": 8959, + "tag_type": 1 + }, + { + "start": 8977, + "end": 8984 + }, + { + "attributes": { + "href": "../photos/0642-03.JPG", + "target": "_blank" + }, + "tag": "a", + "end": 9032, + "start": 8984, + "tag_type": 1 + }, + { + "start": 9032, + "end": 9039 + }, + { + "attributes": { + "src": "../photos/0642-03_small.jpg", + "border": "1" + }, + "tag": "img", + "end": 9089, + "start": 9039, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 9093, + "start": 9089, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 9097, + "start": 9093, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 9115, + "start": 9097, + "tag_type": 1 + }, + { + "start": 9115, + "end": 9122 + }, + { + "attributes": { + "href": "../photos/0642-04.JPG", + "target": "_blank" + }, + "tag": "a", + "end": 9170, + "start": 9122, + "tag_type": 1 + }, + { + "start": 9170, + "end": 9177 + }, + { + "attributes": { + "src": "../photos/0642-04_small.jpg", + "border": "1" + }, + "tag": "img", + "end": 9227, + "start": 9177, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 9231, + "start": 9227, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 9235, + "start": 9231, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 9253, + "start": 9235, + "tag_type": 1 + }, + { + "start": 9253, + "end": 9266 + }, + { + "attributes": {}, + "tag": "p", + "end": 9270, + "start": 9266, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 9288, + "start": 9270, + "tag_type": 1 + }, + { + "start": 9288, + "end": 9301 + }, + { + "attributes": {}, + "tag": "p", + "end": 9305, + "start": 9301, + "tag_type": 2 + }, + { + "attributes": { + "align": "center" + }, + "tag": "p", + "end": 9323, + "start": 9305, + "tag_type": 1 + }, + { + "start": 9323, + "end": 9336 + }, + { + "attributes": {}, + "tag": "p", + "end": 9340, + "start": 9336, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 9345, + "start": 9340, + "tag_type": 2 + }, + { + "start": 9345, + "end": 9352 + }, + { + "attributes": { + "class": null, + "align": "left", + "valign": "top", + "style": "border-top: 1px solid rgb(123, 123, 123); border-bottom: 1px solid rgb(123, 123, 123);", + "height": "309" + }, + "tag": "td", + "end": 9499, + "start": 9352, + "tag_type": 1 + }, + { + "start": 9499, + "end": 9506 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 9576, + "start": 9506, + "tag_type": 1 + }, + { + "start": 9576, + "end": 9596 + }, + { + "attributes": {}, + "tag": "b", + "end": 9599, + "start": 9596, + "tag_type": 1 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 9628, + "start": 9599, + "tag_type": 1 + }, + { + "start": 9628, + "end": 9636 + }, + { + "attributes": {}, + "tag": "font", + "end": 9643, + "start": 9636, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "b", + "end": 9647, + "start": 9643, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "b", + "end": 9650, + "start": 9647, + "tag_type": 1 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 9679, + "start": 9650, + "tag_type": 1 + }, + { + "start": 9679, + "end": 9687 + }, + { + "attributes": {}, + "tag": "font", + "end": 9694, + "start": 9687, + "tag_type": 2 + }, + { + "start": 9694, + "end": 9700 + }, + { + "attributes": {}, + "tag": "b", + "end": 9704, + "start": 9700, + "tag_type": 2 + }, + { + "start": 9704, + "end": 9710 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma,sans-serif" + }, + "tag": "font", + "end": 9750, + "start": 9710, + "tag_type": 1 + }, + { + "start": 9750, + "end": 9768 + }, + { + "attributes": {}, + "tag": "font", + "end": 9775, + "start": 9768, + "tag_type": 2 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 9838, + "start": 9775, + "tag_type": 1 + }, + { + "start": 9838, + "end": 9863 + }, + { + "attributes": {}, + "tag": "span", + "end": 9870, + "start": 9863, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 9874, + "start": 9870, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 9944, + "start": 9874, + "tag_type": 1 + }, + { + "start": 9944, + "end": 9964 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 9993, + "start": 9964, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 9996, + "start": 9993, + "tag_type": 1 + }, + { + "start": 9996, + "end": 10010 + }, + { + "attributes": {}, + "tag": "b", + "end": 10014, + "start": 10010, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "font", + "end": 10021, + "start": 10014, + "tag_type": 2 + }, + { + "start": 10021, + "end": 10027 + }, + { + "attributes": { + "size": "2" + }, + "tag": "font", + "end": 10042, + "start": 10027, + "tag_type": 1 + }, + { + "attributes": { + "style": "font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 10088, + "start": 10042, + "tag_type": 1 + }, + { + "start": 10088, + "end": 10114 + }, + { + "attributes": {}, + "tag": "span", + "end": 10121, + "start": 10114, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "font", + "end": 10128, + "start": 10121, + "tag_type": 2 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 10191, + "start": 10128, + "tag_type": 1 + }, + { + "start": 10191, + "end": 10204 + }, + { + "attributes": {}, + "tag": "span", + "end": 10211, + "start": 10204, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 10215, + "start": 10211, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 10285, + "start": 10215, + "tag_type": 1 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 10314, + "start": 10285, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 10317, + "start": 10314, + "tag_type": 1 + }, + { + "start": 10317, + "end": 10406 + }, + { + "attributes": {}, + "tag": "b", + "end": 10410, + "start": 10406, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "font", + "end": 10417, + "start": 10410, + "tag_type": 2 + }, + { + "start": 10417, + "end": 10424 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 10487, + "start": 10424, + "tag_type": 1 + }, + { + "start": 10487, + "end": 10749 + }, + { + "attributes": {}, + "tag": "span", + "end": 10756, + "start": 10749, + "tag_type": 2 + }, + { + "start": 10756, + "end": 10763 + }, + { + "attributes": {}, + "tag": "p", + "end": 10767, + "start": 10763, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;", + "class": null + }, + "tag": "p", + "end": 10846, + "start": 10767, + "tag_type": 1 + }, + { + "start": 10846, + "end": 10853 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;", + "class": null + }, + "tag": "span", + "end": 10925, + "start": 10853, + "tag_type": 1 + }, + { + "start": 10925, + "end": 11175 + }, + { + "attributes": {}, + "tag": "span", + "end": 11182, + "start": 11175, + "tag_type": 2 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 11211, + "start": 11182, + "tag_type": 1 + }, + { + "start": 11211, + "end": 11214 + }, + { + "attributes": {}, + "tag": "font", + "end": 11221, + "start": 11214, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 11225, + "start": 11221, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;", + "class": null + }, + "tag": "p", + "end": 11304, + "start": 11225, + "tag_type": 1 + }, + { + "start": 11304, + "end": 11324 + }, + { + "attributes": { + "data-scrapy-annotate": "{"variant": 0, "annotations": {"content": "price"}}", + "size": "2", + "id": "anonymous_element_3", + "face": "Tahoma" + }, + "tag": "font", + "end": 11493, + "start": 11324, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 11496, + "start": 11493, + "tag_type": 1 + }, + { + "start": 11496, + "end": 11502 + }, + { + "attributes": {}, + "tag": "b", + "end": 11506, + "start": 11502, + "tag_type": 2 + }, + { + "start": 11506, + "end": 11515 + }, + { + "attributes": {}, + "tag": "font", + "end": 11522, + "start": 11515, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 11526, + "start": 11522, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 11596, + "start": 11526, + "tag_type": 1 + }, + { + "start": 11596, + "end": 11616 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 11645, + "start": 11616, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 11648, + "start": 11645, + "tag_type": 1 + }, + { + "start": 11648, + "end": 11653 + }, + { + "attributes": {}, + "tag": "b", + "end": 11657, + "start": 11653, + "tag_type": 2 + }, + { + "start": 11657, + "end": 11658 + }, + { + "attributes": {}, + "tag": "font", + "end": 11665, + "start": 11658, + "tag_type": 2 + }, + { + "start": 11665, + "end": 11671 + }, + { + "attributes": { + "size": "2" + }, + "tag": "font", + "end": 11686, + "start": 11671, + "tag_type": 1 + }, + { + "attributes": { + "style": "font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 11732, + "start": 11686, + "tag_type": 1 + }, + { + "start": 11732, + "end": 11741 + }, + { + "attributes": {}, + "tag": "span", + "end": 11748, + "start": 11741, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "font", + "end": 11755, + "start": 11748, + "tag_type": 2 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 11818, + "start": 11755, + "tag_type": 1 + }, + { + "start": 11818, + "end": 11824 + }, + { + "attributes": { + "class": "auctionblock" + }, + "tag": "span", + "end": 11851, + "start": 11824, + "tag_type": 1 + }, + { + "start": 11851, + "end": 11857 + }, + { + "attributes": {}, + "tag": "span", + "end": 11864, + "start": 11857, + "tag_type": 2 + }, + { + "start": 11864, + "end": 11882 + }, + { + "attributes": { + "class": "auctionblock" + }, + "tag": "span", + "end": 11909, + "start": 11882, + "tag_type": 1 + }, + { + "start": 11909, + "end": 11915 + }, + { + "attributes": {}, + "tag": "span", + "end": 11922, + "start": 11915, + "tag_type": 2 + }, + { + "start": 11922, + "end": 11935 + }, + { + "attributes": {}, + "tag": "span", + "end": 11942, + "start": 11935, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 11946, + "start": 11942, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 12016, + "start": 11946, + "tag_type": 1 + }, + { + "start": 12016, + "end": 12036 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 12065, + "start": 12036, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 12068, + "start": 12065, + "tag_type": 1 + }, + { + "start": 12068, + "end": 12077 + }, + { + "attributes": {}, + "tag": "b", + "end": 12081, + "start": 12077, + "tag_type": 2 + }, + { + "start": 12081, + "end": 12082 + }, + { + "attributes": {}, + "tag": "font", + "end": 12089, + "start": 12082, + "tag_type": 2 + }, + { + "start": 12089, + "end": 12095 + }, + { + "attributes": { + "style": "font-size: 10pt; font-family: Tahoma,sans-serif;" + }, + "tag": "span", + "end": 12158, + "start": 12095, + "tag_type": 1 + }, + { + "start": 12158, + "end": 12181 + }, + { + "attributes": {}, + "tag": "span", + "end": 12188, + "start": 12181, + "tag_type": 2 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 12217, + "start": 12188, + "tag_type": 1 + }, + { + "start": 12217, + "end": 12260 + }, + { + "attributes": {}, + "tag": "font", + "end": 12267, + "start": 12260, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 12271, + "start": 12267, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 12341, + "start": 12271, + "tag_type": 1 + }, + { + "start": 12341, + "end": 12361 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 12390, + "start": 12361, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 12393, + "start": 12390, + "tag_type": 1 + }, + { + "start": 12393, + "end": 12399 + }, + { + "attributes": {}, + "tag": "b", + "end": 12403, + "start": 12399, + "tag_type": 2 + }, + { + "start": 12403, + "end": 12408 + }, + { + "attributes": {}, + "tag": "font", + "end": 12415, + "start": 12408, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 12419, + "start": 12415, + "tag_type": 2 + }, + { + "attributes": { + "style": "margin-left: 15px; margin-top: 25px; margin-bottom: -10px;" + }, + "tag": "p", + "end": 12489, + "start": 12419, + "tag_type": 1 + }, + { + "start": 12489, + "end": 12515 + }, + { + "attributes": {}, + "tag": "p", + "end": 12519, + "start": 12515, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 12524, + "start": 12519, + "tag_type": 2 + }, + { + "start": 12524, + "end": 12530 + }, + { + "attributes": {}, + "tag": "tr", + "end": 12535, + "start": 12530, + "tag_type": 2 + }, + { + "start": 12535, + "end": 12541 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 12549, + "start": 12541, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 12557, + "start": 12549, + "tag_type": 2 + }, + { + "start": 12557, + "end": 12574 + }, + { + "attributes": { + "style": "margin-left: 25px; margin-top: 25px;" + }, + "tag": "p", + "end": 12622, + "start": 12574, + "tag_type": 1 + }, + { + "start": 12622, + "end": 12627 + }, + { + "attributes": { + "size": "2", + "face": "Tahoma" + }, + "tag": "font", + "end": 12656, + "start": 12627, + "tag_type": 1 + }, + { + "start": 12656, + "end": 12661 + }, + { + "attributes": { + "style": "text-decoration: none;", + "href": "about:blank" + }, + "tag": "a", + "end": 12714, + "start": 12661, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "b", + "end": 12717, + "start": 12714, + "tag_type": 1 + }, + { + "start": 12717, + "end": 12731 + }, + { + "attributes": {}, + "tag": "b", + "end": 12735, + "start": 12731, + "tag_type": 2 + }, + { + "start": 12735, + "end": 12739 + }, + { + "attributes": {}, + "tag": "a", + "end": 12743, + "start": 12739, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "font", + "end": 12750, + "start": 12743, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 12754, + "start": 12750, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 12760, + "start": 12754, + "tag_type": 2 + }, + { + "start": 12760, + "end": 12764 + }, + { + "attributes": {}, + "tag": "td", + "end": 12769, + "start": 12764, + "tag_type": 2 + }, + { + "start": 12769, + "end": 12773 + }, + { + "attributes": { + "width": "153", + "style": "border-right: 1px solid rgb(0, 0, 0);", + "class": null, + "valign": "top" + }, + "tag": "td", + "end": 12857, + "start": 12773, + "tag_type": 1 + }, + { + "start": 12857, + "end": 12861 + }, + { + "attributes": { + "style": "margin-right: 20px;", + "align": "left" + }, + "tag": "p", + "end": 12905, + "start": 12861, + "tag_type": 1 + }, + { + "start": 12905, + "end": 12909 + }, + { + "attributes": { + "src": "../images/icon1.jpg", + "height": "133", + "width": "133", + "alt": "retrosixty", + "border": "0", + "class": null + }, + "tag": "img", + "end": 13002, + "start": 12909, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 13006, + "start": 13002, + "tag_type": 2 + }, + { + "start": 13006, + "end": 13010 + }, + { + "attributes": { + "style": "margin-right: 20px;" + }, + "tag": "p", + "end": 13041, + "start": 13010, + "tag_type": 1 + }, + { + "start": 13041, + "end": 13045 + }, + { + "attributes": { + "src": "../images/icon2.jpg", + "height": "133", + "width": "133", + "alt": "retrosixty", + "border": "0", + "class": null + }, + "tag": "img", + "end": 13138, + "start": 13045, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 13142, + "start": 13138, + "tag_type": 2 + }, + { + "start": 13142, + "end": 13146 + }, + { + "attributes": { + "style": "margin-right: 20px;" + }, + "tag": "p", + "end": 13177, + "start": 13146, + "tag_type": 1 + }, + { + "start": 13177, + "end": 13181 + }, + { + "attributes": { + "src": "../images/icon3.jpg", + "height": "133", + "width": "133", + "alt": "retrosixty", + "border": "0", + "class": null + }, + "tag": "img", + "end": 13274, + "start": 13181, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 13278, + "start": 13274, + "tag_type": 2 + }, + { + "start": 13278, + "end": 13282 + }, + { + "attributes": {}, + "tag": "td", + "end": 13287, + "start": 13282, + "tag_type": 2 + }, + { + "start": 13287, + "end": 13290 + }, + { + "attributes": {}, + "tag": "tr", + "end": 13295, + "start": 13290, + "tag_type": 2 + }, + { + "start": 13295, + "end": 13298 + }, + { + "attributes": {}, + "tag": "tr", + "end": 13302, + "start": 13298, + "tag_type": 1 + }, + { + "start": 13302, + "end": 13306 + }, + { + "attributes": { + "width": "177", + "style": "border-left: 1px solid rgb(0, 0, 0);", + "height": "25" + }, + "tag": "td", + "end": 13379, + "start": 13306, + "tag_type": 1 + }, + { + "start": 13379, + "end": 13383 + }, + { + "attributes": { + "style": "margin-left: 10px; margin-bottom: 10px;" + }, + "tag": "p", + "end": 13434, + "start": 13383, + "tag_type": 1 + }, + { + "start": 13434, + "end": 13438 + }, + { + "attributes": { + "src": "../images/bottom.gif", + "alt": "retrosixty", + "border": "0", + "width": "160", + "height": "25" + }, + "tag": "img", + "end": 13522, + "start": 13438, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 13526, + "start": 13522, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 13531, + "start": 13526, + "tag_type": 2 + }, + { + "start": 13531, + "end": 13535 + }, + { + "attributes": { + "colspan": "2", + "style": "border-right: 1px solid rgb(0, 0, 0);", + "width": "586", + "height": "25" + }, + "tag": "td", + "end": 13621, + "start": 13535, + "tag_type": 1 + }, + { + "start": 13621, + "end": 13625 + }, + { + "attributes": { + "style": "margin-right: 15px;", + "align": "right" + }, + "tag": "p", + "end": 13670, + "start": 13625, + "tag_type": 1 + }, + { + "start": 13670, + "end": 13674 + }, + { + "attributes": { + "style": "font-size: 8pt;", + "face": "Tahoma" + }, + "tag": "font", + "end": 13718, + "start": 13674, + "tag_type": 1 + }, + { + "start": 13718, + "end": 13792 + }, + { + "attributes": {}, + "tag": "font", + "end": 13799, + "start": 13792, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 13803, + "start": 13799, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 13808, + "start": 13803, + "tag_type": 2 + }, + { + "start": 13808, + "end": 13811 + }, + { + "attributes": {}, + "tag": "tr", + "end": 13816, + "start": 13811, + "tag_type": 2 + }, + { + "start": 13816, + "end": 13818 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 13826, + "start": 13818, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 13834, + "start": 13826, + "tag_type": 2 + }, + { + "start": 13834, + "end": 13835 + }, + { + "attributes": {}, + "tag": "div", + "end": 13841, + "start": 13835, + "tag_type": 2 + }, + { + "start": 13841, + "end": 13843 + }, + { + "attributes": {}, + "tag": "body", + "end": 13850, + "start": 13843, + "tag_type": 2 + } +] \ No newline at end of file diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.html b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.html new file mode 100644 index 000000000..f9cce9745 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.html @@ -0,0 +1,30 @@ +Play.com (UK) : Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) : Electronics - Free Delivery + + + + + + + + + + + + + +
| Help

£

€

My Shopping Basket

Your basket is empty

Electronics

Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)
Enlarge Image

Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)

( 1 customer rating )

£579.99 Free Delivery

RRP: £749.99 | You save: £170.00 (22%)

In stock | Usually dispatched within 24 hours

Half Price TV Stand

Save 50% On This TV Stand When Purchased With This TV

Related Promotions

 

Specifications

 

  • diagram
  • Please be aware that this item will be delivered via a courier and will require a signature. Please contact customer service team with a daytime contact number.
  • Screen Size: 37"
  • Resolution: 1920 x 1080
  • Technology: CCFL
  • Picture Engine: DNIe+
  • Dynamic Contrast Ratio: High Contrast
  • Wide Colour Enhancer:WCE 2
  • 1080 24p Real Movie
  • Audio
  • Sound Effect System: SRS Trusurround HD & Dolby Digital Plus
  • Speaker Type: Down Firing
  • Sound Output(RMS): 10W x 2
  • Features
  • USB 2.0
  • Teletext(TTXT)
  • Anynet+ (HDMI-CEC)
  • Game mode
  • User Interface
  • OSD Language
  • Sleep Timer
  • Clock & On/Off Timer
  • Auto Channel Search
  • Auto Power Off
  • EPG
  • Auto Volume Leveller
  • Hotel Mode(S/W)
  • System
  • DTV Type
  • DTV Tuner Built-in
  • Inputs / Outputs
  • HDMI: back + side
  • USB: side
  • CI Slot: side
  • Composite(AV): side
  • Service: back
  • PC input (D-sub): back
  • PC Audio Input (Mini Jack): back
  • DVI Audio Input (Mini Jack): back
  • Component(Y/Pb/Pr): back
  • Digital Audio (Optical): back
  • Headphone: back
  • RF Input: back
  • Audio Out(L/R): back
  • RS232C: back
  • Scart: back
  • Design
  • Type: Samsung Crystal TV
  • Colour: Platinum Black
  • Swivel (Left/Right)
  • Dimensions:
  • Set Size(WXDXH) with Stand: 923 x 253 x 659.4
  • Set Size(WXDXH) without Stand: 923 x 78.5 x 597
  • Weight
  • Set Weight with Stand: 19.4
  • Set weight without stand: 14.8
  • Accessory
  • Vesa Wall Mount (WXH): Yes (32-40":200x200)
  • Remote Controller
  • Batteries
  • Power Cable

Description

 

Samsung LCD TV perfectly balances style and techonology to give you an unrivalled viewing experience, no matter what you choose to watch.


HD 1080p
Full HD has twice the resolution of ordinary HD TV. Twice the resolution means twice the detail. Which means you get vividly realistic images with unmatched depth, clarity and sharpness. For more pixels, more detail and more pleasure nothing performs better than Full HD.



Wide Colour Enhancer
Samsung Wide Colour Enhancer technology lengthens and expands luminance level and colour range for more intense, vivid and realistic colours.



4 HDMI Connections
HDMI (High Definition Multimedia Interface) is the gold standard in HD connectivity. Uncompressed and 100% digital, HDMI delivers pure HD quality audio and video with no loss of signal.



USB 2.0
USB 2.0 uses a simple USB interface to let you play music and view pictures right on your TV screen.

Customer Reviews

 

Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars

Average rating (1 review)

Customer rating: 5 out of 5 stars Looking Good

Geniemo | 08/06/2009 | See all Geniemo's reviews (1) »

This TV is amazing - if you unlock some setting you can play Xvid, Dvix and MKV files through the TV (USB 2.0). The TV is well worth the money.

Related Items - Electronics

 

Valpak - short banner
iPod speakers Save Up To 50%
Blu-ray from £7.99
Sony LCD TV's - Double
Blu-ray players from £199.99
Flip Camcorders - From Only £79.99

Secure Shopping

Buy Gift Vouchers
Play.com Credit Card
\ No newline at end of file diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json new file mode 100644 index 000000000..15e661399 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json @@ -0,0 +1,21944 @@ +[ + { + "attributes": {}, + "tag": "head", + "end": 6, + "tag_type": 1, + "start": 0 + }, + { + "attributes": { + "id": "_pageTemplate__header__title" + }, + "tag": "title", + "end": 47, + "tag_type": 1, + "start": 6 + }, + { + "start": 47, + "end": 165 + }, + { + "attributes": {}, + "tag": "title", + "end": 173, + "tag_type": 2, + "start": 165 + }, + { + "start": 173, + "end": 174 + }, + { + "attributes": { + "content": "NOODP", + "name": "ROBOTS" + }, + "tag": "meta", + "end": 210, + "tag_type": 1, + "start": 174 + }, + { + "attributes": { + "content": "no-cache", + "http-equiv": "Pragma" + }, + "tag": "meta", + "end": 255, + "tag_type": 1, + "start": 210 + }, + { + "attributes": { + "content": "en-us", + "http-equiv": "Content-Language" + }, + "tag": "meta", + "end": 307, + "tag_type": 1, + "start": 255 + }, + { + "attributes": { + "content": "Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV, electronics, dvd players, digital cameras, mobile phones, pc peripherals, buy, free delivery, uk, online, entertainment, shopping, shop, bargain, special offer", + "id": "_pageTemplate__header__metaKeywords", + "name": "keywords" + }, + "tag": "meta", + "end": 611, + "tag_type": 1, + "start": 307 + }, + { + "attributes": { + "content": "Play.com - Buy Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV, with free delivery to UK and Europe. Play.com is the top site for dvds, cds and games in the UK. We stock all major movies on DVD.", + "id": "_pageTemplate__header__metaDescription", + "name": "description" + }, + "tag": "meta", + "end": 909, + "tag_type": 1, + "start": 611 + }, + { + "attributes": { + "content": "text/html; charset=ISO-8859-1", + "http-equiv": "Content-Type" + }, + "tag": "meta", + "end": 981, + "tag_type": 1, + "start": 909 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/css/play.min.css", + "type": "text/css", + "id": "_pageTemplate__header__styleSheet", + "rel": "stylesheet" + }, + "tag": "link", + "end": 1125, + "tag_type": 1, + "start": 981 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/img/brand/favicon.ico", + "rel": "icon" + }, + "tag": "link", + "end": 1213, + "tag_type": 1, + "start": 1125 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/img/brand/favicon.ico", + "rel": "shortcut icon" + }, + "tag": "link", + "end": 1310, + "tag_type": 1, + "start": 1213 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/ChartsMenu.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1444, + "tag_type": 1, + "start": 1310 + }, + { + "attributes": {}, + "tag": "script", + "end": 1453, + "tag_type": 2, + "start": 1444 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/Other.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1582, + "tag_type": 1, + "start": 1453 + }, + { + "attributes": {}, + "tag": "script", + "end": 1591, + "tag_type": 2, + "start": 1582 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/Reloaded.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1723, + "tag_type": 1, + "start": 1591 + }, + { + "attributes": {}, + "tag": "script", + "end": 1732, + "tag_type": 2, + "start": 1723 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/cookieTools.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1867, + "tag_type": 1, + "start": 1732 + }, + { + "attributes": {}, + "tag": "script", + "end": 1876, + "tag_type": 2, + "start": 1867 + }, + { + "attributes": { + "content": "6hM6+2zExVEjvWx8GYWXLAXLBAOfYdLvkK8mzEZLy6o=", + "name": "verify-v1" + }, + "tag": "meta", + "end": 1954, + "tag_type": 1, + "start": 1876 + }, + { + "start": 1954, + "end": 1980 + }, + { + "attributes": { + "src": "http://images.play.com/sitetrak/cmdatatagutilsA.js", + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2093, + "tag_type": 1, + "start": 1980 + }, + { + "attributes": {}, + "tag": "script", + "end": 2102, + "tag_type": 2, + "start": 2093 + }, + { + "start": 2102, + "end": 2103 + }, + { + "attributes": { + "src": "http://images.play.com/sitetrak/v40/eluminateA.js", + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2215, + "tag_type": 1, + "start": 2103 + }, + { + "attributes": {}, + "tag": "script", + "end": 2224, + "tag_type": 2, + "start": 2215 + }, + { + "start": 2224, + "end": 2226 + }, + { + "attributes": { + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2282, + "tag_type": 1, + "start": 2226 + }, + { + "start": 2282, + "end": 2438 + }, + { + "attributes": {}, + "tag": "script", + "end": 2447, + "tag_type": 2, + "start": 2438 + }, + { + "start": 2447, + "end": 2451 + }, + { + "attributes": { + "type": "text/javascript" + }, + "tag": "script", + "end": 2482, + "tag_type": 1, + "start": 2451 + }, + { + "start": 2482, + "end": 2702 + }, + { + "attributes": {}, + "tag": "script", + "end": 2711, + "tag_type": 2, + "start": 2702 + }, + { + "start": 2711, + "end": 2712 + }, + { + "attributes": { + "type": "text/javascript" + }, + "tag": "script", + "end": 2743, + "tag_type": 1, + "start": 2712 + }, + { + "start": 2743, + "end": 2851 + }, + { + "attributes": {}, + "tag": "script", + "end": 2860, + "tag_type": 2, + "start": 2851 + }, + { + "start": 2860, + "end": 2884 + }, + { + "attributes": { + "type": "text/css", + "id": "mydeco-style" + }, + "tag": "style", + "end": 2925, + "tag_type": 1, + "start": 2884 + }, + { + "start": 2925, + "end": 2985 + }, + { + "attributes": {}, + "tag": "style", + "end": 2993, + "tag_type": 2, + "start": 2985 + }, + { + "attributes": {}, + "tag": "head", + "end": 3000, + "tag_type": 2, + "start": 2993 + }, + { + "attributes": { + "id": "goto-top", + "name": "goto-top", + "class": "region-ELEC-404 greyBg goto-top" + }, + "tag": "body", + "end": 3076, + "tag_type": 1, + "start": 3000 + }, + { + "start": 3076, + "end": 3080 + }, + { + "attributes": { + "class": null, + "id": "mainContainer" + }, + "tag": "div", + "end": 3113, + "tag_type": 1, + "start": 3080 + }, + { + "start": 3113, + "end": 3117 + }, + { + "attributes": { + "class": "header" + }, + "tag": "div", + "end": 3137, + "tag_type": 1, + "start": 3117 + }, + { + "start": 3137, + "end": 3141 + }, + { + "attributes": { + "class": "new_menu" + }, + "tag": "div", + "end": 3163, + "tag_type": 1, + "start": 3141 + }, + { + "attributes": { + "action": "https://www.play.com/OrdersPost.aspx", + "class": "nomargin", + "method": "post" + }, + "tag": "form", + "end": 3246, + "tag_type": 1, + "start": 3163 + }, + { + "attributes": { + "type": "hidden", + "name": "transfer", + "value": "transfer" + }, + "tag": "input", + "end": 3300, + "tag_type": 1, + "start": 3246 + }, + { + "attributes": { + "type": "hidden", + "name": "returnURL", + "value": "http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV" + }, + "tag": "input", + "end": 3521, + "tag_type": 1, + "start": 3300 + }, + { + "attributes": { + "type": "hidden", + "name": "hpcode", + "value": null + }, + "tag": "input", + "end": 3565, + "tag_type": 1, + "start": 3521 + }, + { + "attributes": { + "type": "hidden", + "name": "hpCardMessage", + "value": "no" + }, + "tag": "input", + "end": 3618, + "tag_type": 1, + "start": 3565 + }, + { + "attributes": { + "type": "hidden", + "name": "basketPromotionId", + "value": null + }, + "tag": "input", + "end": 3673, + "tag_type": 1, + "start": 3618 + }, + { + "attributes": { + "type": "hidden", + "name": "products", + "value": null + }, + "tag": "input", + "end": 3719, + "tag_type": 1, + "start": 3673 + }, + { + "attributes": { + "type": "hidden", + "name": "quantity", + "value": null + }, + "tag": "input", + "end": 3765, + "tag_type": 1, + "start": 3719 + }, + { + "attributes": { + "type": "hidden", + "name": "promoid", + "value": null + }, + "tag": "input", + "end": 3810, + "tag_type": 1, + "start": 3765 + }, + { + "attributes": { + "type": "hidden", + "name": "source", + "value": "0" + }, + "tag": "input", + "end": 3855, + "tag_type": 1, + "start": 3810 + }, + { + "attributes": { + "type": "hidden", + "name": "currency", + "value": "257" + }, + "tag": "input", + "end": 3904, + "tag_type": 1, + "start": 3855 + }, + { + "attributes": { + "type": "hidden", + "name": "regions", + "value": null + }, + "tag": "input", + "end": 3949, + "tag_type": 1, + "start": 3904 + }, + { + "attributes": { + "type": "hidden", + "name": "mpListings", + "value": null + }, + "tag": "input", + "end": 3997, + "tag_type": 1, + "start": 3949 + }, + { + "attributes": { + "type": "hidden", + "name": "sitecurrencies", + "value": null + }, + "tag": "input", + "end": 4049, + "tag_type": 1, + "start": 3997 + }, + { + "attributes": { + "type": "hidden", + "name": "applyPromotions", + "value": null + }, + "tag": "input", + "end": 4102, + "tag_type": 1, + "start": 4049 + }, + { + "attributes": { + "type": "hidden", + "name": "lispTypes", + "value": null + }, + "tag": "input", + "end": 4149, + "tag_type": 1, + "start": 4102 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/menu/my_account.gif", + "name": "My Account", + "type": "image", + "alt": "My Account", + "border": "0", + "class": "my_account" + }, + "tag": "input", + "end": 4306, + "tag_type": 1, + "start": 4149 + }, + { + "attributes": {}, + "tag": "form", + "end": 4313, + "tag_type": 2, + "start": 4306 + }, + { + "attributes": {}, + "tag": "span", + "end": 4319, + "tag_type": 1, + "start": 4313 + }, + { + "start": 4319, + "end": 4322 + }, + { + "attributes": {}, + "tag": "span", + "end": 4329, + "tag_type": 2, + "start": 4322 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk" + }, + "tag": "a", + "end": 4377, + "tag_type": 1, + "start": 4329 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/menu/help_r.gif", + "alt": "Help" + }, + "tag": "img", + "end": 4461, + "tag_type": 1, + "start": 4377 + }, + { + "attributes": {}, + "tag": "a", + "end": 4465, + "tag_type": 2, + "start": 4461 + }, + { + "attributes": {}, + "tag": "div", + "end": 4471, + "tag_type": 2, + "start": 4465 + }, + { + "attributes": { + "class": "currency_flags" + }, + "tag": "div", + "end": 4499, + "tag_type": 1, + "start": 4471 + }, + { + "attributes": { + "class": "gbp" + }, + "tag": "div", + "end": 4516, + "tag_type": 1, + "start": 4499 + }, + { + "attributes": {}, + "tag": "p", + "end": 4519, + "tag_type": 1, + "start": 4516 + }, + { + "start": 4519, + "end": 4520 + }, + { + "attributes": {}, + "tag": "p", + "end": 4524, + "tag_type": 2, + "start": 4520 + }, + { + "attributes": {}, + "tag": "div", + "end": 4530, + "tag_type": 2, + "start": 4524 + }, + { + "attributes": { + "class": "gbp_active" + }, + "tag": "div", + "end": 4554, + "tag_type": 1, + "start": 4530 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&cur=257" + }, + "tag": "a", + "end": 4709, + "tag_type": 1, + "start": 4554 + }, + { + "start": 4709, + "end": 4715 + }, + { + "attributes": {}, + "tag": "a", + "end": 4719, + "tag_type": 2, + "start": 4715 + }, + { + "start": 4719, + "end": 4720 + }, + { + "attributes": {}, + "tag": "div", + "end": 4726, + "tag_type": 2, + "start": 4720 + }, + { + "attributes": { + "class": "euro" + }, + "tag": "div", + "end": 4744, + "tag_type": 1, + "start": 4726 + }, + { + "attributes": {}, + "tag": "p", + "end": 4747, + "tag_type": 1, + "start": 4744 + }, + { + "start": 4747, + "end": 4748 + }, + { + "attributes": {}, + "tag": "p", + "end": 4752, + "tag_type": 2, + "start": 4748 + }, + { + "attributes": {}, + "tag": "div", + "end": 4758, + "tag_type": 2, + "start": 4752 + }, + { + "attributes": { + "class": "euro_inactive" + }, + "tag": "div", + "end": 4785, + "tag_type": 1, + "start": 4758 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&cur=258" + }, + "tag": "a", + "end": 4940, + "tag_type": 1, + "start": 4785 + }, + { + "start": 4940, + "end": 4945 + }, + { + "attributes": {}, + "tag": "a", + "end": 4949, + "tag_type": 2, + "start": 4945 + }, + { + "start": 4949, + "end": 4950 + }, + { + "attributes": {}, + "tag": "div", + "end": 4956, + "tag_type": 2, + "start": 4950 + }, + { + "attributes": {}, + "tag": "div", + "end": 4962, + "tag_type": 2, + "start": 4956 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "div", + "end": 4980, + "tag_type": 1, + "start": 4962 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 5019, + "tag_type": 1, + "start": 4980 + }, + { + "start": 5019, + "end": 5023 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 5030, + "tag_type": 1, + "start": 5023 + }, + { + "attributes": {}, + "tag": "tr", + "end": 5034, + "tag_type": 1, + "start": 5030 + }, + { + "start": 5034, + "end": 5038 + }, + { + "attributes": { + "class": "head_l" + }, + "tag": "td", + "end": 5057, + "tag_type": 1, + "start": 5038 + }, + { + "attributes": { + "class": "newlogo" + }, + "tag": "div", + "end": 5078, + "tag_type": 1, + "start": 5057 + }, + { + "start": 5078, + "end": 5082 + }, + { + "attributes": {}, + "tag": "h1", + "end": 5086, + "tag_type": 1, + "start": 5082 + }, + { + "start": 5086, + "end": 5090 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 5102, + "tag_type": 1, + "start": 5090 + }, + { + "start": 5102, + "end": 5106 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/logo.gif", + "alt": "play.com", + "style": "border-width: 0px; height: 38px; width: 194px;" + }, + "tag": "img", + "end": 5248, + "tag_type": 1, + "start": 5106 + }, + { + "start": 5248, + "end": 5252 + }, + { + "attributes": {}, + "tag": "a", + "end": 5256, + "tag_type": 2, + "start": 5252 + }, + { + "attributes": {}, + "tag": "h1", + "end": 5261, + "tag_type": 2, + "start": 5256 + }, + { + "attributes": {}, + "tag": "div", + "end": 5267, + "tag_type": 2, + "start": 5261 + }, + { + "attributes": { + "class": "freedelivery" + }, + "tag": "div", + "end": 5293, + "tag_type": 1, + "start": 5267 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 5346, + "tag_type": 1, + "start": 5293 + }, + { + "start": 5346, + "end": 5537 + }, + { + "attributes": {}, + "tag": "script", + "end": 5546, + "tag_type": 2, + "start": 5537 + }, + { + "attributes": {}, + "tag": "noscript", + "end": 5556, + "tag_type": 1, + "start": 5546 + }, + { + "attributes": {}, + "tag": "div", + "end": 5561, + "tag_type": 1, + "start": 5556 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/freedelivery.gif", + "alt": "Free delivery on everything!", + "height": "28", + "width": "200" + }, + "tag": "img", + "end": 5700, + "tag_type": 1, + "start": 5561 + }, + { + "attributes": {}, + "tag": "div", + "end": 5706, + "tag_type": 2, + "start": 5700 + }, + { + "attributes": {}, + "tag": "noscript", + "end": 5717, + "tag_type": 2, + "start": 5706 + }, + { + "attributes": {}, + "tag": "div", + "end": 5723, + "tag_type": 2, + "start": 5717 + }, + { + "attributes": {}, + "tag": "td", + "end": 5728, + "tag_type": 2, + "start": 5723 + }, + { + "attributes": {}, + "tag": "td", + "end": 5732, + "tag_type": 1, + "start": 5728 + }, + { + "attributes": { + "class": "sc" + }, + "tag": "div", + "end": 5748, + "tag_type": 1, + "start": 5732 + }, + { + "start": 5748, + "end": 5752 + }, + { + "attributes": { + "class": "sback_r" + }, + "tag": "div", + "end": 5773, + "tag_type": 1, + "start": 5752 + }, + { + "start": 5773, + "end": 5777 + }, + { + "attributes": { + "class": "searchbox" + }, + "tag": "div", + "end": 5800, + "tag_type": 1, + "start": 5777 + }, + { + "start": 5800, + "end": 5804 + }, + { + "attributes": { + "action": "/Search.aspx", + "method": "get", + "name": "search", + "class": "nomargin" + }, + "tag": "form", + "end": 5876, + "tag_type": 1, + "start": 5804 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 5915, + "tag_type": 1, + "start": 5876 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 5922, + "tag_type": 1, + "start": 5915 + }, + { + "attributes": {}, + "tag": "tr", + "end": 5926, + "tag_type": 1, + "start": 5922 + }, + { + "attributes": { + "class": "region_td" + }, + "tag": "td", + "end": 5948, + "tag_type": 1, + "start": 5926 + }, + { + "attributes": { + "class": "region" + }, + "tag": "div", + "end": 5968, + "tag_type": 1, + "start": 5948 + }, + { + "attributes": { + "class": "searchtype", + "name": "searchtype" + }, + "tag": "select", + "end": 6013, + "tag_type": 1, + "start": 5968 + }, + { + "attributes": { + "value": "allproducts" + }, + "tag": "option", + "end": 6041, + "tag_type": 1, + "start": 6013 + }, + { + "start": 6041, + "end": 6053 + }, + { + "attributes": {}, + "tag": "option", + "end": 6062, + "tag_type": 2, + "start": 6053 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 6102, + "tag_type": 1, + "start": 6062 + }, + { + "start": 6102, + "end": 6125 + }, + { + "attributes": {}, + "tag": "option", + "end": 6134, + "tag_type": 2, + "start": 6125 + }, + { + "attributes": { + "value": "r2alldvd" + }, + "tag": "option", + "end": 6159, + "tag_type": 1, + "start": 6134 + }, + { + "start": 6159, + "end": 6162 + }, + { + "attributes": {}, + "tag": "option", + "end": 6171, + "tag_type": 2, + "start": 6162 + }, + { + "attributes": { + "value": "musicall" + }, + "tag": "option", + "end": 6196, + "tag_type": 1, + "start": 6171 + }, + { + "start": 6196, + "end": 6201 + }, + { + "attributes": {}, + "tag": "option", + "end": 6210, + "tag_type": 2, + "start": 6201 + }, + { + "attributes": { + "value": "gameall" + }, + "tag": "option", + "end": 6234, + "tag_type": 1, + "start": 6210 + }, + { + "start": 6234, + "end": 6239 + }, + { + "attributes": {}, + "tag": "option", + "end": 6248, + "tag_type": 2, + "start": 6239 + }, + { + "attributes": { + "value": "bookall" + }, + "tag": "option", + "end": 6272, + "tag_type": 1, + "start": 6248 + }, + { + "start": 6272, + "end": 6277 + }, + { + "attributes": {}, + "tag": "option", + "end": 6286, + "tag_type": 2, + "start": 6277 + }, + { + "attributes": { + "value": "abcdall" + }, + "tag": "option", + "end": 6310, + "tag_type": 1, + "start": 6286 + }, + { + "start": 6310, + "end": 6320 + }, + { + "attributes": {}, + "tag": "option", + "end": 6329, + "tag_type": 2, + "start": 6320 + }, + { + "attributes": { + "value": "CAL" + }, + "tag": "option", + "end": 6349, + "tag_type": 1, + "start": 6329 + }, + { + "start": 6349, + "end": 6358 + }, + { + "attributes": {}, + "tag": "option", + "end": 6367, + "tag_type": 2, + "start": 6358 + }, + { + "attributes": { + "selected": "selected", + "value": "ELEC" + }, + "tag": "option", + "end": 6408, + "tag_type": 1, + "start": 6367 + }, + { + "start": 6408, + "end": 6419 + }, + { + "attributes": {}, + "tag": "option", + "end": 6428, + "tag_type": 2, + "start": 6419 + }, + { + "attributes": { + "value": "PCSH" + }, + "tag": "option", + "end": 6449, + "tag_type": 1, + "start": 6428 + }, + { + "start": 6449, + "end": 6458 + }, + { + "attributes": {}, + "tag": "option", + "end": 6467, + "tag_type": 2, + "start": 6458 + }, + { + "attributes": { + "value": "GADG" + }, + "tag": "option", + "end": 6488, + "tag_type": 1, + "start": 6467 + }, + { + "start": 6488, + "end": 6495 + }, + { + "attributes": {}, + "tag": "option", + "end": 6504, + "tag_type": 2, + "start": 6495 + }, + { + "attributes": { + "value": "MBLS" + }, + "tag": "option", + "end": 6525, + "tag_type": 1, + "start": 6504 + }, + { + "start": 6525, + "end": 6538 + }, + { + "attributes": {}, + "tag": "option", + "end": 6547, + "tag_type": 2, + "start": 6538 + }, + { + "attributes": { + "value": "mobileall" + }, + "tag": "option", + "end": 6573, + "tag_type": 1, + "start": 6547 + }, + { + "start": 6573, + "end": 6587 + }, + { + "attributes": {}, + "tag": "option", + "end": 6596, + "tag_type": 2, + "start": 6587 + }, + { + "attributes": { + "value": "clothingall" + }, + "tag": "option", + "end": 6624, + "tag_type": 1, + "start": 6596 + }, + { + "start": 6624, + "end": 6632 + }, + { + "attributes": {}, + "tag": "option", + "end": 6641, + "tag_type": 2, + "start": 6632 + }, + { + "attributes": { + "value": "TICKETS_ALL" + }, + "tag": "option", + "end": 6669, + "tag_type": 1, + "start": 6641 + }, + { + "start": 6669, + "end": 6676 + }, + { + "attributes": {}, + "tag": "option", + "end": 6685, + "tag_type": 2, + "start": 6676 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 6725, + "tag_type": 1, + "start": 6685 + }, + { + "start": 6725, + "end": 6748 + }, + { + "attributes": {}, + "tag": "option", + "end": 6757, + "tag_type": 2, + "start": 6748 + }, + { + "attributes": { + "value": "r2alldvd" + }, + "tag": "option", + "end": 6782, + "tag_type": 1, + "start": 6757 + }, + { + "start": 6782, + "end": 6785 + }, + { + "attributes": {}, + "tag": "option", + "end": 6794, + "tag_type": 2, + "start": 6785 + }, + { + "attributes": { + "value": "R2" + }, + "tag": "option", + "end": 6813, + "tag_type": 1, + "start": 6794 + }, + { + "start": 6813, + "end": 6825 + }, + { + "attributes": {}, + "tag": "option", + "end": 6834, + "tag_type": 2, + "start": 6825 + }, + { + "attributes": { + "value": "r2title" + }, + "tag": "option", + "end": 6858, + "tag_type": 1, + "start": 6834 + }, + { + "start": 6858, + "end": 6876 + }, + { + "attributes": {}, + "tag": "option", + "end": 6885, + "tag_type": 2, + "start": 6876 + }, + { + "attributes": { + "value": "r2actor" + }, + "tag": "option", + "end": 6909, + "tag_type": 1, + "start": 6885 + }, + { + "start": 6909, + "end": 6927 + }, + { + "attributes": {}, + "tag": "option", + "end": 6936, + "tag_type": 2, + "start": 6927 + }, + { + "attributes": { + "value": "r2director" + }, + "tag": "option", + "end": 6963, + "tag_type": 1, + "start": 6936 + }, + { + "start": 6963, + "end": 6984 + }, + { + "attributes": {}, + "tag": "option", + "end": 6993, + "tag_type": 2, + "start": 6984 + }, + { + "attributes": { + "value": "r2language" + }, + "tag": "option", + "end": 7020, + "tag_type": 1, + "start": 6993 + }, + { + "start": 7020, + "end": 7041 + }, + { + "attributes": {}, + "tag": "option", + "end": 7050, + "tag_type": 2, + "start": 7041 + }, + { + "attributes": { + "value": "r2subtitles" + }, + "tag": "option", + "end": 7078, + "tag_type": 1, + "start": 7050 + }, + { + "start": 7078, + "end": 7099 + }, + { + "attributes": {}, + "tag": "option", + "end": 7108, + "tag_type": 2, + "start": 7099 + }, + { + "attributes": { + "value": "BLU" + }, + "tag": "option", + "end": 7128, + "tag_type": 1, + "start": 7108 + }, + { + "start": 7128, + "end": 7144 + }, + { + "attributes": {}, + "tag": "option", + "end": 7153, + "tag_type": 2, + "start": 7144 + }, + { + "attributes": { + "value": "HD" + }, + "tag": "option", + "end": 7172, + "tag_type": 1, + "start": 7153 + }, + { + "start": 7172, + "end": 7187 + }, + { + "attributes": {}, + "tag": "option", + "end": 7196, + "tag_type": 2, + "start": 7187 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 7236, + "tag_type": 1, + "start": 7196 + }, + { + "start": 7236, + "end": 7259 + }, + { + "attributes": {}, + "tag": "option", + "end": 7268, + "tag_type": 2, + "start": 7259 + }, + { + "attributes": { + "value": "musicall" + }, + "tag": "option", + "end": 7293, + "tag_type": 1, + "start": 7268 + }, + { + "start": 7293, + "end": 7298 + }, + { + "attributes": {}, + "tag": "option", + "end": 7307, + "tag_type": 2, + "start": 7298 + }, + { + "attributes": { + "value": "cdall" + }, + "tag": "option", + "end": 7329, + "tag_type": 1, + "start": 7307 + }, + { + "start": 7329, + "end": 7340 + }, + { + "attributes": {}, + "tag": "option", + "end": 7349, + "tag_type": 2, + "start": 7340 + }, + { + "attributes": { + "value": "downloadall" + }, + "tag": "option", + "end": 7377, + "tag_type": 1, + "start": 7349 + }, + { + "start": 7377, + "end": 7395 + }, + { + "attributes": {}, + "tag": "option", + "end": 7404, + "tag_type": 2, + "start": 7395 + }, + { + "attributes": { + "value": "rmtitle" + }, + "tag": "option", + "end": 7428, + "tag_type": 1, + "start": 7404 + }, + { + "start": 7428, + "end": 7446 + }, + { + "attributes": {}, + "tag": "option", + "end": 7455, + "tag_type": 2, + "start": 7446 + }, + { + "attributes": { + "value": "musicartist" + }, + "tag": "option", + "end": 7483, + "tag_type": 1, + "start": 7455 + }, + { + "start": 7483, + "end": 7498 + }, + { + "attributes": {}, + "tag": "option", + "end": 7507, + "tag_type": 2, + "start": 7498 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 7547, + "tag_type": 1, + "start": 7507 + }, + { + "start": 7547, + "end": 7570 + }, + { + "attributes": {}, + "tag": "option", + "end": 7579, + "tag_type": 2, + "start": 7570 + }, + { + "attributes": { + "value": "gameall" + }, + "tag": "option", + "end": 7603, + "tag_type": 1, + "start": 7579 + }, + { + "start": 7603, + "end": 7608 + }, + { + "attributes": {}, + "tag": "option", + "end": 7617, + "tag_type": 2, + "start": 7608 + }, + { + "attributes": { + "value": "PC" + }, + "tag": "option", + "end": 7636, + "tag_type": 1, + "start": 7617 + }, + { + "start": 7636, + "end": 7647 + }, + { + "attributes": {}, + "tag": "option", + "end": 7656, + "tag_type": 2, + "start": 7647 + }, + { + "attributes": { + "value": "PS2" + }, + "tag": "option", + "end": 7676, + "tag_type": 1, + "start": 7656 + }, + { + "start": 7676, + "end": 7688 + }, + { + "attributes": {}, + "tag": "option", + "end": 7697, + "tag_type": 2, + "start": 7688 + }, + { + "attributes": { + "value": "PS3" + }, + "tag": "option", + "end": 7717, + "tag_type": 1, + "start": 7697 + }, + { + "start": 7717, + "end": 7729 + }, + { + "attributes": {}, + "tag": "option", + "end": 7738, + "tag_type": 2, + "start": 7729 + }, + { + "attributes": { + "value": "PSP" + }, + "tag": "option", + "end": 7758, + "tag_type": 1, + "start": 7738 + }, + { + "start": 7758, + "end": 7770 + }, + { + "attributes": {}, + "tag": "option", + "end": 7779, + "tag_type": 2, + "start": 7770 + }, + { + "attributes": { + "value": "XBOX" + }, + "tag": "option", + "end": 7800, + "tag_type": 1, + "start": 7779 + }, + { + "start": 7800, + "end": 7813 + }, + { + "attributes": {}, + "tag": "option", + "end": 7822, + "tag_type": 2, + "start": 7813 + }, + { + "attributes": { + "value": "X360" + }, + "tag": "option", + "end": 7843, + "tag_type": 1, + "start": 7822 + }, + { + "start": 7843, + "end": 7860 + }, + { + "attributes": {}, + "tag": "option", + "end": 7869, + "tag_type": 2, + "start": 7860 + }, + { + "attributes": { + "value": "DS" + }, + "tag": "option", + "end": 7888, + "tag_type": 1, + "start": 7869 + }, + { + "start": 7888, + "end": 7899 + }, + { + "attributes": {}, + "tag": "option", + "end": 7908, + "tag_type": 2, + "start": 7899 + }, + { + "attributes": { + "value": "GBA" + }, + "tag": "option", + "end": 7928, + "tag_type": 1, + "start": 7908 + }, + { + "start": 7928, + "end": 7940 + }, + { + "attributes": {}, + "tag": "option", + "end": 7949, + "tag_type": 2, + "start": 7940 + }, + { + "attributes": { + "value": "GC" + }, + "tag": "option", + "end": 7968, + "tag_type": 1, + "start": 7949 + }, + { + "start": 7968, + "end": 7985 + }, + { + "attributes": {}, + "tag": "option", + "end": 7994, + "tag_type": 2, + "start": 7985 + }, + { + "attributes": { + "value": "WII" + }, + "tag": "option", + "end": 8014, + "tag_type": 1, + "start": 7994 + }, + { + "start": 8014, + "end": 8026 + }, + { + "attributes": {}, + "tag": "option", + "end": 8035, + "tag_type": 2, + "start": 8026 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 8075, + "tag_type": 1, + "start": 8035 + }, + { + "start": 8075, + "end": 8098 + }, + { + "attributes": {}, + "tag": "option", + "end": 8107, + "tag_type": 2, + "start": 8098 + }, + { + "attributes": { + "value": "bookall" + }, + "tag": "option", + "end": 8131, + "tag_type": 1, + "start": 8107 + }, + { + "start": 8131, + "end": 8136 + }, + { + "attributes": {}, + "tag": "option", + "end": 8145, + "tag_type": 2, + "start": 8136 + }, + { + "attributes": { + "value": "booktitle" + }, + "tag": "option", + "end": 8171, + "tag_type": 1, + "start": 8145 + }, + { + "start": 8171, + "end": 8185 + }, + { + "attributes": {}, + "tag": "option", + "end": 8194, + "tag_type": 2, + "start": 8185 + }, + { + "attributes": { + "value": "bookauthor" + }, + "tag": "option", + "end": 8221, + "tag_type": 1, + "start": 8194 + }, + { + "start": 8221, + "end": 8236 + }, + { + "attributes": {}, + "tag": "option", + "end": 8245, + "tag_type": 2, + "start": 8236 + }, + { + "attributes": { + "value": "bookisbn" + }, + "tag": "option", + "end": 8270, + "tag_type": 1, + "start": 8245 + }, + { + "start": 8270, + "end": 8283 + }, + { + "attributes": {}, + "tag": "option", + "end": 8292, + "tag_type": 2, + "start": 8283 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 8332, + "tag_type": 1, + "start": 8292 + }, + { + "start": 8332, + "end": 8355 + }, + { + "attributes": {}, + "tag": "option", + "end": 8364, + "tag_type": 2, + "start": 8355 + }, + { + "attributes": { + "value": "abcdall" + }, + "tag": "option", + "end": 8388, + "tag_type": 1, + "start": 8364 + }, + { + "start": 8388, + "end": 8398 + }, + { + "attributes": {}, + "tag": "option", + "end": 8407, + "tag_type": 2, + "start": 8398 + }, + { + "attributes": { + "value": "abcdtitle" + }, + "tag": "option", + "end": 8433, + "tag_type": 1, + "start": 8407 + }, + { + "start": 8433, + "end": 8447 + }, + { + "attributes": {}, + "tag": "option", + "end": 8456, + "tag_type": 2, + "start": 8447 + }, + { + "attributes": { + "value": "abcdauthor" + }, + "tag": "option", + "end": 8483, + "tag_type": 1, + "start": 8456 + }, + { + "start": 8483, + "end": 8498 + }, + { + "attributes": {}, + "tag": "option", + "end": 8507, + "tag_type": 2, + "start": 8498 + }, + { + "attributes": {}, + "tag": "select", + "end": 8516, + "tag_type": 2, + "start": 8507 + }, + { + "attributes": {}, + "tag": "div", + "end": 8522, + "tag_type": 2, + "start": 8516 + }, + { + "attributes": {}, + "tag": "td", + "end": 8527, + "tag_type": 2, + "start": 8522 + }, + { + "attributes": {}, + "tag": "td", + "end": 8531, + "tag_type": 1, + "start": 8527 + }, + { + "attributes": { + "class": "data" + }, + "tag": "div", + "end": 8549, + "tag_type": 1, + "start": 8531 + }, + { + "attributes": { + "type": "text", + "name": "searchstring", + "value": null + }, + "tag": "input", + "end": 8597, + "tag_type": 1, + "start": 8549 + }, + { + "attributes": {}, + "tag": "div", + "end": 8603, + "tag_type": 2, + "start": 8597 + }, + { + "attributes": { + "type": "hidden", + "name": "page", + "value": "search" + }, + "tag": "input", + "end": 8651, + "tag_type": 1, + "start": 8603 + }, + { + "attributes": { + "type": "hidden", + "name": "pa", + "value": "search" + }, + "tag": "input", + "end": 8697, + "tag_type": 1, + "start": 8651 + }, + { + "attributes": {}, + "tag": "td", + "end": 8702, + "tag_type": 2, + "start": 8697 + }, + { + "attributes": { + "class": "action_td" + }, + "tag": "td", + "end": 8724, + "tag_type": 1, + "start": 8702 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 8744, + "tag_type": 1, + "start": 8724 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/button/search.gif", + "name": "go", + "type": "image", + "alt": "Search", + "border": "0", + "id": "go" + }, + "tag": "input", + "end": 8876, + "tag_type": 1, + "start": 8744 + }, + { + "attributes": {}, + "tag": "div", + "end": 8882, + "tag_type": 2, + "start": 8876 + }, + { + "attributes": {}, + "tag": "td", + "end": 8887, + "tag_type": 2, + "start": 8882 + }, + { + "attributes": {}, + "tag": "tr", + "end": 8892, + "tag_type": 2, + "start": 8887 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 8900, + "tag_type": 2, + "start": 8892 + }, + { + "attributes": {}, + "tag": "table", + "end": 8908, + "tag_type": 2, + "start": 8900 + }, + { + "attributes": {}, + "tag": "form", + "end": 8915, + "tag_type": 2, + "start": 8908 + }, + { + "start": 8915, + "end": 8919 + }, + { + "attributes": {}, + "tag": "div", + "end": 8925, + "tag_type": 2, + "start": 8919 + }, + { + "attributes": {}, + "tag": "div", + "end": 8931, + "tag_type": 2, + "start": 8925 + }, + { + "attributes": {}, + "tag": "div", + "end": 8937, + "tag_type": 2, + "start": 8931 + }, + { + "attributes": {}, + "tag": "td", + "end": 8942, + "tag_type": 2, + "start": 8937 + }, + { + "attributes": { + "class": "head_r" + }, + "tag": "td", + "end": 8961, + "tag_type": 1, + "start": 8942 + }, + { + "attributes": { + "class": "sbasket" + }, + "tag": "div", + "end": 8982, + "tag_type": 1, + "start": 8961 + }, + { + "attributes": {}, + "tag": "h3", + "end": 8986, + "tag_type": 1, + "start": 8982 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/ShoppingBasket.html" + }, + "tag": "a", + "end": 9030, + "tag_type": 1, + "start": 8986 + }, + { + "start": 9030, + "end": 9048 + }, + { + "attributes": {}, + "tag": "a", + "end": 9052, + "tag_type": 2, + "start": 9048 + }, + { + "attributes": {}, + "tag": "h3", + "end": 9057, + "tag_type": 2, + "start": 9052 + }, + { + "attributes": { + "class": "text_empty" + }, + "tag": "div", + "end": 9081, + "tag_type": 1, + "start": 9057 + }, + { + "start": 9081, + "end": 9088 + }, + { + "attributes": {}, + "tag": "p", + "end": 9091, + "tag_type": 1, + "start": 9088 + }, + { + "start": 9091, + "end": 9111 + }, + { + "attributes": {}, + "tag": "p", + "end": 9115, + "tag_type": 2, + "start": 9111 + }, + { + "start": 9115, + "end": 9119 + }, + { + "attributes": {}, + "tag": "div", + "end": 9125, + "tag_type": 2, + "start": 9119 + }, + { + "start": 9125, + "end": 9129 + }, + { + "attributes": {}, + "tag": "div", + "end": 9135, + "tag_type": 2, + "start": 9129 + }, + { + "attributes": {}, + "tag": "td", + "end": 9140, + "tag_type": 2, + "start": 9135 + }, + { + "attributes": {}, + "tag": "tr", + "end": 9145, + "tag_type": 2, + "start": 9140 + }, + { + "start": 9145, + "end": 9149 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 9157, + "tag_type": 2, + "start": 9149 + }, + { + "attributes": {}, + "tag": "table", + "end": 9165, + "tag_type": 2, + "start": 9157 + }, + { + "attributes": {}, + "tag": "div", + "end": 9171, + "tag_type": 2, + "start": 9165 + }, + { + "start": 9171, + "end": 9183 + }, + { + "attributes": { + "id": "navbar_contain" + }, + "tag": "div", + "end": 9208, + "tag_type": 1, + "start": 9183 + }, + { + "start": 9208, + "end": 9220 + }, + { + "attributes": { + "id": "navbar" + }, + "tag": "ul", + "end": 9236, + "tag_type": 1, + "start": 9220 + }, + { + "start": 9236, + "end": 9248 + }, + { + "attributes": { + "id": "nav_home" + }, + "tag": "li", + "end": 9266, + "tag_type": 1, + "start": 9248 + }, + { + "start": 9266, + "end": 9278 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 9290, + "tag_type": 1, + "start": 9278 + }, + { + "attributes": {}, + "tag": "span", + "end": 9296, + "tag_type": 1, + "start": 9290 + }, + { + "start": 9296, + "end": 9300 + }, + { + "attributes": {}, + "tag": "span", + "end": 9307, + "tag_type": 2, + "start": 9300 + }, + { + "attributes": {}, + "tag": "a", + "end": 9311, + "tag_type": 2, + "start": 9307 + }, + { + "start": 9311, + "end": 9335 + }, + { + "attributes": {}, + "tag": "li", + "end": 9340, + "tag_type": 2, + "start": 9335 + }, + { + "start": 9340, + "end": 9352 + }, + { + "attributes": { + "id": "nav_dvd" + }, + "tag": "li", + "end": 9369, + "tag_type": 1, + "start": 9352 + }, + { + "start": 9369, + "end": 9381 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9419, + "tag_type": 1, + "start": 9381 + }, + { + "attributes": {}, + "tag": "span", + "end": 9425, + "tag_type": 1, + "start": 9419 + }, + { + "start": 9425, + "end": 9428 + }, + { + "attributes": {}, + "tag": "span", + "end": 9435, + "tag_type": 2, + "start": 9428 + }, + { + "attributes": {}, + "tag": "a", + "end": 9439, + "tag_type": 2, + "start": 9435 + }, + { + "start": 9439, + "end": 9479 + }, + { + "attributes": {}, + "tag": "ul", + "end": 9483, + "tag_type": 1, + "start": 9479 + }, + { + "start": 9483, + "end": 9527 + }, + { + "attributes": {}, + "tag": "li", + "end": 9531, + "tag_type": 1, + "start": 9527 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9569, + "tag_type": 1, + "start": 9531 + }, + { + "start": 9569, + "end": 9572 + }, + { + "attributes": {}, + "tag": "a", + "end": 9576, + "tag_type": 2, + "start": 9572 + }, + { + "attributes": {}, + "tag": "li", + "end": 9581, + "tag_type": 2, + "start": 9576 + }, + { + "start": 9581, + "end": 9625 + }, + { + "attributes": {}, + "tag": "li", + "end": 9629, + "tag_type": 1, + "start": 9625 + }, + { + "attributes": { + "href": "/DVD/DVD/-/55/70/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 9692, + "tag_type": 1, + "start": 9629 + }, + { + "start": 9692, + "end": 9701 + }, + { + "attributes": {}, + "tag": "a", + "end": 9705, + "tag_type": 2, + "start": 9701 + }, + { + "attributes": {}, + "tag": "li", + "end": 9710, + "tag_type": 2, + "start": 9705 + }, + { + "start": 9710, + "end": 9754 + }, + { + "attributes": {}, + "tag": "li", + "end": 9758, + "tag_type": 1, + "start": 9754 + }, + { + "attributes": { + "href": "/DVD/DVD/-/46/61/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 9821, + "tag_type": 1, + "start": 9758 + }, + { + "start": 9821, + "end": 9838 + }, + { + "attributes": {}, + "tag": "a", + "end": 9842, + "tag_type": 2, + "start": 9838 + }, + { + "attributes": {}, + "tag": "li", + "end": 9847, + "tag_type": 2, + "start": 9842 + }, + { + "start": 9847, + "end": 9891 + }, + { + "attributes": {}, + "tag": "li", + "end": 9895, + "tag_type": 1, + "start": 9891 + }, + { + "attributes": { + "href": "/Music/MusicDVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9940, + "tag_type": 1, + "start": 9895 + }, + { + "start": 9940, + "end": 9949 + }, + { + "attributes": {}, + "tag": "a", + "end": 9953, + "tag_type": 2, + "start": 9949 + }, + { + "attributes": {}, + "tag": "li", + "end": 9958, + "tag_type": 2, + "start": 9953 + }, + { + "start": 9958, + "end": 10002 + }, + { + "attributes": {}, + "tag": "li", + "end": 10006, + "tag_type": 1, + "start": 10002 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10087, + "tag_type": 1, + "start": 10006 + }, + { + "start": 10087, + "end": 10098 + }, + { + "attributes": {}, + "tag": "a", + "end": 10102, + "tag_type": 2, + "start": 10098 + }, + { + "attributes": {}, + "tag": "li", + "end": 10107, + "tag_type": 2, + "start": 10102 + }, + { + "start": 10107, + "end": 10151 + }, + { + "attributes": {}, + "tag": "li", + "end": 10155, + "tag_type": 1, + "start": 10151 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/392/492/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10228, + "tag_type": 1, + "start": 10155 + }, + { + "start": 10228, + "end": 10244 + }, + { + "attributes": {}, + "tag": "a", + "end": 10248, + "tag_type": 2, + "start": 10244 + }, + { + "attributes": {}, + "tag": "li", + "end": 10253, + "tag_type": 2, + "start": 10248 + }, + { + "start": 10253, + "end": 10297 + }, + { + "attributes": {}, + "tag": "li", + "end": 10301, + "tag_type": 1, + "start": 10297 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/723/931/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10376, + "tag_type": 1, + "start": 10301 + }, + { + "start": 10376, + "end": 10398 + }, + { + "attributes": {}, + "tag": "a", + "end": 10402, + "tag_type": 2, + "start": 10398 + }, + { + "attributes": {}, + "tag": "li", + "end": 10407, + "tag_type": 2, + "start": 10402 + }, + { + "start": 10407, + "end": 10451 + }, + { + "attributes": {}, + "tag": "li", + "end": 10455, + "tag_type": 1, + "start": 10451 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/565/750/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10528, + "tag_type": 1, + "start": 10455 + }, + { + "start": 10528, + "end": 10540 + }, + { + "attributes": {}, + "tag": "a", + "end": 10544, + "tag_type": 2, + "start": 10540 + }, + { + "attributes": {}, + "tag": "li", + "end": 10549, + "tag_type": 2, + "start": 10544 + }, + { + "start": 10549, + "end": 10593 + }, + { + "attributes": {}, + "tag": "li", + "end": 10597, + "tag_type": 1, + "start": 10593 + }, + { + "attributes": { + "href": "/Books/Books/-/184/241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10666, + "tag_type": 1, + "start": 10597 + }, + { + "start": 10666, + "end": 10676 + }, + { + "attributes": {}, + "tag": "a", + "end": 10680, + "tag_type": 2, + "start": 10676 + }, + { + "attributes": {}, + "tag": "li", + "end": 10685, + "tag_type": 2, + "start": 10680 + }, + { + "start": 10685, + "end": 10729 + }, + { + "attributes": {}, + "tag": "li", + "end": 10733, + "tag_type": 1, + "start": 10729 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=dvd" + }, + "tag": "a", + "end": 10822, + "tag_type": 1, + "start": 10733 + }, + { + "start": 10822, + "end": 10836 + }, + { + "attributes": {}, + "tag": "a", + "end": 10840, + "tag_type": 2, + "start": 10836 + }, + { + "attributes": {}, + "tag": "li", + "end": 10845, + "tag_type": 2, + "start": 10840 + }, + { + "start": 10845, + "end": 10889 + }, + { + "attributes": {}, + "tag": "ul", + "end": 10894, + "tag_type": 2, + "start": 10889 + }, + { + "start": 10894, + "end": 10922 + }, + { + "attributes": {}, + "tag": "li", + "end": 10927, + "tag_type": 2, + "start": 10922 + }, + { + "start": 10927, + "end": 10939 + }, + { + "attributes": { + "id": "nav_blu" + }, + "tag": "li", + "end": 10956, + "tag_type": 1, + "start": 10939 + }, + { + "start": 10956, + "end": 10968 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 11010, + "tag_type": 1, + "start": 10968 + }, + { + "attributes": {}, + "tag": "span", + "end": 11016, + "tag_type": 1, + "start": 11010 + }, + { + "start": 11016, + "end": 11023 + }, + { + "attributes": {}, + "tag": "span", + "end": 11030, + "tag_type": 2, + "start": 11023 + }, + { + "attributes": {}, + "tag": "a", + "end": 11034, + "tag_type": 2, + "start": 11030 + }, + { + "start": 11034, + "end": 11074 + }, + { + "attributes": {}, + "tag": "ul", + "end": 11078, + "tag_type": 1, + "start": 11074 + }, + { + "start": 11078, + "end": 11122 + }, + { + "attributes": {}, + "tag": "li", + "end": 11126, + "tag_type": 1, + "start": 11122 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 11168, + "tag_type": 1, + "start": 11126 + }, + { + "start": 11168, + "end": 11172 + }, + { + "attributes": {}, + "tag": "a", + "end": 11176, + "tag_type": 2, + "start": 11172 + }, + { + "attributes": {}, + "tag": "li", + "end": 11181, + "tag_type": 2, + "start": 11176 + }, + { + "start": 11181, + "end": 11225 + }, + { + "attributes": {}, + "tag": "li", + "end": 11229, + "tag_type": 1, + "start": 11225 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/TopSellers.html" + }, + "tag": "a", + "end": 11271, + "tag_type": 1, + "start": 11229 + }, + { + "start": 11271, + "end": 11290 + }, + { + "attributes": {}, + "tag": "a", + "end": 11294, + "tag_type": 2, + "start": 11290 + }, + { + "attributes": {}, + "tag": "li", + "end": 11299, + "tag_type": 2, + "start": 11294 + }, + { + "start": 11299, + "end": 11343 + }, + { + "attributes": {}, + "tag": "li", + "end": 11347, + "tag_type": 1, + "start": 11343 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 11392, + "tag_type": 1, + "start": 11347 + }, + { + "start": 11392, + "end": 11409 + }, + { + "attributes": {}, + "tag": "a", + "end": 11413, + "tag_type": 2, + "start": 11409 + }, + { + "attributes": {}, + "tag": "li", + "end": 11418, + "tag_type": 2, + "start": 11413 + }, + { + "start": 11418, + "end": 11462 + }, + { + "attributes": {}, + "tag": "li", + "end": 11466, + "tag_type": 1, + "start": 11462 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/PromoList.html" + }, + "tag": "a", + "end": 11507, + "tag_type": 1, + "start": 11466 + }, + { + "start": 11507, + "end": 11523 + }, + { + "attributes": {}, + "tag": "a", + "end": 11527, + "tag_type": 2, + "start": 11523 + }, + { + "attributes": {}, + "tag": "li", + "end": 11532, + "tag_type": 2, + "start": 11527 + }, + { + "start": 11532, + "end": 11576 + }, + { + "attributes": {}, + "tag": "li", + "end": 11580, + "tag_type": 1, + "start": 11576 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/836/1052/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 11662, + "tag_type": 1, + "start": 11580 + }, + { + "start": 11662, + "end": 11677 + }, + { + "attributes": {}, + "tag": "a", + "end": 11681, + "tag_type": 2, + "start": 11677 + }, + { + "attributes": {}, + "tag": "li", + "end": 11686, + "tag_type": 2, + "start": 11681 + }, + { + "start": 11686, + "end": 11730 + }, + { + "attributes": {}, + "tag": "li", + "end": 11734, + "tag_type": 1, + "start": 11730 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 11815, + "tag_type": 1, + "start": 11734 + }, + { + "start": 11815, + "end": 11821 + }, + { + "attributes": {}, + "tag": "a", + "end": 11825, + "tag_type": 2, + "start": 11821 + }, + { + "attributes": {}, + "tag": "li", + "end": 11830, + "tag_type": 2, + "start": 11825 + }, + { + "start": 11830, + "end": 11874 + }, + { + "attributes": {}, + "tag": "li", + "end": 11878, + "tag_type": 1, + "start": 11874 + }, + { + "attributes": { + "href": "/Games/PlayStation3/3-/164637/2-/Promo.html" + }, + "tag": "a", + "end": 11932, + "tag_type": 1, + "start": 11878 + }, + { + "start": 11932, + "end": 11944 + }, + { + "attributes": {}, + "tag": "a", + "end": 11948, + "tag_type": 2, + "start": 11944 + }, + { + "attributes": {}, + "tag": "li", + "end": 11953, + "tag_type": 2, + "start": 11948 + }, + { + "start": 11953, + "end": 11997 + }, + { + "attributes": {}, + "tag": "li", + "end": 12001, + "tag_type": 1, + "start": 11997 + }, + { + "attributes": { + "href": "/Games/PlayStation3/6-/RegionHome.html" + }, + "tag": "a", + "end": 12050, + "tag_type": 1, + "start": 12001 + }, + { + "start": 12050, + "end": 12059 + }, + { + "attributes": {}, + "tag": "a", + "end": 12063, + "tag_type": 2, + "start": 12059 + }, + { + "attributes": {}, + "tag": "li", + "end": 12068, + "tag_type": 2, + "start": 12063 + }, + { + "start": 12068, + "end": 12112 + }, + { + "attributes": {}, + "tag": "li", + "end": 12116, + "tag_type": 1, + "start": 12112 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12197, + "tag_type": 1, + "start": 12116 + }, + { + "start": 12197, + "end": 12216 + }, + { + "attributes": {}, + "tag": "a", + "end": 12220, + "tag_type": 2, + "start": 12216 + }, + { + "attributes": {}, + "tag": "li", + "end": 12225, + "tag_type": 2, + "start": 12220 + }, + { + "start": 12225, + "end": 12269 + }, + { + "attributes": {}, + "tag": "ul", + "end": 12274, + "tag_type": 2, + "start": 12269 + }, + { + "start": 12274, + "end": 12302 + }, + { + "attributes": {}, + "tag": "li", + "end": 12307, + "tag_type": 2, + "start": 12302 + }, + { + "start": 12307, + "end": 12319 + }, + { + "attributes": { + "id": "nav_music" + }, + "tag": "li", + "end": 12338, + "tag_type": 1, + "start": 12319 + }, + { + "start": 12338, + "end": 12350 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 12389, + "tag_type": 1, + "start": 12350 + }, + { + "attributes": {}, + "tag": "span", + "end": 12395, + "tag_type": 1, + "start": 12389 + }, + { + "start": 12395, + "end": 12400 + }, + { + "attributes": {}, + "tag": "span", + "end": 12407, + "tag_type": 2, + "start": 12400 + }, + { + "attributes": {}, + "tag": "a", + "end": 12411, + "tag_type": 2, + "start": 12407 + }, + { + "start": 12411, + "end": 12451 + }, + { + "attributes": {}, + "tag": "ul", + "end": 12455, + "tag_type": 1, + "start": 12451 + }, + { + "start": 12455, + "end": 12499 + }, + { + "attributes": {}, + "tag": "li", + "end": 12503, + "tag_type": 1, + "start": 12499 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 12542, + "tag_type": 1, + "start": 12503 + }, + { + "start": 12542, + "end": 12544 + }, + { + "attributes": {}, + "tag": "a", + "end": 12548, + "tag_type": 2, + "start": 12544 + }, + { + "attributes": {}, + "tag": "li", + "end": 12553, + "tag_type": 2, + "start": 12548 + }, + { + "start": 12553, + "end": 12597 + }, + { + "attributes": {}, + "tag": "li", + "end": 12601, + "tag_type": 1, + "start": 12597 + }, + { + "attributes": { + "href": "/Music/CD/-/27/30/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12665, + "tag_type": 1, + "start": 12601 + }, + { + "start": 12665, + "end": 12677 + }, + { + "attributes": {}, + "tag": "a", + "end": 12681, + "tag_type": 2, + "start": 12677 + }, + { + "attributes": {}, + "tag": "li", + "end": 12686, + "tag_type": 2, + "start": 12681 + }, + { + "start": 12686, + "end": 12730 + }, + { + "attributes": {}, + "tag": "li", + "end": 12734, + "tag_type": 1, + "start": 12730 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/959/1208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12813, + "tag_type": 1, + "start": 12734 + }, + { + "start": 12813, + "end": 12828 + }, + { + "attributes": {}, + "tag": "a", + "end": 12832, + "tag_type": 2, + "start": 12828 + }, + { + "attributes": {}, + "tag": "li", + "end": 12837, + "tag_type": 2, + "start": 12832 + }, + { + "start": 12837, + "end": 12881 + }, + { + "attributes": {}, + "tag": "li", + "end": 12885, + "tag_type": 1, + "start": 12881 + }, + { + "attributes": { + "href": "/Music/MP3-Download/6-/DigitalHome.html" + }, + "tag": "a", + "end": 12935, + "tag_type": 1, + "start": 12885 + }, + { + "start": 12935, + "end": 12948 + }, + { + "attributes": {}, + "tag": "a", + "end": 12952, + "tag_type": 2, + "start": 12948 + }, + { + "attributes": {}, + "tag": "li", + "end": 12957, + "tag_type": 2, + "start": 12952 + }, + { + "start": 12957, + "end": 13001 + }, + { + "attributes": {}, + "tag": "li", + "end": 13005, + "tag_type": 1, + "start": 13001 + }, + { + "attributes": { + "href": "/Music/MusicDVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 13050, + "tag_type": 1, + "start": 13005 + }, + { + "start": 13050, + "end": 13059 + }, + { + "attributes": {}, + "tag": "a", + "end": 13063, + "tag_type": 2, + "start": 13059 + }, + { + "attributes": {}, + "tag": "li", + "end": 13068, + "tag_type": 2, + "start": 13063 + }, + { + "start": 13068, + "end": 13112 + }, + { + "attributes": {}, + "tag": "li", + "end": 13116, + "tag_type": 1, + "start": 13112 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13197, + "tag_type": 1, + "start": 13116 + }, + { + "start": 13197, + "end": 13220 + }, + { + "attributes": {}, + "tag": "a", + "end": 13224, + "tag_type": 2, + "start": 13220 + }, + { + "attributes": {}, + "tag": "li", + "end": 13229, + "tag_type": 2, + "start": 13224 + }, + { + "start": 13229, + "end": 13273 + }, + { + "attributes": {}, + "tag": "li", + "end": 13277, + "tag_type": 1, + "start": 13273 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 13353, + "tag_type": 1, + "start": 13277 + }, + { + "start": 13353, + "end": 13367 + }, + { + "attributes": {}, + "tag": "a", + "end": 13371, + "tag_type": 2, + "start": 13367 + }, + { + "attributes": {}, + "tag": "li", + "end": 13376, + "tag_type": 2, + "start": 13371 + }, + { + "start": 13376, + "end": 13420 + }, + { + "attributes": {}, + "tag": "li", + "end": 13424, + "tag_type": 1, + "start": 13420 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/570/755/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13497, + "tag_type": 1, + "start": 13424 + }, + { + "start": 13497, + "end": 13510 + }, + { + "attributes": {}, + "tag": "a", + "end": 13514, + "tag_type": 2, + "start": 13510 + }, + { + "attributes": {}, + "tag": "li", + "end": 13519, + "tag_type": 2, + "start": 13514 + }, + { + "start": 13519, + "end": 13563 + }, + { + "attributes": {}, + "tag": "li", + "end": 13567, + "tag_type": 1, + "start": 13563 + }, + { + "attributes": { + "href": "/Books/Books/-/184/241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13636, + "tag_type": 1, + "start": 13567 + }, + { + "start": 13636, + "end": 13647 + }, + { + "attributes": {}, + "tag": "a", + "end": 13651, + "tag_type": 2, + "start": 13647 + }, + { + "attributes": {}, + "tag": "li", + "end": 13656, + "tag_type": 2, + "start": 13651 + }, + { + "start": 13656, + "end": 13700 + }, + { + "attributes": {}, + "tag": "li", + "end": 13704, + "tag_type": 1, + "start": 13700 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=cd" + }, + "tag": "a", + "end": 13792, + "tag_type": 1, + "start": 13704 + }, + { + "start": 13792, + "end": 13805 + }, + { + "attributes": {}, + "tag": "a", + "end": 13809, + "tag_type": 2, + "start": 13805 + }, + { + "attributes": {}, + "tag": "li", + "end": 13814, + "tag_type": 2, + "start": 13809 + }, + { + "start": 13814, + "end": 13858 + }, + { + "attributes": {}, + "tag": "ul", + "end": 13863, + "tag_type": 2, + "start": 13858 + }, + { + "start": 13863, + "end": 13891 + }, + { + "attributes": {}, + "tag": "li", + "end": 13896, + "tag_type": 2, + "start": 13891 + }, + { + "start": 13896, + "end": 13908 + }, + { + "attributes": { + "id": "nav_tickets" + }, + "tag": "li", + "end": 13929, + "tag_type": 1, + "start": 13908 + }, + { + "start": 13929, + "end": 13941 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 13992, + "tag_type": 1, + "start": 13941 + }, + { + "attributes": {}, + "tag": "span", + "end": 13998, + "tag_type": 1, + "start": 13992 + }, + { + "start": 13998, + "end": 14005 + }, + { + "attributes": {}, + "tag": "span", + "end": 14012, + "tag_type": 2, + "start": 14005 + }, + { + "attributes": {}, + "tag": "a", + "end": 14016, + "tag_type": 2, + "start": 14012 + }, + { + "start": 14016, + "end": 14056 + }, + { + "attributes": {}, + "tag": "ul", + "end": 14060, + "tag_type": 1, + "start": 14056 + }, + { + "start": 14060, + "end": 14104 + }, + { + "attributes": {}, + "tag": "li", + "end": 14108, + "tag_type": 1, + "start": 14104 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 14159, + "tag_type": 1, + "start": 14108 + }, + { + "start": 14159, + "end": 14163 + }, + { + "attributes": {}, + "tag": "a", + "end": 14167, + "tag_type": 2, + "start": 14163 + }, + { + "attributes": {}, + "tag": "li", + "end": 14172, + "tag_type": 2, + "start": 14167 + }, + { + "start": 14172, + "end": 14216 + }, + { + "attributes": {}, + "tag": "li", + "end": 14220, + "tag_type": 1, + "start": 14216 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/959/1208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14299, + "tag_type": 1, + "start": 14220 + }, + { + "start": 14299, + "end": 14314 + }, + { + "attributes": {}, + "tag": "a", + "end": 14318, + "tag_type": 2, + "start": 14314 + }, + { + "attributes": {}, + "tag": "li", + "end": 14323, + "tag_type": 2, + "start": 14318 + }, + { + "start": 14323, + "end": 14367 + }, + { + "attributes": {}, + "tag": "li", + "end": 14371, + "tag_type": 1, + "start": 14367 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/968/1217/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14450, + "tag_type": 1, + "start": 14371 + }, + { + "start": 14450, + "end": 14468 + }, + { + "attributes": {}, + "tag": "a", + "end": 14472, + "tag_type": 2, + "start": 14468 + }, + { + "attributes": {}, + "tag": "li", + "end": 14477, + "tag_type": 2, + "start": 14472 + }, + { + "start": 14477, + "end": 14521 + }, + { + "attributes": {}, + "tag": "li", + "end": 14525, + "tag_type": 1, + "start": 14521 + }, + { + "attributes": { + "href": "/GenreBrowse.aspx?r=TICKETS_EVENT&p=969&g=1218" + }, + "tag": "a", + "end": 14590, + "tag_type": 1, + "start": 14525 + }, + { + "start": 14590, + "end": 14596 + }, + { + "attributes": {}, + "tag": "a", + "end": 14600, + "tag_type": 2, + "start": 14596 + }, + { + "attributes": {}, + "tag": "li", + "end": 14605, + "tag_type": 2, + "start": 14600 + }, + { + "start": 14605, + "end": 14649 + }, + { + "attributes": {}, + "tag": "li", + "end": 14653, + "tag_type": 1, + "start": 14649 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/975/1224/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14732, + "tag_type": 1, + "start": 14653 + }, + { + "start": 14732, + "end": 14738 + }, + { + "attributes": {}, + "tag": "a", + "end": 14742, + "tag_type": 2, + "start": 14738 + }, + { + "attributes": {}, + "tag": "li", + "end": 14747, + "tag_type": 2, + "start": 14742 + }, + { + "start": 14747, + "end": 14791 + }, + { + "attributes": {}, + "tag": "li", + "end": 14795, + "tag_type": 1, + "start": 14791 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/1079/1315/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14875, + "tag_type": 1, + "start": 14795 + }, + { + "start": 14875, + "end": 14886 + }, + { + "attributes": {}, + "tag": "a", + "end": 14890, + "tag_type": 2, + "start": 14886 + }, + { + "attributes": {}, + "tag": "li", + "end": 14895, + "tag_type": 2, + "start": 14890 + }, + { + "start": 14895, + "end": 14939 + }, + { + "attributes": {}, + "tag": "li", + "end": 14943, + "tag_type": 1, + "start": 14939 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 15019, + "tag_type": 1, + "start": 14943 + }, + { + "start": 15019, + "end": 15033 + }, + { + "attributes": {}, + "tag": "a", + "end": 15037, + "tag_type": 2, + "start": 15033 + }, + { + "attributes": {}, + "tag": "li", + "end": 15042, + "tag_type": 2, + "start": 15037 + }, + { + "start": 15042, + "end": 15086 + }, + { + "attributes": {}, + "tag": "li", + "end": 15090, + "tag_type": 1, + "start": 15086 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=ticket" + }, + "tag": "a", + "end": 15182, + "tag_type": 1, + "start": 15090 + }, + { + "start": 15182, + "end": 15199 + }, + { + "attributes": {}, + "tag": "a", + "end": 15203, + "tag_type": 2, + "start": 15199 + }, + { + "attributes": {}, + "tag": "li", + "end": 15208, + "tag_type": 2, + "start": 15203 + }, + { + "start": 15208, + "end": 15252 + }, + { + "attributes": {}, + "tag": "ul", + "end": 15257, + "tag_type": 2, + "start": 15252 + }, + { + "start": 15257, + "end": 15285 + }, + { + "attributes": {}, + "tag": "li", + "end": 15290, + "tag_type": 2, + "start": 15285 + }, + { + "start": 15290, + "end": 15302 + }, + { + "attributes": { + "id": "nav_game" + }, + "tag": "li", + "end": 15320, + "tag_type": 1, + "start": 15302 + }, + { + "start": 15320, + "end": 15332 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 15374, + "tag_type": 1, + "start": 15332 + }, + { + "attributes": {}, + "tag": "span", + "end": 15380, + "tag_type": 1, + "start": 15374 + }, + { + "start": 15380, + "end": 15385 + }, + { + "attributes": {}, + "tag": "span", + "end": 15392, + "tag_type": 2, + "start": 15385 + }, + { + "attributes": {}, + "tag": "a", + "end": 15396, + "tag_type": 2, + "start": 15392 + }, + { + "start": 15396, + "end": 15436 + }, + { + "attributes": {}, + "tag": "ul", + "end": 15440, + "tag_type": 1, + "start": 15436 + }, + { + "start": 15440, + "end": 15484 + }, + { + "attributes": {}, + "tag": "li", + "end": 15488, + "tag_type": 1, + "start": 15484 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 15530, + "tag_type": 1, + "start": 15488 + }, + { + "start": 15530, + "end": 15534 + }, + { + "attributes": {}, + "tag": "a", + "end": 15538, + "tag_type": 2, + "start": 15534 + }, + { + "attributes": {}, + "tag": "li", + "end": 15543, + "tag_type": 2, + "start": 15538 + }, + { + "start": 15543, + "end": 15587 + }, + { + "attributes": {}, + "tag": "li", + "end": 15591, + "tag_type": 1, + "start": 15587 + }, + { + "attributes": { + "href": "/Games/Games/6-/Campaign.html?campaign=5371&cid=2061705" + }, + "tag": "a", + "end": 15661, + "tag_type": 1, + "start": 15591 + }, + { + "start": 15661, + "end": 15675 + }, + { + "attributes": {}, + "tag": "a", + "end": 15679, + "tag_type": 2, + "start": 15675 + }, + { + "attributes": {}, + "tag": "li", + "end": 15684, + "tag_type": 2, + "start": 15679 + }, + { + "start": 15684, + "end": 15728 + }, + { + "attributes": {}, + "tag": "li", + "end": 15732, + "tag_type": 1, + "start": 15728 + }, + { + "attributes": { + "href": "/Games/PlayStation3/6-/RegionHome.html" + }, + "tag": "a", + "end": 15781, + "tag_type": 1, + "start": 15732 + }, + { + "start": 15781, + "end": 15789 + }, + { + "attributes": {}, + "tag": "a", + "end": 15793, + "tag_type": 2, + "start": 15789 + }, + { + "attributes": {}, + "tag": "li", + "end": 15798, + "tag_type": 2, + "start": 15793 + }, + { + "start": 15798, + "end": 15842 + }, + { + "attributes": {}, + "tag": "li", + "end": 15846, + "tag_type": 1, + "start": 15842 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/RegionHome.html" + }, + "tag": "a", + "end": 15895, + "tag_type": 1, + "start": 15846 + }, + { + "start": 15895, + "end": 15903 + }, + { + "attributes": {}, + "tag": "a", + "end": 15907, + "tag_type": 2, + "start": 15903 + }, + { + "attributes": {}, + "tag": "li", + "end": 15912, + "tag_type": 2, + "start": 15907 + }, + { + "start": 15912, + "end": 15956 + }, + { + "attributes": {}, + "tag": "li", + "end": 15960, + "tag_type": 1, + "start": 15956 + }, + { + "attributes": { + "href": "/Games/PSP/6-/RegionHome.html" + }, + "tag": "a", + "end": 16000, + "tag_type": 1, + "start": 15960 + }, + { + "start": 16000, + "end": 16008 + }, + { + "attributes": {}, + "tag": "a", + "end": 16012, + "tag_type": 2, + "start": 16008 + }, + { + "attributes": {}, + "tag": "li", + "end": 16017, + "tag_type": 2, + "start": 16012 + }, + { + "start": 16017, + "end": 16061 + }, + { + "attributes": {}, + "tag": "li", + "end": 16065, + "tag_type": 1, + "start": 16061 + }, + { + "attributes": { + "href": "/Games/Wii/6-/RegionHome.html" + }, + "tag": "a", + "end": 16105, + "tag_type": 1, + "start": 16065 + }, + { + "start": 16105, + "end": 16117 + }, + { + "attributes": {}, + "tag": "a", + "end": 16121, + "tag_type": 2, + "start": 16117 + }, + { + "attributes": {}, + "tag": "li", + "end": 16126, + "tag_type": 2, + "start": 16121 + }, + { + "start": 16126, + "end": 16170 + }, + { + "attributes": {}, + "tag": "li", + "end": 16174, + "tag_type": 1, + "start": 16170 + }, + { + "attributes": { + "href": "/Games/DS/6-/RegionHome.html" + }, + "tag": "a", + "end": 16213, + "tag_type": 1, + "start": 16174 + }, + { + "start": 16213, + "end": 16234 + }, + { + "attributes": {}, + "tag": "a", + "end": 16238, + "tag_type": 2, + "start": 16234 + }, + { + "attributes": {}, + "tag": "li", + "end": 16243, + "tag_type": 2, + "start": 16238 + }, + { + "start": 16243, + "end": 16287 + }, + { + "attributes": {}, + "tag": "li", + "end": 16291, + "tag_type": 1, + "start": 16287 + }, + { + "attributes": { + "href": "/Games/Xbox360/6-/RegionHome.html" + }, + "tag": "a", + "end": 16335, + "tag_type": 1, + "start": 16291 + }, + { + "start": 16335, + "end": 16343 + }, + { + "attributes": {}, + "tag": "a", + "end": 16347, + "tag_type": 2, + "start": 16343 + }, + { + "attributes": {}, + "tag": "li", + "end": 16352, + "tag_type": 2, + "start": 16347 + }, + { + "start": 16352, + "end": 16396 + }, + { + "attributes": {}, + "tag": "li", + "end": 16400, + "tag_type": 1, + "start": 16396 + }, + { + "attributes": { + "href": "/Games/PC/6-/RegionHome.html" + }, + "tag": "a", + "end": 16439, + "tag_type": 1, + "start": 16400 + }, + { + "start": 16439, + "end": 16447 + }, + { + "attributes": {}, + "tag": "a", + "end": 16451, + "tag_type": 2, + "start": 16447 + }, + { + "attributes": {}, + "tag": "li", + "end": 16456, + "tag_type": 2, + "start": 16451 + }, + { + "start": 16456, + "end": 16500 + }, + { + "attributes": {}, + "tag": "li", + "end": 16504, + "tag_type": 1, + "start": 16500 + }, + { + "attributes": { + "href": "/Games/PC/3-/4047/2-/Promo.html?dpr=4047" + }, + "tag": "a", + "end": 16555, + "tag_type": 1, + "start": 16504 + }, + { + "start": 16555, + "end": 16564 + }, + { + "attributes": {}, + "tag": "a", + "end": 16568, + "tag_type": 2, + "start": 16564 + }, + { + "attributes": {}, + "tag": "li", + "end": 16573, + "tag_type": 2, + "start": 16568 + }, + { + "start": 16573, + "end": 16617 + }, + { + "attributes": {}, + "tag": "li", + "end": 16621, + "tag_type": 1, + "start": 16617 + }, + { + "attributes": { + "href": "/Books/Books/-/128/185/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16690, + "tag_type": 1, + "start": 16621 + }, + { + "start": 16690, + "end": 16702 + }, + { + "attributes": {}, + "tag": "a", + "end": 16706, + "tag_type": 2, + "start": 16702 + }, + { + "attributes": {}, + "tag": "li", + "end": 16711, + "tag_type": 2, + "start": 16706 + }, + { + "start": 16711, + "end": 16755 + }, + { + "attributes": {}, + "tag": "li", + "end": 16759, + "tag_type": 1, + "start": 16755 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/837/1053/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16835, + "tag_type": 1, + "start": 16759 + }, + { + "start": 16835, + "end": 16849 + }, + { + "attributes": {}, + "tag": "a", + "end": 16853, + "tag_type": 2, + "start": 16849 + }, + { + "attributes": {}, + "tag": "li", + "end": 16858, + "tag_type": 2, + "start": 16853 + }, + { + "start": 16858, + "end": 16902 + }, + { + "attributes": {}, + "tag": "li", + "end": 16906, + "tag_type": 1, + "start": 16902 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/835/1051/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16980, + "tag_type": 1, + "start": 16906 + }, + { + "start": 16980, + "end": 16997 + }, + { + "attributes": {}, + "tag": "a", + "end": 17001, + "tag_type": 2, + "start": 16997 + }, + { + "attributes": {}, + "tag": "li", + "end": 17006, + "tag_type": 2, + "start": 17001 + }, + { + "start": 17006, + "end": 17050 + }, + { + "attributes": {}, + "tag": "li", + "end": 17054, + "tag_type": 1, + "start": 17050 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=game" + }, + "tag": "a", + "end": 17144, + "tag_type": 1, + "start": 17054 + }, + { + "start": 17144, + "end": 17159 + }, + { + "attributes": {}, + "tag": "a", + "end": 17163, + "tag_type": 2, + "start": 17159 + }, + { + "attributes": {}, + "tag": "li", + "end": 17168, + "tag_type": 2, + "start": 17163 + }, + { + "start": 17168, + "end": 17212 + }, + { + "attributes": {}, + "tag": "ul", + "end": 17217, + "tag_type": 2, + "start": 17212 + }, + { + "start": 17217, + "end": 17245 + }, + { + "attributes": {}, + "tag": "li", + "end": 17250, + "tag_type": 2, + "start": 17245 + }, + { + "start": 17250, + "end": 17262 + }, + { + "attributes": { + "id": "nav_book" + }, + "tag": "li", + "end": 17280, + "tag_type": 1, + "start": 17262 + }, + { + "start": 17280, + "end": 17292 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 17334, + "tag_type": 1, + "start": 17292 + }, + { + "attributes": {}, + "tag": "span", + "end": 17340, + "tag_type": 1, + "start": 17334 + }, + { + "start": 17340, + "end": 17345 + }, + { + "attributes": {}, + "tag": "span", + "end": 17352, + "tag_type": 2, + "start": 17345 + }, + { + "attributes": {}, + "tag": "a", + "end": 17356, + "tag_type": 2, + "start": 17352 + }, + { + "start": 17356, + "end": 17396 + }, + { + "attributes": {}, + "tag": "ul", + "end": 17400, + "tag_type": 1, + "start": 17396 + }, + { + "start": 17400, + "end": 17444 + }, + { + "attributes": {}, + "tag": "li", + "end": 17448, + "tag_type": 1, + "start": 17444 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 17490, + "tag_type": 1, + "start": 17448 + }, + { + "start": 17490, + "end": 17494 + }, + { + "attributes": {}, + "tag": "a", + "end": 17498, + "tag_type": 2, + "start": 17494 + }, + { + "attributes": {}, + "tag": "li", + "end": 17503, + "tag_type": 2, + "start": 17498 + }, + { + "start": 17503, + "end": 17547 + }, + { + "attributes": {}, + "tag": "li", + "end": 17551, + "tag_type": 1, + "start": 17547 + }, + { + "attributes": { + "href": "/Books/Books/-/104/161/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17620, + "tag_type": 1, + "start": 17551 + }, + { + "start": 17620, + "end": 17630 + }, + { + "attributes": {}, + "tag": "a", + "end": 17634, + "tag_type": 2, + "start": 17630 + }, + { + "attributes": {}, + "tag": "li", + "end": 17639, + "tag_type": 2, + "start": 17634 + }, + { + "start": 17639, + "end": 17683 + }, + { + "attributes": {}, + "tag": "li", + "end": 17687, + "tag_type": 1, + "start": 17683 + }, + { + "attributes": { + "href": "/Books/Books/-/100/157/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17756, + "tag_type": 1, + "start": 17687 + }, + { + "start": 17756, + "end": 17765 + }, + { + "attributes": {}, + "tag": "a", + "end": 17769, + "tag_type": 2, + "start": 17765 + }, + { + "attributes": {}, + "tag": "li", + "end": 17774, + "tag_type": 2, + "start": 17769 + }, + { + "start": 17774, + "end": 17818 + }, + { + "attributes": {}, + "tag": "li", + "end": 17822, + "tag_type": 1, + "start": 17818 + }, + { + "attributes": { + "href": "/Books/Books/-/203/260/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17891, + "tag_type": 1, + "start": 17822 + }, + { + "start": 17891, + "end": 17905 + }, + { + "attributes": {}, + "tag": "a", + "end": 17909, + "tag_type": 2, + "start": 17905 + }, + { + "attributes": {}, + "tag": "li", + "end": 17914, + "tag_type": 2, + "start": 17909 + }, + { + "start": 17914, + "end": 17958 + }, + { + "attributes": {}, + "tag": "li", + "end": 17962, + "tag_type": 1, + "start": 17958 + }, + { + "attributes": { + "href": "/Books/Books/-/200/257/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18031, + "tag_type": 1, + "start": 17962 + }, + { + "start": 18031, + "end": 18051 + }, + { + "attributes": {}, + "tag": "a", + "end": 18055, + "tag_type": 2, + "start": 18051 + }, + { + "attributes": {}, + "tag": "li", + "end": 18060, + "tag_type": 2, + "start": 18055 + }, + { + "start": 18060, + "end": 18104 + }, + { + "attributes": {}, + "tag": "li", + "end": 18108, + "tag_type": 1, + "start": 18104 + }, + { + "attributes": { + "href": "/Books/Books/-/142/199/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18177, + "tag_type": 1, + "start": 18108 + }, + { + "start": 18177, + "end": 18195 + }, + { + "attributes": {}, + "tag": "a", + "end": 18199, + "tag_type": 2, + "start": 18195 + }, + { + "attributes": {}, + "tag": "li", + "end": 18204, + "tag_type": 2, + "start": 18199 + }, + { + "start": 18204, + "end": 18248 + }, + { + "attributes": {}, + "tag": "li", + "end": 18252, + "tag_type": 1, + "start": 18248 + }, + { + "attributes": { + "href": "/Books/Books/-/159/216/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18321, + "tag_type": 1, + "start": 18252 + }, + { + "start": 18321, + "end": 18337 + }, + { + "attributes": {}, + "tag": "a", + "end": 18341, + "tag_type": 2, + "start": 18337 + }, + { + "attributes": {}, + "tag": "li", + "end": 18346, + "tag_type": 2, + "start": 18341 + }, + { + "start": 18346, + "end": 18390 + }, + { + "attributes": {}, + "tag": "li", + "end": 18394, + "tag_type": 1, + "start": 18390 + }, + { + "attributes": { + "href": "/Books/Books/-/151/208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18463, + "tag_type": 1, + "start": 18394 + }, + { + "start": 18463, + "end": 18470 + }, + { + "attributes": {}, + "tag": "a", + "end": 18474, + "tag_type": 2, + "start": 18470 + }, + { + "attributes": {}, + "tag": "li", + "end": 18479, + "tag_type": 2, + "start": 18474 + }, + { + "start": 18479, + "end": 18523 + }, + { + "attributes": {}, + "tag": "li", + "end": 18527, + "tag_type": 1, + "start": 18523 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/RegionHome.html" + }, + "tag": "a", + "end": 18574, + "tag_type": 1, + "start": 18527 + }, + { + "start": 18574, + "end": 18584 + }, + { + "attributes": {}, + "tag": "a", + "end": 18588, + "tag_type": 2, + "start": 18584 + }, + { + "attributes": {}, + "tag": "li", + "end": 18593, + "tag_type": 2, + "start": 18588 + }, + { + "start": 18593, + "end": 18637 + }, + { + "attributes": {}, + "tag": "li", + "end": 18641, + "tag_type": 1, + "start": 18637 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=book" + }, + "tag": "a", + "end": 18731, + "tag_type": 1, + "start": 18641 + }, + { + "start": 18731, + "end": 18746 + }, + { + "attributes": {}, + "tag": "a", + "end": 18750, + "tag_type": 2, + "start": 18746 + }, + { + "attributes": {}, + "tag": "li", + "end": 18755, + "tag_type": 2, + "start": 18750 + }, + { + "start": 18755, + "end": 18799 + }, + { + "attributes": {}, + "tag": "ul", + "end": 18804, + "tag_type": 2, + "start": 18799 + }, + { + "start": 18804, + "end": 18832 + }, + { + "attributes": {}, + "tag": "li", + "end": 18837, + "tag_type": 2, + "start": 18832 + }, + { + "start": 18837, + "end": 18849 + }, + { + "attributes": { + "id": "nav_clth" + }, + "tag": "li", + "end": 18867, + "tag_type": 1, + "start": 18849 + }, + { + "start": 18867, + "end": 18879 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/ClothingHome.html" + }, + "tag": "a", + "end": 18929, + "tag_type": 1, + "start": 18879 + }, + { + "attributes": {}, + "tag": "span", + "end": 18935, + "tag_type": 1, + "start": 18929 + }, + { + "start": 18935, + "end": 18943 + }, + { + "attributes": {}, + "tag": "span", + "end": 18950, + "tag_type": 2, + "start": 18943 + }, + { + "attributes": {}, + "tag": "a", + "end": 18954, + "tag_type": 2, + "start": 18950 + }, + { + "start": 18954, + "end": 18994 + }, + { + "attributes": {}, + "tag": "ul", + "end": 18998, + "tag_type": 1, + "start": 18994 + }, + { + "start": 18998, + "end": 19042 + }, + { + "attributes": {}, + "tag": "li", + "end": 19046, + "tag_type": 1, + "start": 19042 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/ClothingHome.html" + }, + "tag": "a", + "end": 19096, + "tag_type": 1, + "start": 19046 + }, + { + "start": 19096, + "end": 19100 + }, + { + "attributes": {}, + "tag": "a", + "end": 19104, + "tag_type": 2, + "start": 19100 + }, + { + "attributes": {}, + "tag": "li", + "end": 19109, + "tag_type": 2, + "start": 19104 + }, + { + "start": 19109, + "end": 19153 + }, + { + "attributes": {}, + "tag": "li", + "end": 19157, + "tag_type": 1, + "start": 19153 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/720/928/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19232, + "tag_type": 1, + "start": 19157 + }, + { + "start": 19232, + "end": 19245 + }, + { + "attributes": {}, + "tag": "a", + "end": 19249, + "tag_type": 2, + "start": 19245 + }, + { + "attributes": {}, + "tag": "li", + "end": 19254, + "tag_type": 2, + "start": 19249 + }, + { + "start": 19254, + "end": 19298 + }, + { + "attributes": {}, + "tag": "li", + "end": 19302, + "tag_type": 1, + "start": 19298 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/721/929/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19377, + "tag_type": 1, + "start": 19302 + }, + { + "start": 19377, + "end": 19392 + }, + { + "attributes": {}, + "tag": "a", + "end": 19396, + "tag_type": 2, + "start": 19392 + }, + { + "attributes": {}, + "tag": "li", + "end": 19401, + "tag_type": 2, + "start": 19396 + }, + { + "start": 19401, + "end": 19445 + }, + { + "attributes": {}, + "tag": "li", + "end": 19449, + "tag_type": 1, + "start": 19445 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2825&cid=1354516" + }, + "tag": "a", + "end": 19525, + "tag_type": 1, + "start": 19449 + }, + { + "start": 19525, + "end": 19538 + }, + { + "attributes": {}, + "tag": "a", + "end": 19542, + "tag_type": 2, + "start": 19538 + }, + { + "attributes": {}, + "tag": "li", + "end": 19547, + "tag_type": 2, + "start": 19542 + }, + { + "start": 19547, + "end": 19591 + }, + { + "attributes": {}, + "tag": "li", + "end": 19595, + "tag_type": 1, + "start": 19591 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 19671, + "tag_type": 1, + "start": 19595 + }, + { + "start": 19671, + "end": 19685 + }, + { + "attributes": {}, + "tag": "a", + "end": 19689, + "tag_type": 2, + "start": 19685 + }, + { + "attributes": {}, + "tag": "li", + "end": 19694, + "tag_type": 2, + "start": 19689 + }, + { + "start": 19694, + "end": 19738 + }, + { + "attributes": {}, + "tag": "li", + "end": 19742, + "tag_type": 1, + "start": 19738 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/723/931/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19817, + "tag_type": 1, + "start": 19742 + }, + { + "start": 19817, + "end": 19839 + }, + { + "attributes": {}, + "tag": "a", + "end": 19843, + "tag_type": 2, + "start": 19839 + }, + { + "attributes": {}, + "tag": "li", + "end": 19848, + "tag_type": 2, + "start": 19843 + }, + { + "start": 19848, + "end": 19892 + }, + { + "attributes": {}, + "tag": "li", + "end": 19896, + "tag_type": 1, + "start": 19892 + }, + { + "attributes": { + "href": "/Clothing/Accessories/6-/RegionHome.html" + }, + "tag": "a", + "end": 19947, + "tag_type": 1, + "start": 19896 + }, + { + "start": 19947, + "end": 19958 + }, + { + "attributes": {}, + "tag": "a", + "end": 19962, + "tag_type": 2, + "start": 19958 + }, + { + "attributes": {}, + "tag": "li", + "end": 19967, + "tag_type": 2, + "start": 19962 + }, + { + "start": 19967, + "end": 20011 + }, + { + "attributes": {}, + "tag": "li", + "end": 20015, + "tag_type": 1, + "start": 20011 + }, + { + "attributes": { + "href": "/Clothing/Accessories/-/2026/1276/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20095, + "tag_type": 1, + "start": 20015 + }, + { + "start": 20095, + "end": 20105 + }, + { + "attributes": {}, + "tag": "a", + "end": 20109, + "tag_type": 2, + "start": 20105 + }, + { + "attributes": {}, + "tag": "li", + "end": 20114, + "tag_type": 2, + "start": 20109 + }, + { + "start": 20114, + "end": 20158 + }, + { + "attributes": {}, + "tag": "ul", + "end": 20163, + "tag_type": 2, + "start": 20158 + }, + { + "start": 20163, + "end": 20191 + }, + { + "attributes": {}, + "tag": "li", + "end": 20196, + "tag_type": 2, + "start": 20191 + }, + { + "start": 20196, + "end": 20208 + }, + { + "attributes": { + "id": "nav_elec" + }, + "tag": "li", + "end": 20226, + "tag_type": 1, + "start": 20208 + }, + { + "start": 20226, + "end": 20238 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html", + "class": "this" + }, + "tag": "a", + "end": 20305, + "tag_type": 1, + "start": 20238 + }, + { + "attributes": {}, + "tag": "span", + "end": 20311, + "tag_type": 1, + "start": 20305 + }, + { + "start": 20311, + "end": 20322 + }, + { + "attributes": {}, + "tag": "span", + "end": 20329, + "tag_type": 2, + "start": 20322 + }, + { + "attributes": {}, + "tag": "a", + "end": 20333, + "tag_type": 2, + "start": 20329 + }, + { + "start": 20333, + "end": 20373 + }, + { + "attributes": {}, + "tag": "ul", + "end": 20377, + "tag_type": 1, + "start": 20373 + }, + { + "start": 20377, + "end": 20421 + }, + { + "attributes": {}, + "tag": "li", + "end": 20425, + "tag_type": 1, + "start": 20421 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html" + }, + "tag": "a", + "end": 20479, + "tag_type": 1, + "start": 20425 + }, + { + "start": 20479, + "end": 20483 + }, + { + "attributes": {}, + "tag": "a", + "end": 20487, + "tag_type": 2, + "start": 20483 + }, + { + "attributes": {}, + "tag": "li", + "end": 20492, + "tag_type": 2, + "start": 20487 + }, + { + "start": 20492, + "end": 20536 + }, + { + "attributes": {}, + "tag": "li", + "end": 20540, + "tag_type": 1, + "start": 20536 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20621, + "tag_type": 1, + "start": 20540 + }, + { + "start": 20621, + "end": 20632 + }, + { + "attributes": {}, + "tag": "a", + "end": 20636, + "tag_type": 2, + "start": 20632 + }, + { + "attributes": {}, + "tag": "li", + "end": 20641, + "tag_type": 2, + "start": 20636 + }, + { + "start": 20641, + "end": 20685 + }, + { + "attributes": {}, + "tag": "li", + "end": 20689, + "tag_type": 1, + "start": 20685 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20770, + "tag_type": 1, + "start": 20689 + }, + { + "start": 20770, + "end": 20793 + }, + { + "attributes": {}, + "tag": "a", + "end": 20797, + "tag_type": 2, + "start": 20793 + }, + { + "attributes": {}, + "tag": "li", + "end": 20802, + "tag_type": 2, + "start": 20797 + }, + { + "start": 20802, + "end": 20846 + }, + { + "attributes": {}, + "tag": "li", + "end": 20850, + "tag_type": 1, + "start": 20846 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20933, + "tag_type": 1, + "start": 20850 + }, + { + "start": 20933, + "end": 20941 + }, + { + "attributes": {}, + "tag": "a", + "end": 20945, + "tag_type": 2, + "start": 20941 + }, + { + "attributes": {}, + "tag": "li", + "end": 20950, + "tag_type": 2, + "start": 20945 + }, + { + "start": 20950, + "end": 20994 + }, + { + "attributes": {}, + "tag": "li", + "end": 20998, + "tag_type": 1, + "start": 20994 + }, + { + "attributes": { + "href": "/Games/Games/6-/Campaign.html?campaign=5371&cid=2061705" + }, + "tag": "a", + "end": 21068, + "tag_type": 1, + "start": 20998 + }, + { + "start": 21068, + "end": 21082 + }, + { + "attributes": {}, + "tag": "a", + "end": 21086, + "tag_type": 2, + "start": 21082 + }, + { + "attributes": {}, + "tag": "li", + "end": 21091, + "tag_type": 2, + "start": 21086 + }, + { + "start": 21091, + "end": 21135 + }, + { + "attributes": {}, + "tag": "li", + "end": 21139, + "tag_type": 1, + "start": 21135 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 21176, + "tag_type": 1, + "start": 21139 + }, + { + "start": 21176, + "end": 21185 + }, + { + "attributes": {}, + "tag": "a", + "end": 21189, + "tag_type": 2, + "start": 21185 + }, + { + "attributes": {}, + "tag": "li", + "end": 21194, + "tag_type": 2, + "start": 21189 + }, + { + "start": 21194, + "end": 21238 + }, + { + "attributes": {}, + "tag": "li", + "end": 21242, + "tag_type": 1, + "start": 21238 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21323, + "tag_type": 1, + "start": 21242 + }, + { + "start": 21323, + "end": 21348 + }, + { + "attributes": {}, + "tag": "a", + "end": 21352, + "tag_type": 2, + "start": 21348 + }, + { + "attributes": {}, + "tag": "li", + "end": 21357, + "tag_type": 2, + "start": 21352 + }, + { + "start": 21357, + "end": 21401 + }, + { + "attributes": {}, + "tag": "li", + "end": 21405, + "tag_type": 1, + "start": 21401 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21486, + "tag_type": 1, + "start": 21405 + }, + { + "start": 21486, + "end": 21501 + }, + { + "attributes": {}, + "tag": "a", + "end": 21505, + "tag_type": 2, + "start": 21501 + }, + { + "attributes": {}, + "tag": "li", + "end": 21510, + "tag_type": 2, + "start": 21505 + }, + { + "start": 21510, + "end": 21554 + }, + { + "attributes": {}, + "tag": "li", + "end": 21558, + "tag_type": 1, + "start": 21554 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/253/333/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21639, + "tag_type": 1, + "start": 21558 + }, + { + "start": 21639, + "end": 21649 + }, + { + "attributes": {}, + "tag": "a", + "end": 21653, + "tag_type": 2, + "start": 21649 + }, + { + "attributes": {}, + "tag": "li", + "end": 21658, + "tag_type": 2, + "start": 21653 + }, + { + "start": 21658, + "end": 21702 + }, + { + "attributes": {}, + "tag": "li", + "end": 21706, + "tag_type": 1, + "start": 21702 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21787, + "tag_type": 1, + "start": 21706 + }, + { + "start": 21787, + "end": 21798 + }, + { + "attributes": {}, + "tag": "a", + "end": 21802, + "tag_type": 2, + "start": 21798 + }, + { + "attributes": {}, + "tag": "li", + "end": 21807, + "tag_type": 2, + "start": 21802 + }, + { + "start": 21807, + "end": 21851 + }, + { + "attributes": {}, + "tag": "li", + "end": 21855, + "tag_type": 1, + "start": 21851 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/275/355/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21936, + "tag_type": 1, + "start": 21855 + }, + { + "start": 21936, + "end": 21949 + }, + { + "attributes": {}, + "tag": "a", + "end": 21953, + "tag_type": 2, + "start": 21949 + }, + { + "attributes": {}, + "tag": "li", + "end": 21958, + "tag_type": 2, + "start": 21953 + }, + { + "start": 21958, + "end": 22002 + }, + { + "attributes": {}, + "tag": "li", + "end": 22006, + "tag_type": 1, + "start": 22002 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/316/402/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22087, + "tag_type": 1, + "start": 22006 + }, + { + "start": 22087, + "end": 22094 + }, + { + "attributes": {}, + "tag": "a", + "end": 22098, + "tag_type": 2, + "start": 22094 + }, + { + "attributes": {}, + "tag": "li", + "end": 22103, + "tag_type": 2, + "start": 22098 + }, + { + "start": 22103, + "end": 22147 + }, + { + "attributes": {}, + "tag": "li", + "end": 22151, + "tag_type": 1, + "start": 22147 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22232, + "tag_type": 1, + "start": 22151 + }, + { + "start": 22232, + "end": 22244 + }, + { + "attributes": {}, + "tag": "a", + "end": 22248, + "tag_type": 2, + "start": 22244 + }, + { + "attributes": {}, + "tag": "li", + "end": 22253, + "tag_type": 2, + "start": 22248 + }, + { + "start": 22253, + "end": 22297 + }, + { + "attributes": {}, + "tag": "li", + "end": 22301, + "tag_type": 1, + "start": 22297 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/996/1241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22383, + "tag_type": 1, + "start": 22301 + }, + { + "start": 22383, + "end": 22389 + }, + { + "attributes": {}, + "tag": "a", + "end": 22393, + "tag_type": 2, + "start": 22389 + }, + { + "attributes": {}, + "tag": "li", + "end": 22398, + "tag_type": 2, + "start": 22393 + }, + { + "start": 22398, + "end": 22442 + }, + { + "attributes": {}, + "tag": "li", + "end": 22446, + "tag_type": 1, + "start": 22442 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22527, + "tag_type": 1, + "start": 22446 + }, + { + "start": 22527, + "end": 22537 + }, + { + "attributes": {}, + "tag": "a", + "end": 22541, + "tag_type": 2, + "start": 22537 + }, + { + "attributes": {}, + "tag": "li", + "end": 22546, + "tag_type": 2, + "start": 22541 + }, + { + "start": 22546, + "end": 22590 + }, + { + "attributes": {}, + "tag": "li", + "end": 22594, + "tag_type": 1, + "start": 22590 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/988/1236/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22676, + "tag_type": 1, + "start": 22594 + }, + { + "start": 22676, + "end": 22696 + }, + { + "attributes": {}, + "tag": "a", + "end": 22700, + "tag_type": 2, + "start": 22696 + }, + { + "attributes": {}, + "tag": "li", + "end": 22705, + "tag_type": 2, + "start": 22700 + }, + { + "start": 22705, + "end": 22749 + }, + { + "attributes": {}, + "tag": "ul", + "end": 22754, + "tag_type": 2, + "start": 22749 + }, + { + "start": 22754, + "end": 22782 + }, + { + "attributes": {}, + "tag": "li", + "end": 22787, + "tag_type": 2, + "start": 22782 + }, + { + "start": 22787, + "end": 22799 + }, + { + "attributes": { + "id": "nav_pcsh" + }, + "tag": "li", + "end": 22817, + "tag_type": 1, + "start": 22799 + }, + { + "start": 22817, + "end": 22829 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 22866, + "tag_type": 1, + "start": 22829 + }, + { + "attributes": {}, + "tag": "span", + "end": 22872, + "tag_type": 1, + "start": 22866 + }, + { + "start": 22872, + "end": 22881 + }, + { + "attributes": {}, + "tag": "span", + "end": 22888, + "tag_type": 2, + "start": 22881 + }, + { + "attributes": {}, + "tag": "a", + "end": 22892, + "tag_type": 2, + "start": 22888 + }, + { + "start": 22892, + "end": 22932 + }, + { + "attributes": {}, + "tag": "ul", + "end": 22936, + "tag_type": 1, + "start": 22932 + }, + { + "start": 22936, + "end": 22980 + }, + { + "attributes": {}, + "tag": "li", + "end": 22984, + "tag_type": 1, + "start": 22980 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 23021, + "tag_type": 1, + "start": 22984 + }, + { + "start": 23021, + "end": 23025 + }, + { + "attributes": {}, + "tag": "a", + "end": 23029, + "tag_type": 2, + "start": 23025 + }, + { + "attributes": {}, + "tag": "li", + "end": 23034, + "tag_type": 2, + "start": 23029 + }, + { + "start": 23034, + "end": 23078 + }, + { + "attributes": {}, + "tag": "li", + "end": 23082, + "tag_type": 1, + "start": 23078 + }, + { + "attributes": { + "href": "/PC/PCs/-/653/860/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23146, + "tag_type": 1, + "start": 23082 + }, + { + "start": 23146, + "end": 23155 + }, + { + "attributes": {}, + "tag": "a", + "end": 23159, + "tag_type": 2, + "start": 23155 + }, + { + "attributes": {}, + "tag": "li", + "end": 23164, + "tag_type": 2, + "start": 23159 + }, + { + "start": 23164, + "end": 23208 + }, + { + "attributes": {}, + "tag": "li", + "end": 23212, + "tag_type": 1, + "start": 23208 + }, + { + "attributes": { + "href": "/PC/PCs/-/654/861/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23276, + "tag_type": 1, + "start": 23212 + }, + { + "start": 23276, + "end": 23283 + }, + { + "attributes": {}, + "tag": "a", + "end": 23287, + "tag_type": 2, + "start": 23283 + }, + { + "attributes": {}, + "tag": "li", + "end": 23292, + "tag_type": 2, + "start": 23287 + }, + { + "start": 23292, + "end": 23336 + }, + { + "attributes": {}, + "tag": "li", + "end": 23340, + "tag_type": 1, + "start": 23336 + }, + { + "attributes": { + "href": "/PC/PCs/-/707/915/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23404, + "tag_type": 1, + "start": 23340 + }, + { + "start": 23404, + "end": 23407 + }, + { + "attributes": {}, + "tag": "a", + "end": 23411, + "tag_type": 2, + "start": 23407 + }, + { + "attributes": {}, + "tag": "li", + "end": 23416, + "tag_type": 2, + "start": 23411 + }, + { + "start": 23416, + "end": 23460 + }, + { + "attributes": {}, + "tag": "li", + "end": 23464, + "tag_type": 1, + "start": 23460 + }, + { + "attributes": { + "href": "/PC/PCs/-/684/891/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23528, + "tag_type": 1, + "start": 23464 + }, + { + "start": 23528, + "end": 23536 + }, + { + "attributes": {}, + "tag": "a", + "end": 23540, + "tag_type": 2, + "start": 23536 + }, + { + "attributes": {}, + "tag": "li", + "end": 23545, + "tag_type": 2, + "start": 23540 + }, + { + "start": 23545, + "end": 23589 + }, + { + "attributes": {}, + "tag": "li", + "end": 23593, + "tag_type": 1, + "start": 23589 + }, + { + "attributes": { + "href": "/PC/PCs/-/713/921/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23657, + "tag_type": 1, + "start": 23593 + }, + { + "start": 23657, + "end": 23668 + }, + { + "attributes": {}, + "tag": "a", + "end": 23672, + "tag_type": 2, + "start": 23668 + }, + { + "attributes": {}, + "tag": "li", + "end": 23677, + "tag_type": 2, + "start": 23672 + }, + { + "start": 23677, + "end": 23721 + }, + { + "attributes": {}, + "tag": "li", + "end": 23725, + "tag_type": 1, + "start": 23721 + }, + { + "attributes": { + "href": "/PC/PCs/-/667/874/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23789, + "tag_type": 1, + "start": 23725 + }, + { + "start": 23789, + "end": 23799 + }, + { + "attributes": {}, + "tag": "a", + "end": 23803, + "tag_type": 2, + "start": 23799 + }, + { + "attributes": {}, + "tag": "li", + "end": 23808, + "tag_type": 2, + "start": 23803 + }, + { + "start": 23808, + "end": 23852 + }, + { + "attributes": {}, + "tag": "li", + "end": 23856, + "tag_type": 1, + "start": 23852 + }, + { + "attributes": { + "href": "/PC/PCs/-/2144/1411/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23922, + "tag_type": 1, + "start": 23856 + }, + { + "start": 23922, + "end": 23947 + }, + { + "attributes": {}, + "tag": "a", + "end": 23951, + "tag_type": 2, + "start": 23947 + }, + { + "attributes": {}, + "tag": "li", + "end": 23956, + "tag_type": 2, + "start": 23951 + }, + { + "start": 23956, + "end": 24000 + }, + { + "attributes": {}, + "tag": "li", + "end": 24004, + "tag_type": 1, + "start": 24000 + }, + { + "attributes": { + "href": "/PC/PCs/-/660/867/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24068, + "tag_type": 1, + "start": 24004 + }, + { + "start": 24068, + "end": 24078 + }, + { + "attributes": {}, + "tag": "a", + "end": 24082, + "tag_type": 2, + "start": 24078 + }, + { + "attributes": {}, + "tag": "li", + "end": 24087, + "tag_type": 2, + "start": 24082 + }, + { + "start": 24087, + "end": 24131 + }, + { + "attributes": {}, + "tag": "li", + "end": 24135, + "tag_type": 1, + "start": 24131 + }, + { + "attributes": { + "href": "/PC/PCs/-/2159/1426/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24201, + "tag_type": 1, + "start": 24135 + }, + { + "start": 24201, + "end": 24207 + }, + { + "attributes": {}, + "tag": "a", + "end": 24211, + "tag_type": 2, + "start": 24207 + }, + { + "attributes": {}, + "tag": "li", + "end": 24216, + "tag_type": 2, + "start": 24211 + }, + { + "start": 24216, + "end": 24260 + }, + { + "attributes": {}, + "tag": "li", + "end": 24264, + "tag_type": 1, + "start": 24260 + }, + { + "attributes": { + "href": "/PC/PCs/-/677/884/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24328, + "tag_type": 1, + "start": 24264 + }, + { + "start": 24328, + "end": 24336 + }, + { + "attributes": {}, + "tag": "a", + "end": 24340, + "tag_type": 2, + "start": 24336 + }, + { + "attributes": {}, + "tag": "li", + "end": 24345, + "tag_type": 2, + "start": 24340 + }, + { + "start": 24345, + "end": 24389 + }, + { + "attributes": {}, + "tag": "li", + "end": 24393, + "tag_type": 1, + "start": 24389 + }, + { + "attributes": { + "href": "/PC/PCs/6-/Campaign.html?campaign=4661&cid=4083104" + }, + "tag": "a", + "end": 24458, + "tag_type": 1, + "start": 24393 + }, + { + "start": 24458, + "end": 24476 + }, + { + "attributes": {}, + "tag": "a", + "end": 24480, + "tag_type": 2, + "start": 24476 + }, + { + "attributes": {}, + "tag": "li", + "end": 24485, + "tag_type": 2, + "start": 24480 + }, + { + "start": 24485, + "end": 24529 + }, + { + "attributes": {}, + "tag": "li", + "end": 24533, + "tag_type": 1, + "start": 24529 + }, + { + "attributes": { + "href": "/PC/PCs/-/989/1237/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24598, + "tag_type": 1, + "start": 24533 + }, + { + "start": 24598, + "end": 24609 + }, + { + "attributes": {}, + "tag": "a", + "end": 24613, + "tag_type": 2, + "start": 24609 + }, + { + "attributes": {}, + "tag": "li", + "end": 24618, + "tag_type": 2, + "start": 24613 + }, + { + "start": 24618, + "end": 24662 + }, + { + "attributes": {}, + "tag": "li", + "end": 24666, + "tag_type": 1, + "start": 24662 + }, + { + "attributes": { + "href": "/PC/PCs/-/694/901/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24730, + "tag_type": 1, + "start": 24666 + }, + { + "start": 24730, + "end": 24741 + }, + { + "attributes": {}, + "tag": "a", + "end": 24745, + "tag_type": 2, + "start": 24741 + }, + { + "attributes": {}, + "tag": "li", + "end": 24750, + "tag_type": 2, + "start": 24745 + }, + { + "start": 24750, + "end": 24794 + }, + { + "attributes": {}, + "tag": "ul", + "end": 24799, + "tag_type": 2, + "start": 24794 + }, + { + "start": 24799, + "end": 24827 + }, + { + "attributes": {}, + "tag": "li", + "end": 24832, + "tag_type": 2, + "start": 24827 + }, + { + "start": 24832, + "end": 24844 + }, + { + "attributes": { + "id": "nav_gadg" + }, + "tag": "li", + "end": 24862, + "tag_type": 1, + "start": 24844 + }, + { + "start": 24862, + "end": 24874 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 24920, + "tag_type": 1, + "start": 24874 + }, + { + "attributes": {}, + "tag": "span", + "end": 24926, + "tag_type": 1, + "start": 24920 + }, + { + "start": 24926, + "end": 24933 + }, + { + "attributes": {}, + "tag": "span", + "end": 24940, + "tag_type": 2, + "start": 24933 + }, + { + "attributes": {}, + "tag": "a", + "end": 24944, + "tag_type": 2, + "start": 24940 + }, + { + "start": 24944, + "end": 24984 + }, + { + "attributes": {}, + "tag": "ul", + "end": 24988, + "tag_type": 1, + "start": 24984 + }, + { + "start": 24988, + "end": 25032 + }, + { + "attributes": {}, + "tag": "li", + "end": 25036, + "tag_type": 1, + "start": 25032 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 25082, + "tag_type": 1, + "start": 25036 + }, + { + "start": 25082, + "end": 25086 + }, + { + "attributes": {}, + "tag": "a", + "end": 25090, + "tag_type": 2, + "start": 25086 + }, + { + "attributes": {}, + "tag": "li", + "end": 25095, + "tag_type": 2, + "start": 25090 + }, + { + "start": 25095, + "end": 25139 + }, + { + "attributes": {}, + "tag": "li", + "end": 25143, + "tag_type": 1, + "start": 25139 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/392/492/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25216, + "tag_type": 1, + "start": 25143 + }, + { + "start": 25216, + "end": 25232 + }, + { + "attributes": {}, + "tag": "a", + "end": 25236, + "tag_type": 2, + "start": 25232 + }, + { + "attributes": {}, + "tag": "li", + "end": 25241, + "tag_type": 2, + "start": 25236 + }, + { + "start": 25241, + "end": 25285 + }, + { + "attributes": {}, + "tag": "li", + "end": 25289, + "tag_type": 1, + "start": 25285 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/558/743/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25362, + "tag_type": 1, + "start": 25289 + }, + { + "start": 25362, + "end": 25369 + }, + { + "attributes": {}, + "tag": "a", + "end": 25373, + "tag_type": 2, + "start": 25369 + }, + { + "attributes": {}, + "tag": "li", + "end": 25378, + "tag_type": 2, + "start": 25373 + }, + { + "start": 25378, + "end": 25422 + }, + { + "attributes": {}, + "tag": "li", + "end": 25426, + "tag_type": 1, + "start": 25422 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/434/534/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25499, + "tag_type": 1, + "start": 25426 + }, + { + "start": 25499, + "end": 25520 + }, + { + "attributes": {}, + "tag": "a", + "end": 25524, + "tag_type": 2, + "start": 25520 + }, + { + "attributes": {}, + "tag": "li", + "end": 25529, + "tag_type": 2, + "start": 25524 + }, + { + "start": 25529, + "end": 25573 + }, + { + "attributes": {}, + "tag": "li", + "end": 25577, + "tag_type": 1, + "start": 25573 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/382/482/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25650, + "tag_type": 1, + "start": 25577 + }, + { + "start": 25650, + "end": 25660 + }, + { + "attributes": {}, + "tag": "a", + "end": 25664, + "tag_type": 2, + "start": 25660 + }, + { + "attributes": {}, + "tag": "li", + "end": 25669, + "tag_type": 2, + "start": 25664 + }, + { + "start": 25669, + "end": 25713 + }, + { + "attributes": {}, + "tag": "li", + "end": 25717, + "tag_type": 1, + "start": 25713 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/372/472/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25790, + "tag_type": 1, + "start": 25717 + }, + { + "start": 25790, + "end": 25803 + }, + { + "attributes": {}, + "tag": "a", + "end": 25807, + "tag_type": 2, + "start": 25803 + }, + { + "attributes": {}, + "tag": "li", + "end": 25812, + "tag_type": 2, + "start": 25807 + }, + { + "start": 25812, + "end": 25856 + }, + { + "attributes": {}, + "tag": "li", + "end": 25860, + "tag_type": 1, + "start": 25856 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/440/540/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25933, + "tag_type": 1, + "start": 25860 + }, + { + "start": 25933, + "end": 25944 + }, + { + "attributes": {}, + "tag": "a", + "end": 25948, + "tag_type": 2, + "start": 25944 + }, + { + "attributes": {}, + "tag": "li", + "end": 25953, + "tag_type": 2, + "start": 25948 + }, + { + "start": 25953, + "end": 25997 + }, + { + "attributes": {}, + "tag": "li", + "end": 26001, + "tag_type": 1, + "start": 25997 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/415/515/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26074, + "tag_type": 1, + "start": 26001 + }, + { + "start": 26074, + "end": 26091 + }, + { + "attributes": {}, + "tag": "a", + "end": 26095, + "tag_type": 2, + "start": 26091 + }, + { + "attributes": {}, + "tag": "li", + "end": 26100, + "tag_type": 2, + "start": 26095 + }, + { + "start": 26100, + "end": 26144 + }, + { + "attributes": {}, + "tag": "li", + "end": 26148, + "tag_type": 1, + "start": 26144 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/411/511/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26221, + "tag_type": 1, + "start": 26148 + }, + { + "start": 26221, + "end": 26241 + }, + { + "attributes": {}, + "tag": "a", + "end": 26245, + "tag_type": 2, + "start": 26241 + }, + { + "attributes": {}, + "tag": "li", + "end": 26250, + "tag_type": 2, + "start": 26245 + }, + { + "start": 26250, + "end": 26294 + }, + { + "attributes": {}, + "tag": "li", + "end": 26298, + "tag_type": 1, + "start": 26294 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/401/501/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26371, + "tag_type": 1, + "start": 26298 + }, + { + "start": 26371, + "end": 26376 + }, + { + "attributes": {}, + "tag": "a", + "end": 26380, + "tag_type": 2, + "start": 26376 + }, + { + "attributes": {}, + "tag": "li", + "end": 26385, + "tag_type": 2, + "start": 26380 + }, + { + "start": 26385, + "end": 26429 + }, + { + "attributes": {}, + "tag": "li", + "end": 26433, + "tag_type": 1, + "start": 26429 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/426/526/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26506, + "tag_type": 1, + "start": 26433 + }, + { + "start": 26506, + "end": 26510 + }, + { + "attributes": {}, + "tag": "a", + "end": 26514, + "tag_type": 2, + "start": 26510 + }, + { + "attributes": {}, + "tag": "li", + "end": 26519, + "tag_type": 2, + "start": 26514 + }, + { + "start": 26519, + "end": 26563 + }, + { + "attributes": {}, + "tag": "ul", + "end": 26568, + "tag_type": 2, + "start": 26563 + }, + { + "start": 26568, + "end": 26596 + }, + { + "attributes": {}, + "tag": "li", + "end": 26601, + "tag_type": 2, + "start": 26596 + }, + { + "start": 26601, + "end": 26613 + }, + { + "attributes": { + "id": "nav_mbls" + }, + "tag": "li", + "end": 26631, + "tag_type": 1, + "start": 26613 + }, + { + "start": 26631, + "end": 26643 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 26688, + "tag_type": 1, + "start": 26643 + }, + { + "attributes": {}, + "tag": "span", + "end": 26694, + "tag_type": 1, + "start": 26688 + }, + { + "start": 26694, + "end": 26700 + }, + { + "attributes": {}, + "tag": "span", + "end": 26707, + "tag_type": 2, + "start": 26700 + }, + { + "attributes": {}, + "tag": "a", + "end": 26711, + "tag_type": 2, + "start": 26707 + }, + { + "start": 26711, + "end": 26751 + }, + { + "attributes": {}, + "tag": "ul", + "end": 26755, + "tag_type": 1, + "start": 26751 + }, + { + "start": 26755, + "end": 26799 + }, + { + "attributes": {}, + "tag": "li", + "end": 26803, + "tag_type": 1, + "start": 26799 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 26848, + "tag_type": 1, + "start": 26803 + }, + { + "start": 26848, + "end": 26852 + }, + { + "attributes": {}, + "tag": "a", + "end": 26856, + "tag_type": 2, + "start": 26852 + }, + { + "attributes": {}, + "tag": "li", + "end": 26861, + "tag_type": 2, + "start": 26856 + }, + { + "start": 26861, + "end": 26905 + }, + { + "attributes": {}, + "tag": "li", + "end": 26909, + "tag_type": 1, + "start": 26905 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/529/686/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26983, + "tag_type": 1, + "start": 26909 + }, + { + "start": 26983, + "end": 26997 + }, + { + "attributes": {}, + "tag": "a", + "end": 27001, + "tag_type": 2, + "start": 26997 + }, + { + "attributes": {}, + "tag": "li", + "end": 27006, + "tag_type": 2, + "start": 27001 + }, + { + "start": 27006, + "end": 27050 + }, + { + "attributes": {}, + "tag": "li", + "end": 27054, + "tag_type": 1, + "start": 27050 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/530/687/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 27128, + "tag_type": 1, + "start": 27054 + }, + { + "start": 27128, + "end": 27143 + }, + { + "attributes": {}, + "tag": "a", + "end": 27147, + "tag_type": 2, + "start": 27143 + }, + { + "attributes": {}, + "tag": "li", + "end": 27152, + "tag_type": 2, + "start": 27147 + }, + { + "start": 27152, + "end": 27196 + }, + { + "attributes": {}, + "tag": "li", + "end": 27200, + "tag_type": 1, + "start": 27196 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/1020/1265/3-/HardwareBrowse.html?searchtype=genre" + }, + "tag": "a", + "end": 27278, + "tag_type": 1, + "start": 27200 + }, + { + "start": 27278, + "end": 27288 + }, + { + "attributes": {}, + "tag": "a", + "end": 27292, + "tag_type": 2, + "start": 27288 + }, + { + "attributes": {}, + "tag": "li", + "end": 27297, + "tag_type": 2, + "start": 27292 + }, + { + "start": 27297, + "end": 27341 + }, + { + "attributes": {}, + "tag": "li", + "end": 27345, + "tag_type": 1, + "start": 27341 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/531/688/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 27419, + "tag_type": 1, + "start": 27345 + }, + { + "start": 27419, + "end": 27430 + }, + { + "attributes": {}, + "tag": "a", + "end": 27434, + "tag_type": 2, + "start": 27430 + }, + { + "attributes": {}, + "tag": "li", + "end": 27439, + "tag_type": 2, + "start": 27434 + }, + { + "start": 27439, + "end": 27483 + }, + { + "attributes": {}, + "tag": "li", + "end": 27487, + "tag_type": 1, + "start": 27483 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/526/683/3-/MobileContent.html?searchtype=genre" + }, + "tag": "a", + "end": 27562, + "tag_type": 1, + "start": 27487 + }, + { + "start": 27562, + "end": 27576 + }, + { + "attributes": {}, + "tag": "a", + "end": 27580, + "tag_type": 2, + "start": 27576 + }, + { + "attributes": {}, + "tag": "li", + "end": 27585, + "tag_type": 2, + "start": 27580 + }, + { + "start": 27585, + "end": 27629 + }, + { + "attributes": {}, + "tag": "ul", + "end": 27634, + "tag_type": 2, + "start": 27629 + }, + { + "start": 27634, + "end": 27662 + }, + { + "attributes": {}, + "tag": "li", + "end": 27667, + "tag_type": 2, + "start": 27662 + }, + { + "start": 27667, + "end": 27679 + }, + { + "attributes": { + "id": "Li2" + }, + "tag": "li", + "end": 27692, + "tag_type": 1, + "start": 27679 + }, + { + "start": 27692, + "end": 27704 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/LandingPage.html?page=playtrade" + }, + "tag": "a", + "end": 27760, + "tag_type": 1, + "start": 27704 + }, + { + "attributes": {}, + "tag": "span", + "end": 27766, + "tag_type": 1, + "start": 27760 + }, + { + "start": 27766, + "end": 27781 + }, + { + "attributes": {}, + "tag": "span", + "end": 27788, + "tag_type": 2, + "start": 27781 + }, + { + "attributes": {}, + "tag": "a", + "end": 27792, + "tag_type": 2, + "start": 27788 + }, + { + "start": 27792, + "end": 27832 + }, + { + "attributes": {}, + "tag": "ul", + "end": 27836, + "tag_type": 1, + "start": 27832 + }, + { + "start": 27836, + "end": 27880 + }, + { + "attributes": {}, + "tag": "li", + "end": 27884, + "tag_type": 1, + "start": 27880 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=dvd" + }, + "tag": "a", + "end": 27973, + "tag_type": 1, + "start": 27884 + }, + { + "start": 27973, + "end": 27987 + }, + { + "attributes": {}, + "tag": "a", + "end": 27991, + "tag_type": 2, + "start": 27987 + }, + { + "attributes": {}, + "tag": "li", + "end": 27996, + "tag_type": 2, + "start": 27991 + }, + { + "start": 27996, + "end": 28040 + }, + { + "attributes": {}, + "tag": "li", + "end": 28044, + "tag_type": 1, + "start": 28040 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=cd" + }, + "tag": "a", + "end": 28132, + "tag_type": 1, + "start": 28044 + }, + { + "start": 28132, + "end": 28145 + }, + { + "attributes": {}, + "tag": "a", + "end": 28149, + "tag_type": 2, + "start": 28145 + }, + { + "attributes": {}, + "tag": "li", + "end": 28154, + "tag_type": 2, + "start": 28149 + }, + { + "start": 28154, + "end": 28198 + }, + { + "attributes": {}, + "tag": "li", + "end": 28202, + "tag_type": 1, + "start": 28198 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=game" + }, + "tag": "a", + "end": 28292, + "tag_type": 1, + "start": 28202 + }, + { + "start": 28292, + "end": 28307 + }, + { + "attributes": {}, + "tag": "a", + "end": 28311, + "tag_type": 2, + "start": 28307 + }, + { + "attributes": {}, + "tag": "li", + "end": 28316, + "tag_type": 2, + "start": 28311 + }, + { + "start": 28316, + "end": 28360 + }, + { + "attributes": {}, + "tag": "li", + "end": 28364, + "tag_type": 1, + "start": 28360 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=book" + }, + "tag": "a", + "end": 28454, + "tag_type": 1, + "start": 28364 + }, + { + "start": 28454, + "end": 28469 + }, + { + "attributes": {}, + "tag": "a", + "end": 28473, + "tag_type": 2, + "start": 28469 + }, + { + "attributes": {}, + "tag": "li", + "end": 28478, + "tag_type": 2, + "start": 28473 + }, + { + "start": 28478, + "end": 28522 + }, + { + "attributes": {}, + "tag": "li", + "end": 28526, + "tag_type": 1, + "start": 28522 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=ticket" + }, + "tag": "a", + "end": 28618, + "tag_type": 1, + "start": 28526 + }, + { + "start": 28618, + "end": 28635 + }, + { + "attributes": {}, + "tag": "a", + "end": 28639, + "tag_type": 2, + "start": 28635 + }, + { + "attributes": {}, + "tag": "li", + "end": 28644, + "tag_type": 2, + "start": 28639 + }, + { + "start": 28644, + "end": 28688 + }, + { + "attributes": {}, + "tag": "li", + "end": 28692, + "tag_type": 1, + "start": 28688 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=console" + }, + "tag": "a", + "end": 28785, + "tag_type": 1, + "start": 28692 + }, + { + "start": 28785, + "end": 28803 + }, + { + "attributes": {}, + "tag": "a", + "end": 28807, + "tag_type": 2, + "start": 28803 + }, + { + "attributes": {}, + "tag": "li", + "end": 28812, + "tag_type": 2, + "start": 28807 + }, + { + "start": 28812, + "end": 28856 + }, + { + "attributes": {}, + "tag": "ul", + "end": 28861, + "tag_type": 2, + "start": 28856 + }, + { + "start": 28861, + "end": 28889 + }, + { + "attributes": {}, + "tag": "li", + "end": 28894, + "tag_type": 2, + "start": 28889 + }, + { + "start": 28894, + "end": 28910 + }, + { + "attributes": {}, + "tag": "ul", + "end": 28915, + "tag_type": 2, + "start": 28910 + }, + { + "start": 28915, + "end": 28924 + }, + { + "attributes": {}, + "tag": "div", + "end": 28930, + "tag_type": 2, + "start": 28924 + }, + { + "start": 28930, + "end": 28934 + }, + { + "attributes": { + "id": "nav_submenu_contain" + }, + "tag": "div", + "end": 28964, + "tag_type": 1, + "start": 28934 + }, + { + "start": 28964, + "end": 28980 + }, + { + "attributes": { + "id": "nav_submenu" + }, + "tag": "ul", + "end": 29001, + "tag_type": 1, + "start": 28980 + }, + { + "start": 29001, + "end": 29021 + }, + { + "attributes": {}, + "tag": "li", + "end": 29025, + "tag_type": 1, + "start": 29021 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html" + }, + "tag": "a", + "end": 29079, + "tag_type": 1, + "start": 29025 + }, + { + "attributes": {}, + "tag": "span", + "end": 29085, + "tag_type": 1, + "start": 29079 + }, + { + "start": 29085, + "end": 29089 + }, + { + "attributes": {}, + "tag": "span", + "end": 29096, + "tag_type": 2, + "start": 29089 + }, + { + "attributes": {}, + "tag": "a", + "end": 29100, + "tag_type": 2, + "start": 29096 + }, + { + "attributes": {}, + "tag": "li", + "end": 29105, + "tag_type": 2, + "start": 29100 + }, + { + "start": 29105, + "end": 29125 + }, + { + "attributes": {}, + "tag": "li", + "end": 29129, + "tag_type": 1, + "start": 29125 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre", + "class": "this" + }, + "tag": "a", + "end": 29223, + "tag_type": 1, + "start": 29129 + }, + { + "attributes": {}, + "tag": "span", + "end": 29229, + "tag_type": 1, + "start": 29223 + }, + { + "start": 29229, + "end": 29240 + }, + { + "attributes": {}, + "tag": "span", + "end": 29247, + "tag_type": 2, + "start": 29240 + }, + { + "attributes": {}, + "tag": "a", + "end": 29251, + "tag_type": 2, + "start": 29247 + }, + { + "attributes": {}, + "tag": "li", + "end": 29256, + "tag_type": 2, + "start": 29251 + }, + { + "start": 29256, + "end": 29276 + }, + { + "attributes": {}, + "tag": "li", + "end": 29280, + "tag_type": 1, + "start": 29276 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29361, + "tag_type": 1, + "start": 29280 + }, + { + "attributes": {}, + "tag": "span", + "end": 29367, + "tag_type": 1, + "start": 29361 + }, + { + "start": 29367, + "end": 29390 + }, + { + "attributes": {}, + "tag": "span", + "end": 29397, + "tag_type": 2, + "start": 29390 + }, + { + "attributes": {}, + "tag": "a", + "end": 29401, + "tag_type": 2, + "start": 29397 + }, + { + "attributes": {}, + "tag": "li", + "end": 29406, + "tag_type": 2, + "start": 29401 + }, + { + "start": 29406, + "end": 29426 + }, + { + "attributes": {}, + "tag": "li", + "end": 29430, + "tag_type": 1, + "start": 29426 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29513, + "tag_type": 1, + "start": 29430 + }, + { + "attributes": {}, + "tag": "span", + "end": 29519, + "tag_type": 1, + "start": 29513 + }, + { + "start": 29519, + "end": 29527 + }, + { + "attributes": {}, + "tag": "span", + "end": 29534, + "tag_type": 2, + "start": 29527 + }, + { + "attributes": {}, + "tag": "a", + "end": 29538, + "tag_type": 2, + "start": 29534 + }, + { + "attributes": {}, + "tag": "li", + "end": 29543, + "tag_type": 2, + "start": 29538 + }, + { + "start": 29543, + "end": 29563 + }, + { + "attributes": {}, + "tag": "li", + "end": 29567, + "tag_type": 1, + "start": 29563 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29648, + "tag_type": 1, + "start": 29567 + }, + { + "attributes": {}, + "tag": "span", + "end": 29654, + "tag_type": 1, + "start": 29648 + }, + { + "start": 29654, + "end": 29679 + }, + { + "attributes": {}, + "tag": "span", + "end": 29686, + "tag_type": 2, + "start": 29679 + }, + { + "attributes": {}, + "tag": "a", + "end": 29690, + "tag_type": 2, + "start": 29686 + }, + { + "attributes": {}, + "tag": "li", + "end": 29695, + "tag_type": 2, + "start": 29690 + }, + { + "start": 29695, + "end": 29715 + }, + { + "attributes": {}, + "tag": "li", + "end": 29719, + "tag_type": 1, + "start": 29715 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29800, + "tag_type": 1, + "start": 29719 + }, + { + "attributes": {}, + "tag": "span", + "end": 29806, + "tag_type": 1, + "start": 29800 + }, + { + "start": 29806, + "end": 29821 + }, + { + "attributes": {}, + "tag": "span", + "end": 29828, + "tag_type": 2, + "start": 29821 + }, + { + "attributes": {}, + "tag": "a", + "end": 29832, + "tag_type": 2, + "start": 29828 + }, + { + "attributes": {}, + "tag": "li", + "end": 29837, + "tag_type": 2, + "start": 29832 + }, + { + "start": 29837, + "end": 29857 + }, + { + "attributes": {}, + "tag": "li", + "end": 29861, + "tag_type": 1, + "start": 29857 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29942, + "tag_type": 1, + "start": 29861 + }, + { + "attributes": {}, + "tag": "span", + "end": 29948, + "tag_type": 1, + "start": 29942 + }, + { + "start": 29948, + "end": 29959 + }, + { + "attributes": {}, + "tag": "span", + "end": 29966, + "tag_type": 2, + "start": 29959 + }, + { + "attributes": {}, + "tag": "a", + "end": 29970, + "tag_type": 2, + "start": 29966 + }, + { + "attributes": {}, + "tag": "li", + "end": 29975, + "tag_type": 2, + "start": 29970 + }, + { + "start": 29975, + "end": 29995 + }, + { + "attributes": {}, + "tag": "li", + "end": 29999, + "tag_type": 1, + "start": 29995 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 30080, + "tag_type": 1, + "start": 29999 + }, + { + "attributes": {}, + "tag": "span", + "end": 30086, + "tag_type": 1, + "start": 30080 + }, + { + "start": 30086, + "end": 30098 + }, + { + "attributes": {}, + "tag": "span", + "end": 30105, + "tag_type": 2, + "start": 30098 + }, + { + "attributes": {}, + "tag": "a", + "end": 30109, + "tag_type": 2, + "start": 30105 + }, + { + "attributes": {}, + "tag": "li", + "end": 30114, + "tag_type": 2, + "start": 30109 + }, + { + "start": 30114, + "end": 30134 + }, + { + "attributes": { + "class": "endlink" + }, + "tag": "li", + "end": 30154, + "tag_type": 1, + "start": 30134 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 30235, + "tag_type": 1, + "start": 30154 + }, + { + "attributes": { + "class": "mydeco-selected" + }, + "tag": "span", + "end": 30265, + "tag_type": 1, + "start": 30235 + }, + { + "start": 30265, + "end": 30275 + }, + { + "attributes": {}, + "tag": "span", + "end": 30282, + "tag_type": 2, + "start": 30275 + }, + { + "attributes": {}, + "tag": "a", + "end": 30286, + "tag_type": 2, + "start": 30282 + }, + { + "attributes": {}, + "tag": "li", + "end": 30291, + "tag_type": 2, + "start": 30286 + }, + { + "start": 30291, + "end": 30311 + }, + { + "attributes": {}, + "tag": "ul", + "end": 30316, + "tag_type": 2, + "start": 30311 + }, + { + "start": 30316, + "end": 30324 + }, + { + "attributes": {}, + "tag": "div", + "end": 30330, + "tag_type": 2, + "start": 30324 + }, + { + "attributes": {}, + "tag": "cite", + "end": 30336, + "tag_type": 1, + "start": 30330 + }, + { + "attributes": {}, + "tag": "cite", + "end": 30343, + "tag_type": 2, + "start": 30336 + }, + { + "start": 30343, + "end": 30347 + }, + { + "attributes": {}, + "tag": "div", + "end": 30353, + "tag_type": 2, + "start": 30347 + }, + { + "start": 30353, + "end": 30357 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 30410, + "tag_type": 1, + "start": 30357 + }, + { + "start": 30410, + "end": 30920 + }, + { + "attributes": {}, + "tag": "script", + "end": 30929, + "tag_type": 2, + "start": 30920 + }, + { + "start": 30929, + "end": 30933 + }, + { + "attributes": { + "id": "contentContainer" + }, + "tag": "div", + "end": 30960, + "tag_type": 1, + "start": 30933 + }, + { + "start": 30960, + "end": 30968 + }, + { + "attributes": { + "class": "outer" + }, + "tag": "div", + "end": 30987, + "tag_type": 1, + "start": 30968 + }, + { + "start": 30987, + "end": 30999 + }, + { + "attributes": { + "class": "inner" + }, + "tag": "div", + "end": 31018, + "tag_type": 1, + "start": 30999 + }, + { + "start": 31018, + "end": 31034 + }, + { + "attributes": { + "class": "floatWrap" + }, + "tag": "div", + "end": 31057, + "tag_type": 1, + "start": 31034 + }, + { + "start": 31057, + "end": 31077 + }, + { + "attributes": { + "id": "middleCol" + }, + "tag": "div", + "end": 31097, + "tag_type": 1, + "start": 31077 + }, + { + "start": 31097, + "end": 31145 + }, + { + "attributes": { + "class": "content" + }, + "tag": "div", + "end": 31166, + "tag_type": 1, + "start": 31145 + }, + { + "start": 31166, + "end": 31198 + }, + { + "attributes": { + "class": "electronics wrap" + }, + "tag": "div", + "end": 31228, + "tag_type": 1, + "start": 31198 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 31249, + "tag_type": 1, + "start": 31228 + }, + { + "attributes": {}, + "tag": "div", + "end": 31254, + "tag_type": 1, + "start": 31249 + }, + { + "attributes": {}, + "tag": "div", + "end": 31259, + "tag_type": 1, + "start": 31254 + }, + { + "attributes": { + "class": "pagehead" + }, + "tag": "h2", + "end": 31280, + "tag_type": 1, + "start": 31259 + }, + { + "start": 31280, + "end": 31291 + }, + { + "attributes": {}, + "tag": "h2", + "end": 31296, + "tag_type": 2, + "start": 31291 + }, + { + "attributes": {}, + "tag": "div", + "end": 31302, + "tag_type": 2, + "start": 31296 + }, + { + "attributes": {}, + "tag": "div", + "end": 31308, + "tag_type": 2, + "start": 31302 + }, + { + "attributes": {}, + "tag": "div", + "end": 31314, + "tag_type": 2, + "start": 31308 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 31331, + "tag_type": 1, + "start": 31314 + }, + { + "attributes": { + "class": "product-2 slice top" + }, + "tag": "div", + "end": 31364, + "tag_type": 1, + "start": 31331 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 31387, + "tag_type": 1, + "start": 31364 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 31394, + "tag_type": 1, + "start": 31387 + }, + { + "attributes": {}, + "tag": "tr", + "end": 31398, + "tag_type": 1, + "start": 31394 + }, + { + "attributes": {}, + "tag": "td", + "end": 31402, + "tag_type": 1, + "start": 31398 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 31421, + "tag_type": 1, + "start": 31402 + }, + { + "attributes": {}, + "tag": "a", + "end": 31424, + "tag_type": 1, + "start": 31421 + }, + { + "attributes": { + "src": "http://images.play.com/covers/8986420m.jpg", + "style": "border-width: 0px; height: 170px; width: 170px;", + "onerror": null, + "data-scrapy-annotate": "{"variant": 0, "annotations": {"src": "image_urls"}}", + "alt": "Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)", + "id": "anonymous_element_1" + }, + "tag": "img", + "end": 31770, + "tag_type": 1, + "start": 31424 + }, + { + "attributes": {}, + "tag": "a", + "end": 31774, + "tag_type": 2, + "start": 31770 + }, + { + "attributes": {}, + "tag": "div", + "end": 31780, + "tag_type": 2, + "start": 31774 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 31800, + "tag_type": 1, + "start": 31780 + }, + { + "attributes": {}, + "tag": "div", + "end": 31806, + "tag_type": 2, + "start": 31800 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 31826, + "tag_type": 1, + "start": 31806 + }, + { + "start": 31826, + "end": 31830 + }, + { + "attributes": { + "href": "#", + "onclick": null + }, + "tag": "a", + "end": 31853, + "tag_type": 1, + "start": 31830 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/button/enlargeimage.gif", + "alt": "Enlarge Image", + "style": "border-width: 0px; height: 17px; width: 99px;" + }, + "tag": "img", + "end": 32008, + "tag_type": 1, + "start": 31853 + }, + { + "attributes": {}, + "tag": "a", + "end": 32012, + "tag_type": 2, + "start": 32008 + }, + { + "attributes": {}, + "tag": "div", + "end": 32018, + "tag_type": 2, + "start": 32012 + }, + { + "attributes": {}, + "tag": "td", + "end": 32023, + "tag_type": 2, + "start": 32018 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 32040, + "tag_type": 1, + "start": 32023 + }, + { + "attributes": { + "class": "info" + }, + "tag": "div", + "end": 32058, + "tag_type": 1, + "start": 32040 + }, + { + "attributes": {}, + "tag": "div", + "end": 32063, + "tag_type": 1, + "start": 32058 + }, + { + "attributes": { + "data-scrapy-annotate": "{"variant": 0, "annotations": {"content": "name"}}", + "id": "anonymous_element_2" + }, + "tag": "h1", + "end": 32206, + "tag_type": 1, + "start": 32063 + }, + { + "start": 32206, + "end": 32278 + }, + { + "attributes": {}, + "tag": "h1", + "end": 32283, + "tag_type": 2, + "start": 32278 + }, + { + "attributes": { + "class": "artist" + }, + "tag": "p", + "end": 32301, + "tag_type": 1, + "start": 32283 + }, + { + "attributes": {}, + "tag": "p", + "end": 32305, + "tag_type": 2, + "start": 32301 + }, + { + "attributes": { + "alt": "Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars", + "class": "rating" + }, + "tag": "p", + "end": 32444, + "tag_type": 1, + "start": 32305 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50.gif", + "style": "border-width: 0px; height: 14px; width: 71px;", + "class": null + }, + "tag": "img", + "end": 32583, + "tag_type": 1, + "start": 32444 + }, + { + "start": 32583, + "end": 32586 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 32812, + "tag_type": 1, + "start": 32586 + }, + { + "attributes": { + "class": null + }, + "tag": "strong", + "end": 32829, + "tag_type": 1, + "start": 32812 + }, + { + "start": 32829, + "end": 32830 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32839, + "tag_type": 2, + "start": 32830 + }, + { + "start": 32839, + "end": 32855 + }, + { + "attributes": {}, + "tag": "a", + "end": 32859, + "tag_type": 2, + "start": 32855 + }, + { + "start": 32859, + "end": 32862 + }, + { + "attributes": {}, + "tag": "p", + "end": 32866, + "tag_type": 2, + "start": 32862 + }, + { + "attributes": {}, + "tag": "div", + "end": 32872, + "tag_type": 2, + "start": 32866 + }, + { + "attributes": { + "class": null + }, + "tag": "div", + "end": 32886, + "tag_type": 1, + "start": 32872 + }, + { + "attributes": { + "id": "_pageTemplate__product_ctl00__overview_ctl00__dataControl__price__headerSix" + }, + "tag": "h6", + "end": 32971, + "tag_type": 1, + "start": 32886 + }, + { + "attributes": { + "data-scrapy-annotate": "{"variant": 0, "annotations": {"content": "price"}}", + "id": "anonymous_element_3", + "class": null + }, + "tag": "span", + "end": 33126, + "tag_type": 1, + "start": 32971 + }, + { + "start": 33126, + "end": 33133 + }, + { + "attributes": {}, + "tag": "span", + "end": 33140, + "tag_type": 2, + "start": 33133 + }, + { + "start": 33140, + "end": 33154 + }, + { + "attributes": {}, + "tag": "h6", + "end": 33159, + "tag_type": 2, + "start": 33154 + }, + { + "attributes": { + "class": "saving" + }, + "tag": "p", + "end": 33177, + "tag_type": 1, + "start": 33159 + }, + { + "attributes": { + "class": null + }, + "tag": "span", + "end": 33192, + "tag_type": 1, + "start": 33177 + }, + { + "start": 33192, + "end": 33197 + }, + { + "attributes": { + "class": null + }, + "tag": "strong", + "end": 33214, + "tag_type": 1, + "start": 33197 + }, + { + "start": 33214, + "end": 33221 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33230, + "tag_type": 2, + "start": 33221 + }, + { + "attributes": {}, + "tag": "span", + "end": 33237, + "tag_type": 2, + "start": 33230 + }, + { + "start": 33237, + "end": 33240 + }, + { + "attributes": {}, + "tag": "span", + "end": 33246, + "tag_type": 1, + "start": 33240 + }, + { + "start": 33246, + "end": 33256 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33264, + "tag_type": 1, + "start": 33256 + }, + { + "start": 33264, + "end": 33277 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33286, + "tag_type": 2, + "start": 33277 + }, + { + "attributes": {}, + "tag": "span", + "end": 33293, + "tag_type": 2, + "start": 33286 + }, + { + "attributes": {}, + "tag": "p", + "end": 33297, + "tag_type": 2, + "start": 33293 + }, + { + "attributes": { + "class": "stock" + }, + "tag": "p", + "end": 33314, + "tag_type": 1, + "start": 33297 + }, + { + "start": 33314, + "end": 33318 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33326, + "tag_type": 1, + "start": 33318 + }, + { + "start": 33326, + "end": 33334 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33343, + "tag_type": 2, + "start": 33334 + }, + { + "start": 33343, + "end": 33347 + }, + { + "attributes": { + "class": null + }, + "tag": "span", + "end": 33362, + "tag_type": 1, + "start": 33347 + }, + { + "start": 33362, + "end": 33399 + }, + { + "attributes": {}, + "tag": "span", + "end": 33406, + "tag_type": 2, + "start": 33399 + }, + { + "attributes": {}, + "tag": "p", + "end": 33410, + "tag_type": 2, + "start": 33406 + }, + { + "attributes": {}, + "tag": "div", + "end": 33416, + "tag_type": 2, + "start": 33410 + }, + { + "attributes": { + "class": "buy" + }, + "tag": "div", + "end": 33433, + "tag_type": 1, + "start": 33416 + }, + { + "start": 33433, + "end": 33454 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&add=8986420&pid=275282&dpr=275282", + "class": "buy_button" + }, + "tag": "a", + "end": 33662, + "tag_type": 1, + "start": 33454 + }, + { + "start": 33662, + "end": 33665 + }, + { + "attributes": {}, + "tag": "a", + "end": 33669, + "tag_type": 2, + "start": 33665 + }, + { + "start": 33669, + "end": 33689 + }, + { + "attributes": {}, + "tag": "div", + "end": 33695, + "tag_type": 2, + "start": 33689 + }, + { + "attributes": { + "class": "badges" + }, + "tag": "div", + "end": 33715, + "tag_type": 1, + "start": 33695 + }, + { + "attributes": { + "class": null + }, + "tag": "div", + "end": 33729, + "tag_type": 1, + "start": 33715 + }, + { + "attributes": {}, + "tag": "div", + "end": 33735, + "tag_type": 2, + "start": 33729 + }, + { + "attributes": {}, + "tag": "div", + "end": 33741, + "tag_type": 2, + "start": 33735 + }, + { + "attributes": { + "class": "note-alt" + }, + "tag": "p", + "end": 33761, + "tag_type": 1, + "start": 33741 + }, + { + "attributes": {}, + "tag": "p", + "end": 33765, + "tag_type": 2, + "start": 33761 + }, + { + "attributes": { + "class": "bogof" + }, + "tag": "div", + "end": 33784, + "tag_type": 1, + "start": 33765 + }, + { + "attributes": {}, + "tag": "div", + "end": 33790, + "tag_type": 2, + "start": 33784 + }, + { + "attributes": {}, + "tag": "div", + "end": 33796, + "tag_type": 2, + "start": 33790 + }, + { + "attributes": {}, + "tag": "td", + "end": 33801, + "tag_type": 2, + "start": 33796 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33806, + "tag_type": 2, + "start": 33801 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 33814, + "tag_type": 2, + "start": 33806 + }, + { + "attributes": {}, + "tag": "table", + "end": 33822, + "tag_type": 2, + "start": 33814 + }, + { + "attributes": { + "class": "trade-link-wrap" + }, + "tag": "div", + "end": 33851, + "tag_type": 1, + "start": 33822 + }, + { + "attributes": { + "class": "trade-link" + }, + "tag": "div", + "end": 33875, + "tag_type": 1, + "start": 33851 + }, + { + "attributes": {}, + "tag": "div", + "end": 33880, + "tag_type": 1, + "start": 33875 + }, + { + "attributes": {}, + "tag": "table", + "end": 33887, + "tag_type": 1, + "start": 33880 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 33894, + "tag_type": 1, + "start": 33887 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33898, + "tag_type": 1, + "start": 33894 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 33915, + "tag_type": 1, + "start": 33898 + }, + { + "attributes": {}, + "tag": "p", + "end": 33918, + "tag_type": 1, + "start": 33915 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?ptsl=1&ob=Price&fb=0" + }, + "tag": "a", + "end": 34064, + "tag_type": 1, + "start": 33918 + }, + { + "start": 34064, + "end": 34088 + }, + { + "attributes": {}, + "tag": "span", + "end": 34094, + "tag_type": 1, + "start": 34088 + }, + { + "start": 34094, + "end": 34108 + }, + { + "attributes": {}, + "tag": "span", + "end": 34115, + "tag_type": 2, + "start": 34108 + }, + { + "start": 34115, + "end": 34121 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34129, + "tag_type": 1, + "start": 34121 + }, + { + "start": 34129, + "end": 34136 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34145, + "tag_type": 2, + "start": 34136 + }, + { + "attributes": {}, + "tag": "a", + "end": 34149, + "tag_type": 2, + "start": 34145 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=TradeGeneralq", + "class": "huh" + }, + "tag": "a", + "end": 34214, + "tag_type": 1, + "start": 34149 + }, + { + "start": 34214, + "end": 34235 + }, + { + "attributes": {}, + "tag": "a", + "end": 34239, + "tag_type": 2, + "start": 34235 + }, + { + "attributes": {}, + "tag": "p", + "end": 34243, + "tag_type": 2, + "start": 34239 + }, + { + "attributes": {}, + "tag": "ul", + "end": 34247, + "tag_type": 1, + "start": 34243 + }, + { + "attributes": {}, + "tag": "li", + "end": 34251, + "tag_type": 1, + "start": 34247 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?ptsl=1&ob=Price&fb=1" + }, + "tag": "a", + "end": 34397, + "tag_type": 1, + "start": 34251 + }, + { + "attributes": {}, + "tag": "span", + "end": 34403, + "tag_type": 1, + "start": 34397 + }, + { + "start": 34403, + "end": 34408 + }, + { + "attributes": {}, + "tag": "span", + "end": 34415, + "tag_type": 2, + "start": 34408 + }, + { + "start": 34415, + "end": 34421 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34429, + "tag_type": 1, + "start": 34421 + }, + { + "start": 34429, + "end": 34438 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34447, + "tag_type": 2, + "start": 34438 + }, + { + "attributes": {}, + "tag": "a", + "end": 34451, + "tag_type": 2, + "start": 34447 + }, + { + "attributes": {}, + "tag": "li", + "end": 34456, + "tag_type": 2, + "start": 34451 + }, + { + "attributes": {}, + "tag": "ul", + "end": 34461, + "tag_type": 2, + "start": 34456 + }, + { + "attributes": { + "class": "more" + }, + "tag": "div", + "end": 34479, + "tag_type": 1, + "start": 34461 + }, + { + "attributes": {}, + "tag": "div", + "end": 34485, + "tag_type": 2, + "start": 34479 + }, + { + "attributes": {}, + "tag": "td", + "end": 34490, + "tag_type": 2, + "start": 34485 + }, + { + "attributes": {}, + "tag": "tr", + "end": 34495, + "tag_type": 2, + "start": 34490 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 34503, + "tag_type": 2, + "start": 34495 + }, + { + "attributes": {}, + "tag": "table", + "end": 34511, + "tag_type": 2, + "start": 34503 + }, + { + "attributes": {}, + "tag": "div", + "end": 34517, + "tag_type": 2, + "start": 34511 + }, + { + "attributes": {}, + "tag": "div", + "end": 34523, + "tag_type": 2, + "start": 34517 + }, + { + "attributes": {}, + "tag": "div", + "end": 34529, + "tag_type": 2, + "start": 34523 + }, + { + "attributes": {}, + "tag": "div", + "end": 34535, + "tag_type": 2, + "start": 34529 + }, + { + "attributes": { + "class": "linksave" + }, + "tag": "div", + "end": 34557, + "tag_type": 1, + "start": 34535 + }, + { + "attributes": {}, + "tag": "div", + "end": 34562, + "tag_type": 1, + "start": 34557 + }, + { + "attributes": {}, + "tag": "div", + "end": 34567, + "tag_type": 1, + "start": 34562 + }, + { + "attributes": {}, + "tag": "div", + "end": 34572, + "tag_type": 1, + "start": 34567 + }, + { + "attributes": { + "class": "title" + }, + "tag": "div", + "end": 34591, + "tag_type": 1, + "start": 34572 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 34614, + "tag_type": 1, + "start": 34591 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 34621, + "tag_type": 1, + "start": 34614 + }, + { + "attributes": {}, + "tag": "tr", + "end": 34625, + "tag_type": 1, + "start": 34621 + }, + { + "attributes": {}, + "tag": "td", + "end": 34629, + "tag_type": 1, + "start": 34625 + }, + { + "attributes": {}, + "tag": "div", + "end": 34634, + "tag_type": 1, + "start": 34629 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/promo_plus.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 34739, + "tag_type": 1, + "start": 34634 + }, + { + "attributes": {}, + "tag": "div", + "end": 34745, + "tag_type": 2, + "start": 34739 + }, + { + "attributes": {}, + "tag": "td", + "end": 34750, + "tag_type": 2, + "start": 34745 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 34767, + "tag_type": 1, + "start": 34750 + }, + { + "attributes": {}, + "tag": "h1", + "end": 34771, + "tag_type": 1, + "start": 34767 + }, + { + "start": 34771, + "end": 34790 + }, + { + "attributes": {}, + "tag": "h1", + "end": 34795, + "tag_type": 2, + "start": 34790 + }, + { + "attributes": {}, + "tag": "p", + "end": 34798, + "tag_type": 1, + "start": 34795 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34806, + "tag_type": 1, + "start": 34798 + }, + { + "start": 34806, + "end": 34859 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34868, + "tag_type": 2, + "start": 34859 + }, + { + "attributes": {}, + "tag": "p", + "end": 34872, + "tag_type": 2, + "start": 34868 + }, + { + "attributes": {}, + "tag": "td", + "end": 34877, + "tag_type": 2, + "start": 34872 + }, + { + "attributes": {}, + "tag": "td", + "end": 34881, + "tag_type": 1, + "start": 34877 + }, + { + "attributes": { + "class": "button" + }, + "tag": "div", + "end": 34901, + "tag_type": 1, + "start": 34881 + }, + { + "attributes": {}, + "tag": "div", + "end": 34906, + "tag_type": 1, + "start": 34901 + }, + { + "attributes": {}, + "tag": "div", + "end": 34911, + "tag_type": 1, + "start": 34906 + }, + { + "attributes": {}, + "tag": "p", + "end": 34914, + "tag_type": 1, + "start": 34911 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/Product.html?sp=1&dpr=275282", + "title": "Save 50% On This TV Stand When Purchased With This TV" + }, + "tag": "a", + "end": 35057, + "tag_type": 1, + "start": 34914 + }, + { + "start": 35057, + "end": 35067 + }, + { + "attributes": {}, + "tag": "a", + "end": 35071, + "tag_type": 2, + "start": 35067 + }, + { + "attributes": {}, + "tag": "p", + "end": 35075, + "tag_type": 2, + "start": 35071 + }, + { + "attributes": {}, + "tag": "div", + "end": 35081, + "tag_type": 2, + "start": 35075 + }, + { + "attributes": {}, + "tag": "div", + "end": 35087, + "tag_type": 2, + "start": 35081 + }, + { + "attributes": {}, + "tag": "div", + "end": 35093, + "tag_type": 2, + "start": 35087 + }, + { + "attributes": {}, + "tag": "td", + "end": 35098, + "tag_type": 2, + "start": 35093 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35103, + "tag_type": 2, + "start": 35098 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35111, + "tag_type": 2, + "start": 35103 + }, + { + "attributes": {}, + "tag": "table", + "end": 35119, + "tag_type": 2, + "start": 35111 + }, + { + "attributes": {}, + "tag": "div", + "end": 35125, + "tag_type": 2, + "start": 35119 + }, + { + "attributes": {}, + "tag": "div", + "end": 35131, + "tag_type": 2, + "start": 35125 + }, + { + "attributes": {}, + "tag": "div", + "end": 35137, + "tag_type": 2, + "start": 35131 + }, + { + "attributes": {}, + "tag": "div", + "end": 35143, + "tag_type": 2, + "start": 35137 + }, + { + "attributes": { + "class": "linknote" + }, + "tag": "p", + "end": 35163, + "tag_type": 1, + "start": 35143 + }, + { + "attributes": {}, + "tag": "p", + "end": 35167, + "tag_type": 2, + "start": 35163 + }, + { + "attributes": {}, + "tag": "div", + "end": 35173, + "tag_type": 2, + "start": 35167 + }, + { + "start": 35173, + "end": 35177 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 35198, + "tag_type": 1, + "start": 35177 + }, + { + "start": 35198, + "end": 35206 + }, + { + "attributes": {}, + "tag": "h3", + "end": 35210, + "tag_type": 1, + "start": 35206 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 35249, + "tag_type": 1, + "start": 35210 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35256, + "tag_type": 1, + "start": 35249 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35260, + "tag_type": 1, + "start": 35256 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 35277, + "tag_type": 1, + "start": 35260 + }, + { + "attributes": {}, + "tag": "span", + "end": 35283, + "tag_type": 1, + "start": 35277 + }, + { + "start": 35283, + "end": 35301 + }, + { + "attributes": {}, + "tag": "span", + "end": 35308, + "tag_type": 2, + "start": 35301 + }, + { + "attributes": {}, + "tag": "td", + "end": 35313, + "tag_type": 2, + "start": 35308 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 35332, + "tag_type": 1, + "start": 35313 + }, + { + "attributes": {}, + "tag": "td", + "end": 35337, + "tag_type": 2, + "start": 35332 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35342, + "tag_type": 2, + "start": 35337 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35350, + "tag_type": 2, + "start": 35342 + }, + { + "start": 35350, + "end": 35362 + }, + { + "attributes": {}, + "tag": "table", + "end": 35370, + "tag_type": 2, + "start": 35362 + }, + { + "start": 35370, + "end": 35378 + }, + { + "attributes": {}, + "tag": "h3", + "end": 35383, + "tag_type": 2, + "start": 35378 + }, + { + "start": 35383, + "end": 35399 + }, + { + "attributes": {}, + "tag": "p", + "end": 35402, + "tag_type": 1, + "start": 35399 + }, + { + "start": 35402, + "end": 35414 + }, + { + "attributes": { + "href": "#" + }, + "tag": "a", + "end": 35426, + "tag_type": 1, + "start": 35414 + }, + { + "attributes": {}, + "tag": "a", + "end": 35430, + "tag_type": 2, + "start": 35426 + }, + { + "start": 35430, + "end": 35444 + }, + { + "attributes": {}, + "tag": "p", + "end": 35448, + "tag_type": 2, + "start": 35444 + }, + { + "attributes": {}, + "tag": "div", + "end": 35454, + "tag_type": 2, + "start": 35448 + }, + { + "attributes": { + "class": "relatedpromos slice" + }, + "tag": "div", + "end": 35487, + "tag_type": 1, + "start": 35454 + }, + { + "attributes": {}, + "tag": "ul", + "end": 35491, + "tag_type": 1, + "start": 35487 + }, + { + "attributes": { + "class": "textbig" + }, + "tag": "li", + "end": 35511, + "tag_type": 1, + "start": 35491 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/275282/2-/Promo.html" + }, + "tag": "a", + "end": 35570, + "tag_type": 1, + "start": 35511 + }, + { + "start": 35570, + "end": 35589 + }, + { + "attributes": {}, + "tag": "a", + "end": 35593, + "tag_type": 2, + "start": 35589 + }, + { + "attributes": {}, + "tag": "li", + "end": 35598, + "tag_type": 2, + "start": 35593 + }, + { + "attributes": {}, + "tag": "ul", + "end": 35603, + "tag_type": 2, + "start": 35598 + }, + { + "attributes": {}, + "tag": "div", + "end": 35609, + "tag_type": 2, + "start": 35603 + }, + { + "start": 35609, + "end": 35613 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 35634, + "tag_type": 1, + "start": 35613 + }, + { + "start": 35634, + "end": 35642 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0", + "id": "jump-features", + "name": "jump-features" + }, + "tag": "h3", + "end": 35718, + "tag_type": 1, + "start": 35642 + }, + { + "attributes": {}, + "tag": "table", + "end": 35725, + "tag_type": 1, + "start": 35718 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35732, + "tag_type": 1, + "start": 35725 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35736, + "tag_type": 1, + "start": 35732 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 35753, + "tag_type": 1, + "start": 35736 + }, + { + "attributes": {}, + "tag": "span", + "end": 35759, + "tag_type": 1, + "start": 35753 + }, + { + "start": 35759, + "end": 35773 + }, + { + "attributes": {}, + "tag": "span", + "end": 35780, + "tag_type": 2, + "start": 35773 + }, + { + "attributes": {}, + "tag": "td", + "end": 35785, + "tag_type": 2, + "start": 35780 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 35804, + "tag_type": 1, + "start": 35785 + }, + { + "attributes": {}, + "tag": "td", + "end": 35809, + "tag_type": 2, + "start": 35804 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35814, + "tag_type": 2, + "start": 35809 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35822, + "tag_type": 2, + "start": 35814 + }, + { + "start": 35822, + "end": 35834 + }, + { + "attributes": {}, + "tag": "table", + "end": 35842, + "tag_type": 2, + "start": 35834 + }, + { + "start": 35842, + "end": 35850 + }, + { + "attributes": {}, + "tag": "h3", + "end": 35855, + "tag_type": 2, + "start": 35850 + }, + { + "start": 35855, + "end": 35871 + }, + { + "attributes": {}, + "tag": "p", + "end": 35874, + "tag_type": 1, + "start": 35871 + }, + { + "start": 35874, + "end": 35886 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 35906, + "tag_type": 1, + "start": 35886 + }, + { + "attributes": {}, + "tag": "a", + "end": 35910, + "tag_type": 2, + "start": 35906 + }, + { + "start": 35910, + "end": 35924 + }, + { + "attributes": {}, + "tag": "p", + "end": 35928, + "tag_type": 2, + "start": 35924 + }, + { + "attributes": {}, + "tag": "div", + "end": 35934, + "tag_type": 2, + "start": 35928 + }, + { + "attributes": { + "class": "special slice" + }, + "tag": "div", + "end": 35961, + "tag_type": 1, + "start": 35934 + }, + { + "attributes": {}, + "tag": "ul", + "end": 35965, + "tag_type": 1, + "start": 35961 + }, + { + "attributes": {}, + "tag": "li", + "end": 35969, + "tag_type": 1, + "start": 35965 + }, + { + "attributes": {}, + "tag": "center", + "end": 35977, + "tag_type": 1, + "start": 35969 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550ban.jpg", + "alt": "diagram" + }, + "tag": "img", + "end": 36047, + "tag_type": 1, + "start": 35977 + }, + { + "attributes": {}, + "tag": "center", + "end": 36056, + "tag_type": 2, + "start": 36047 + }, + { + "start": 36056, + "end": 36057 + }, + { + "attributes": {}, + "tag": "li", + "end": 36062, + "tag_type": 2, + "start": 36057 + }, + { + "attributes": {}, + "tag": "li", + "end": 36066, + "tag_type": 1, + "start": 36062 + }, + { + "start": 36066, + "end": 36067 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36075, + "tag_type": 1, + "start": 36067 + }, + { + "start": 36075, + "end": 36235 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36244, + "tag_type": 2, + "start": 36235 + }, + { + "attributes": {}, + "tag": "li", + "end": 36249, + "tag_type": 2, + "start": 36244 + }, + { + "attributes": {}, + "tag": "li", + "end": 36253, + "tag_type": 1, + "start": 36249 + }, + { + "start": 36253, + "end": 36270 + }, + { + "attributes": {}, + "tag": "li", + "end": 36275, + "tag_type": 2, + "start": 36270 + }, + { + "attributes": {}, + "tag": "li", + "end": 36279, + "tag_type": 1, + "start": 36275 + }, + { + "start": 36279, + "end": 36303 + }, + { + "attributes": {}, + "tag": "li", + "end": 36308, + "tag_type": 2, + "start": 36303 + }, + { + "attributes": {}, + "tag": "li", + "end": 36312, + "tag_type": 1, + "start": 36308 + }, + { + "start": 36312, + "end": 36329 + }, + { + "attributes": {}, + "tag": "li", + "end": 36334, + "tag_type": 2, + "start": 36329 + }, + { + "attributes": {}, + "tag": "li", + "end": 36338, + "tag_type": 1, + "start": 36334 + }, + { + "start": 36338, + "end": 36360 + }, + { + "attributes": {}, + "tag": "li", + "end": 36365, + "tag_type": 2, + "start": 36360 + }, + { + "attributes": {}, + "tag": "li", + "end": 36369, + "tag_type": 1, + "start": 36365 + }, + { + "start": 36369, + "end": 36407 + }, + { + "attributes": {}, + "tag": "li", + "end": 36412, + "tag_type": 2, + "start": 36407 + }, + { + "attributes": {}, + "tag": "li", + "end": 36416, + "tag_type": 1, + "start": 36412 + }, + { + "start": 36416, + "end": 36443 + }, + { + "attributes": {}, + "tag": "li", + "end": 36448, + "tag_type": 2, + "start": 36443 + }, + { + "attributes": {}, + "tag": "li", + "end": 36452, + "tag_type": 1, + "start": 36448 + }, + { + "start": 36452, + "end": 36472 + }, + { + "attributes": {}, + "tag": "li", + "end": 36477, + "tag_type": 2, + "start": 36472 + }, + { + "attributes": {}, + "tag": "li", + "end": 36481, + "tag_type": 1, + "start": 36477 + }, + { + "start": 36481, + "end": 36482 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36490, + "tag_type": 1, + "start": 36482 + }, + { + "start": 36490, + "end": 36495 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36504, + "tag_type": 2, + "start": 36495 + }, + { + "attributes": {}, + "tag": "li", + "end": 36509, + "tag_type": 2, + "start": 36504 + }, + { + "attributes": {}, + "tag": "li", + "end": 36513, + "tag_type": 1, + "start": 36509 + }, + { + "start": 36513, + "end": 36578 + }, + { + "attributes": {}, + "tag": "li", + "end": 36583, + "tag_type": 2, + "start": 36578 + }, + { + "attributes": {}, + "tag": "li", + "end": 36587, + "tag_type": 1, + "start": 36583 + }, + { + "start": 36587, + "end": 36613 + }, + { + "attributes": {}, + "tag": "li", + "end": 36618, + "tag_type": 2, + "start": 36613 + }, + { + "attributes": {}, + "tag": "li", + "end": 36622, + "tag_type": 1, + "start": 36618 + }, + { + "start": 36622, + "end": 36649 + }, + { + "attributes": {}, + "tag": "li", + "end": 36654, + "tag_type": 2, + "start": 36649 + }, + { + "attributes": {}, + "tag": "li", + "end": 36658, + "tag_type": 1, + "start": 36654 + }, + { + "start": 36658, + "end": 36659 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36667, + "tag_type": 1, + "start": 36659 + }, + { + "start": 36667, + "end": 36675 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36684, + "tag_type": 2, + "start": 36675 + }, + { + "attributes": {}, + "tag": "li", + "end": 36689, + "tag_type": 2, + "start": 36684 + }, + { + "attributes": {}, + "tag": "li", + "end": 36693, + "tag_type": 1, + "start": 36689 + }, + { + "start": 36693, + "end": 36701 + }, + { + "attributes": {}, + "tag": "li", + "end": 36706, + "tag_type": 2, + "start": 36701 + }, + { + "attributes": {}, + "tag": "li", + "end": 36710, + "tag_type": 1, + "start": 36706 + }, + { + "start": 36710, + "end": 36725 + }, + { + "attributes": {}, + "tag": "li", + "end": 36730, + "tag_type": 2, + "start": 36725 + }, + { + "attributes": {}, + "tag": "li", + "end": 36734, + "tag_type": 1, + "start": 36730 + }, + { + "start": 36734, + "end": 36753 + }, + { + "attributes": {}, + "tag": "li", + "end": 36758, + "tag_type": 2, + "start": 36753 + }, + { + "attributes": {}, + "tag": "li", + "end": 36762, + "tag_type": 1, + "start": 36758 + }, + { + "start": 36762, + "end": 36772 + }, + { + "attributes": {}, + "tag": "li", + "end": 36777, + "tag_type": 2, + "start": 36772 + }, + { + "attributes": {}, + "tag": "li", + "end": 36781, + "tag_type": 1, + "start": 36777 + }, + { + "start": 36781, + "end": 36796 + }, + { + "attributes": {}, + "tag": "li", + "end": 36801, + "tag_type": 2, + "start": 36796 + }, + { + "attributes": {}, + "tag": "li", + "end": 36805, + "tag_type": 1, + "start": 36801 + }, + { + "start": 36805, + "end": 36818 + }, + { + "attributes": {}, + "tag": "li", + "end": 36823, + "tag_type": 2, + "start": 36818 + }, + { + "attributes": {}, + "tag": "li", + "end": 36827, + "tag_type": 1, + "start": 36823 + }, + { + "start": 36827, + "end": 36839 + }, + { + "attributes": {}, + "tag": "li", + "end": 36844, + "tag_type": 2, + "start": 36839 + }, + { + "attributes": {}, + "tag": "li", + "end": 36848, + "tag_type": 1, + "start": 36844 + }, + { + "start": 36848, + "end": 36873 + }, + { + "attributes": {}, + "tag": "li", + "end": 36878, + "tag_type": 2, + "start": 36873 + }, + { + "attributes": {}, + "tag": "li", + "end": 36882, + "tag_type": 1, + "start": 36878 + }, + { + "start": 36882, + "end": 36902 + }, + { + "attributes": {}, + "tag": "li", + "end": 36907, + "tag_type": 2, + "start": 36902 + }, + { + "attributes": {}, + "tag": "li", + "end": 36911, + "tag_type": 1, + "start": 36907 + }, + { + "start": 36911, + "end": 36926 + }, + { + "attributes": {}, + "tag": "li", + "end": 36931, + "tag_type": 2, + "start": 36926 + }, + { + "attributes": {}, + "tag": "li", + "end": 36935, + "tag_type": 1, + "start": 36931 + }, + { + "start": 36935, + "end": 36939 + }, + { + "attributes": {}, + "tag": "li", + "end": 36944, + "tag_type": 2, + "start": 36939 + }, + { + "attributes": {}, + "tag": "li", + "end": 36948, + "tag_type": 1, + "start": 36944 + }, + { + "start": 36948, + "end": 36969 + }, + { + "attributes": {}, + "tag": "li", + "end": 36974, + "tag_type": 2, + "start": 36969 + }, + { + "attributes": {}, + "tag": "li", + "end": 36978, + "tag_type": 1, + "start": 36974 + }, + { + "start": 36978, + "end": 36994 + }, + { + "attributes": {}, + "tag": "li", + "end": 36999, + "tag_type": 2, + "start": 36994 + }, + { + "attributes": {}, + "tag": "li", + "end": 37003, + "tag_type": 1, + "start": 36999 + }, + { + "start": 37003, + "end": 37004 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37012, + "tag_type": 1, + "start": 37004 + }, + { + "start": 37012, + "end": 37018 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37027, + "tag_type": 2, + "start": 37018 + }, + { + "attributes": {}, + "tag": "li", + "end": 37032, + "tag_type": 2, + "start": 37027 + }, + { + "attributes": {}, + "tag": "li", + "end": 37036, + "tag_type": 1, + "start": 37032 + }, + { + "start": 37036, + "end": 37045 + }, + { + "attributes": {}, + "tag": "li", + "end": 37050, + "tag_type": 2, + "start": 37045 + }, + { + "attributes": {}, + "tag": "li", + "end": 37054, + "tag_type": 1, + "start": 37050 + }, + { + "start": 37054, + "end": 37073 + }, + { + "attributes": {}, + "tag": "li", + "end": 37078, + "tag_type": 2, + "start": 37073 + }, + { + "attributes": {}, + "tag": "li", + "end": 37082, + "tag_type": 1, + "start": 37078 + }, + { + "start": 37082, + "end": 37083 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37091, + "tag_type": 1, + "start": 37083 + }, + { + "start": 37091, + "end": 37107 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37116, + "tag_type": 2, + "start": 37107 + }, + { + "attributes": {}, + "tag": "li", + "end": 37121, + "tag_type": 2, + "start": 37116 + }, + { + "attributes": {}, + "tag": "li", + "end": 37125, + "tag_type": 1, + "start": 37121 + }, + { + "start": 37125, + "end": 37143 + }, + { + "attributes": {}, + "tag": "li", + "end": 37148, + "tag_type": 2, + "start": 37143 + }, + { + "attributes": {}, + "tag": "li", + "end": 37152, + "tag_type": 1, + "start": 37148 + }, + { + "start": 37152, + "end": 37162 + }, + { + "attributes": {}, + "tag": "li", + "end": 37167, + "tag_type": 2, + "start": 37162 + }, + { + "attributes": {}, + "tag": "li", + "end": 37171, + "tag_type": 1, + "start": 37167 + }, + { + "start": 37171, + "end": 37185 + }, + { + "attributes": {}, + "tag": "li", + "end": 37190, + "tag_type": 2, + "start": 37185 + }, + { + "attributes": {}, + "tag": "li", + "end": 37194, + "tag_type": 1, + "start": 37190 + }, + { + "start": 37194, + "end": 37214 + }, + { + "attributes": {}, + "tag": "li", + "end": 37219, + "tag_type": 2, + "start": 37214 + }, + { + "attributes": {}, + "tag": "li", + "end": 37223, + "tag_type": 1, + "start": 37219 + }, + { + "start": 37223, + "end": 37237 + }, + { + "attributes": {}, + "tag": "li", + "end": 37242, + "tag_type": 2, + "start": 37237 + }, + { + "attributes": {}, + "tag": "li", + "end": 37246, + "tag_type": 1, + "start": 37242 + }, + { + "start": 37246, + "end": 37269 + }, + { + "attributes": {}, + "tag": "li", + "end": 37274, + "tag_type": 2, + "start": 37269 + }, + { + "attributes": {}, + "tag": "li", + "end": 37278, + "tag_type": 1, + "start": 37274 + }, + { + "start": 37278, + "end": 37311 + }, + { + "attributes": {}, + "tag": "li", + "end": 37316, + "tag_type": 2, + "start": 37311 + }, + { + "attributes": {}, + "tag": "li", + "end": 37320, + "tag_type": 1, + "start": 37316 + }, + { + "start": 37320, + "end": 37354 + }, + { + "attributes": {}, + "tag": "li", + "end": 37359, + "tag_type": 2, + "start": 37354 + }, + { + "attributes": {}, + "tag": "li", + "end": 37363, + "tag_type": 1, + "start": 37359 + }, + { + "start": 37363, + "end": 37388 + }, + { + "attributes": {}, + "tag": "li", + "end": 37393, + "tag_type": 2, + "start": 37388 + }, + { + "attributes": {}, + "tag": "li", + "end": 37397, + "tag_type": 1, + "start": 37393 + }, + { + "start": 37397, + "end": 37427 + }, + { + "attributes": {}, + "tag": "li", + "end": 37432, + "tag_type": 2, + "start": 37427 + }, + { + "attributes": {}, + "tag": "li", + "end": 37436, + "tag_type": 1, + "start": 37432 + }, + { + "start": 37436, + "end": 37452 + }, + { + "attributes": {}, + "tag": "li", + "end": 37457, + "tag_type": 2, + "start": 37452 + }, + { + "attributes": {}, + "tag": "li", + "end": 37461, + "tag_type": 1, + "start": 37457 + }, + { + "start": 37461, + "end": 37476 + }, + { + "attributes": {}, + "tag": "li", + "end": 37481, + "tag_type": 2, + "start": 37476 + }, + { + "attributes": {}, + "tag": "li", + "end": 37485, + "tag_type": 1, + "start": 37481 + }, + { + "start": 37485, + "end": 37506 + }, + { + "attributes": {}, + "tag": "li", + "end": 37511, + "tag_type": 2, + "start": 37506 + }, + { + "attributes": {}, + "tag": "li", + "end": 37515, + "tag_type": 1, + "start": 37511 + }, + { + "start": 37515, + "end": 37528 + }, + { + "attributes": {}, + "tag": "li", + "end": 37533, + "tag_type": 2, + "start": 37528 + }, + { + "attributes": {}, + "tag": "li", + "end": 37537, + "tag_type": 1, + "start": 37533 + }, + { + "start": 37537, + "end": 37549 + }, + { + "attributes": {}, + "tag": "li", + "end": 37554, + "tag_type": 2, + "start": 37549 + }, + { + "attributes": {}, + "tag": "li", + "end": 37558, + "tag_type": 1, + "start": 37554 + }, + { + "start": 37558, + "end": 37559 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37567, + "tag_type": 1, + "start": 37559 + }, + { + "start": 37567, + "end": 37573 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37582, + "tag_type": 2, + "start": 37573 + }, + { + "attributes": {}, + "tag": "li", + "end": 37587, + "tag_type": 2, + "start": 37582 + }, + { + "attributes": {}, + "tag": "li", + "end": 37591, + "tag_type": 1, + "start": 37587 + }, + { + "start": 37591, + "end": 37616 + }, + { + "attributes": {}, + "tag": "li", + "end": 37621, + "tag_type": 2, + "start": 37616 + }, + { + "attributes": {}, + "tag": "li", + "end": 37625, + "tag_type": 1, + "start": 37621 + }, + { + "start": 37625, + "end": 37648 + }, + { + "attributes": {}, + "tag": "li", + "end": 37653, + "tag_type": 2, + "start": 37648 + }, + { + "attributes": {}, + "tag": "li", + "end": 37657, + "tag_type": 1, + "start": 37653 + }, + { + "start": 37657, + "end": 37677 + }, + { + "attributes": {}, + "tag": "li", + "end": 37682, + "tag_type": 2, + "start": 37677 + }, + { + "attributes": {}, + "tag": "li", + "end": 37686, + "tag_type": 1, + "start": 37682 + }, + { + "start": 37686, + "end": 37687 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37695, + "tag_type": 1, + "start": 37687 + }, + { + "start": 37695, + "end": 37706 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37715, + "tag_type": 2, + "start": 37706 + }, + { + "attributes": {}, + "tag": "li", + "end": 37720, + "tag_type": 2, + "start": 37715 + }, + { + "attributes": {}, + "tag": "li", + "end": 37724, + "tag_type": 1, + "start": 37720 + }, + { + "start": 37724, + "end": 37770 + }, + { + "attributes": {}, + "tag": "li", + "end": 37775, + "tag_type": 2, + "start": 37770 + }, + { + "attributes": {}, + "tag": "li", + "end": 37779, + "tag_type": 1, + "start": 37775 + }, + { + "start": 37779, + "end": 37827 + }, + { + "attributes": {}, + "tag": "li", + "end": 37832, + "tag_type": 2, + "start": 37827 + }, + { + "attributes": {}, + "tag": "li", + "end": 37836, + "tag_type": 1, + "start": 37832 + }, + { + "start": 37836, + "end": 37837 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37845, + "tag_type": 1, + "start": 37837 + }, + { + "start": 37845, + "end": 37851 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37860, + "tag_type": 2, + "start": 37851 + }, + { + "attributes": {}, + "tag": "li", + "end": 37865, + "tag_type": 2, + "start": 37860 + }, + { + "attributes": {}, + "tag": "li", + "end": 37869, + "tag_type": 1, + "start": 37865 + }, + { + "start": 37869, + "end": 37897 + }, + { + "attributes": {}, + "tag": "li", + "end": 37902, + "tag_type": 2, + "start": 37897 + }, + { + "attributes": {}, + "tag": "li", + "end": 37906, + "tag_type": 1, + "start": 37902 + }, + { + "start": 37906, + "end": 37937 + }, + { + "attributes": {}, + "tag": "li", + "end": 37942, + "tag_type": 2, + "start": 37937 + }, + { + "attributes": {}, + "tag": "li", + "end": 37946, + "tag_type": 1, + "start": 37942 + }, + { + "start": 37946, + "end": 37947 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37955, + "tag_type": 1, + "start": 37947 + }, + { + "start": 37955, + "end": 37964 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37973, + "tag_type": 2, + "start": 37964 + }, + { + "attributes": {}, + "tag": "li", + "end": 37978, + "tag_type": 2, + "start": 37973 + }, + { + "attributes": {}, + "tag": "li", + "end": 37982, + "tag_type": 1, + "start": 37978 + }, + { + "start": 37982, + "end": 38026 + }, + { + "attributes": {}, + "tag": "li", + "end": 38031, + "tag_type": 2, + "start": 38026 + }, + { + "attributes": {}, + "tag": "li", + "end": 38035, + "tag_type": 1, + "start": 38031 + }, + { + "start": 38035, + "end": 38053 + }, + { + "attributes": {}, + "tag": "li", + "end": 38058, + "tag_type": 2, + "start": 38053 + }, + { + "attributes": {}, + "tag": "li", + "end": 38062, + "tag_type": 1, + "start": 38058 + }, + { + "start": 38062, + "end": 38072 + }, + { + "attributes": {}, + "tag": "li", + "end": 38077, + "tag_type": 2, + "start": 38072 + }, + { + "attributes": {}, + "tag": "li", + "end": 38081, + "tag_type": 1, + "start": 38077 + }, + { + "start": 38081, + "end": 38093 + }, + { + "attributes": {}, + "tag": "li", + "end": 38098, + "tag_type": 2, + "start": 38093 + }, + { + "attributes": {}, + "tag": "ul", + "end": 38103, + "tag_type": 2, + "start": 38098 + }, + { + "attributes": {}, + "tag": "div", + "end": 38109, + "tag_type": 2, + "start": 38103 + }, + { + "start": 38109, + "end": 38113 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 38134, + "tag_type": 1, + "start": 38113 + }, + { + "start": 38134, + "end": 38142 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0", + "id": "jump-review", + "name": "jump-review" + }, + "tag": "h3", + "end": 38214, + "tag_type": 1, + "start": 38142 + }, + { + "attributes": {}, + "tag": "table", + "end": 38221, + "tag_type": 1, + "start": 38214 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 38228, + "tag_type": 1, + "start": 38221 + }, + { + "attributes": {}, + "tag": "tr", + "end": 38232, + "tag_type": 1, + "start": 38228 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 38249, + "tag_type": 1, + "start": 38232 + }, + { + "attributes": {}, + "tag": "span", + "end": 38255, + "tag_type": 1, + "start": 38249 + }, + { + "start": 38255, + "end": 38266 + }, + { + "attributes": {}, + "tag": "span", + "end": 38273, + "tag_type": 2, + "start": 38266 + }, + { + "attributes": {}, + "tag": "td", + "end": 38278, + "tag_type": 2, + "start": 38273 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 38297, + "tag_type": 1, + "start": 38278 + }, + { + "attributes": {}, + "tag": "td", + "end": 38302, + "tag_type": 2, + "start": 38297 + }, + { + "attributes": {}, + "tag": "tr", + "end": 38307, + "tag_type": 2, + "start": 38302 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 38315, + "tag_type": 2, + "start": 38307 + }, + { + "start": 38315, + "end": 38327 + }, + { + "attributes": {}, + "tag": "table", + "end": 38335, + "tag_type": 2, + "start": 38327 + }, + { + "start": 38335, + "end": 38343 + }, + { + "attributes": {}, + "tag": "h3", + "end": 38348, + "tag_type": 2, + "start": 38343 + }, + { + "start": 38348, + "end": 38364 + }, + { + "attributes": {}, + "tag": "p", + "end": 38367, + "tag_type": 1, + "start": 38364 + }, + { + "start": 38367, + "end": 38379 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 38399, + "tag_type": 1, + "start": 38379 + }, + { + "attributes": {}, + "tag": "a", + "end": 38403, + "tag_type": 2, + "start": 38399 + }, + { + "start": 38403, + "end": 38417 + }, + { + "attributes": {}, + "tag": "p", + "end": 38421, + "tag_type": 2, + "start": 38417 + }, + { + "attributes": {}, + "tag": "div", + "end": 38427, + "tag_type": 2, + "start": 38421 + }, + { + "attributes": { + "class": "review slice" + }, + "tag": "div", + "end": 38453, + "tag_type": 1, + "start": 38427 + }, + { + "attributes": {}, + "tag": "p", + "end": 38456, + "tag_type": 1, + "start": 38453 + }, + { + "start": 38456, + "end": 38593 + }, + { + "attributes": {}, + "tag": "br", + "end": 38597, + "tag_type": 1, + "start": 38593 + }, + { + "attributes": {}, + "tag": "br", + "end": 38601, + "tag_type": 1, + "start": 38597 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550a.jpg", + "align": "left", + "hspace": "5" + }, + "tag": "img", + "end": 38679, + "tag_type": 1, + "start": 38601 + }, + { + "attributes": {}, + "tag": "br", + "end": 38683, + "tag_type": 1, + "start": 38679 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38691, + "tag_type": 1, + "start": 38683 + }, + { + "start": 38691, + "end": 38699 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38708, + "tag_type": 2, + "start": 38699 + }, + { + "attributes": {}, + "tag": "br", + "end": 38712, + "tag_type": 1, + "start": 38708 + }, + { + "start": 38712, + "end": 38983 + }, + { + "attributes": {}, + "tag": "br", + "end": 38987, + "tag_type": 1, + "start": 38983 + }, + { + "attributes": { + "clear": "all" + }, + "tag": "br", + "end": 39003, + "tag_type": 1, + "start": 38987 + }, + { + "attributes": {}, + "tag": "br", + "end": 39007, + "tag_type": 1, + "start": 39003 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550b.jpg", + "align": "left", + "hspace": "5" + }, + "tag": "img", + "end": 39085, + "tag_type": 1, + "start": 39007 + }, + { + "attributes": {}, + "tag": "br", + "end": 39089, + "tag_type": 1, + "start": 39085 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39097, + "tag_type": 1, + "start": 39089 + }, + { + "start": 39097, + "end": 39117 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39126, + "tag_type": 2, + "start": 39117 + }, + { + "attributes": {}, + "tag": "br", + "end": 39130, + "tag_type": 1, + "start": 39126 + }, + { + "start": 39130, + "end": 39271 + }, + { + "attributes": {}, + "tag": "br", + "end": 39275, + "tag_type": 1, + "start": 39271 + }, + { + "attributes": { + "clear": "all" + }, + "tag": "br", + "end": 39291, + "tag_type": 1, + "start": 39275 + }, + { + "attributes": {}, + "tag": "br", + "end": 39295, + "tag_type": 1, + "start": 39291 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550c.jpg", + "align": "left", + "hspace": "5" + }, + "tag": "img", + "end": 39373, + "tag_type": 1, + "start": 39295 + }, + { + "attributes": {}, + "tag": "br", + "end": 39377, + "tag_type": 1, + "start": 39373 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39385, + "tag_type": 1, + "start": 39377 + }, + { + "start": 39385, + "end": 39403 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39412, + "tag_type": 2, + "start": 39403 + }, + { + "attributes": {}, + "tag": "br", + "end": 39416, + "tag_type": 1, + "start": 39412 + }, + { + "start": 39416, + "end": 39601 + }, + { + "attributes": {}, + "tag": "br", + "end": 39605, + "tag_type": 1, + "start": 39601 + }, + { + "attributes": { + "clear": "all" + }, + "tag": "br", + "end": 39621, + "tag_type": 1, + "start": 39605 + }, + { + "attributes": {}, + "tag": "br", + "end": 39625, + "tag_type": 1, + "start": 39621 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550d.jpg", + "align": "left", + "hspace": "5" + }, + "tag": "img", + "end": 39703, + "tag_type": 1, + "start": 39625 + }, + { + "attributes": {}, + "tag": "br", + "end": 39707, + "tag_type": 1, + "start": 39703 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39715, + "tag_type": 1, + "start": 39707 + }, + { + "start": 39715, + "end": 39722 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39731, + "tag_type": 2, + "start": 39722 + }, + { + "attributes": {}, + "tag": "br", + "end": 39735, + "tag_type": 1, + "start": 39731 + }, + { + "start": 39735, + "end": 39835 + }, + { + "attributes": {}, + "tag": "br", + "end": 39839, + "tag_type": 1, + "start": 39835 + }, + { + "attributes": { + "clear": "all" + }, + "tag": "br", + "end": 39855, + "tag_type": 1, + "start": 39839 + }, + { + "attributes": {}, + "tag": "p", + "end": 39859, + "tag_type": 2, + "start": 39855 + }, + { + "attributes": {}, + "tag": "div", + "end": 39865, + "tag_type": 2, + "start": 39859 + }, + { + "start": 39865, + "end": 39869 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 39890, + "tag_type": 1, + "start": 39869 + }, + { + "start": 39890, + "end": 39898 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0", + "id": "jump-customer-review", + "name": "jump-customer-review" + }, + "tag": "h3", + "end": 39988, + "tag_type": 1, + "start": 39898 + }, + { + "attributes": {}, + "tag": "table", + "end": 39995, + "tag_type": 1, + "start": 39988 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 40002, + "tag_type": 1, + "start": 39995 + }, + { + "attributes": {}, + "tag": "tr", + "end": 40006, + "tag_type": 1, + "start": 40002 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 40023, + "tag_type": 1, + "start": 40006 + }, + { + "attributes": {}, + "tag": "span", + "end": 40029, + "tag_type": 1, + "start": 40023 + }, + { + "start": 40029, + "end": 40045 + }, + { + "attributes": {}, + "tag": "span", + "end": 40052, + "tag_type": 2, + "start": 40045 + }, + { + "attributes": {}, + "tag": "td", + "end": 40057, + "tag_type": 2, + "start": 40052 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 40076, + "tag_type": 1, + "start": 40057 + }, + { + "attributes": {}, + "tag": "td", + "end": 40081, + "tag_type": 2, + "start": 40076 + }, + { + "attributes": {}, + "tag": "tr", + "end": 40086, + "tag_type": 2, + "start": 40081 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 40094, + "tag_type": 2, + "start": 40086 + }, + { + "start": 40094, + "end": 40106 + }, + { + "attributes": {}, + "tag": "table", + "end": 40114, + "tag_type": 2, + "start": 40106 + }, + { + "start": 40114, + "end": 40122 + }, + { + "attributes": {}, + "tag": "h3", + "end": 40127, + "tag_type": 2, + "start": 40122 + }, + { + "start": 40127, + "end": 40143 + }, + { + "attributes": {}, + "tag": "p", + "end": 40146, + "tag_type": 1, + "start": 40143 + }, + { + "start": 40146, + "end": 40158 + }, + { + "attributes": { + "href": null + }, + "tag": "a", + "end": 40169, + "tag_type": 1, + "start": 40158 + }, + { + "attributes": {}, + "tag": "a", + "end": 40173, + "tag_type": 2, + "start": 40169 + }, + { + "start": 40173, + "end": 40187 + }, + { + "attributes": {}, + "tag": "p", + "end": 40191, + "tag_type": 2, + "start": 40187 + }, + { + "attributes": {}, + "tag": "div", + "end": 40197, + "tag_type": 2, + "start": 40191 + }, + { + "attributes": { + "class": "rnr slice" + }, + "tag": "div", + "end": 40220, + "tag_type": 1, + "start": 40197 + }, + { + "attributes": { + "class": "rnr-average", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_avarageRating__divAverage" + }, + "tag": "div", + "end": 40339, + "tag_type": 1, + "start": 40220 + }, + { + "attributes": {}, + "tag": "div", + "end": 40344, + "tag_type": 1, + "start": 40339 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50_x.gif", + "alt": "Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars", + "style": "border-width: 0px; height: 21px; width: 106px;" + }, + "tag": "img", + "end": 40598, + "tag_type": 1, + "start": 40344 + }, + { + "attributes": {}, + "tag": "div", + "end": 40604, + "tag_type": 2, + "start": 40598 + }, + { + "attributes": {}, + "tag": "p", + "end": 40607, + "tag_type": 1, + "start": 40604 + }, + { + "start": 40607, + "end": 40623 + }, + { + "attributes": {}, + "tag": "strong", + "end": 40631, + "tag_type": 1, + "start": 40623 + }, + { + "start": 40631, + "end": 40632 + }, + { + "attributes": {}, + "tag": "strong", + "end": 40641, + "tag_type": 2, + "start": 40632 + }, + { + "start": 40641, + "end": 40649 + }, + { + "attributes": {}, + "tag": "p", + "end": 40653, + "tag_type": 2, + "start": 40649 + }, + { + "attributes": {}, + "tag": "div", + "end": 40659, + "tag_type": 2, + "start": 40653 + }, + { + "attributes": { + "class": "rnr-links", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_divHeaderLinks" + }, + "tag": "div", + "end": 40765, + "tag_type": 1, + "start": 40659 + }, + { + "start": 40765, + "end": 40777 + }, + { + "attributes": {}, + "tag": "p", + "end": 40780, + "tag_type": 1, + "start": 40777 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=productreviewadd&_productid=8986420&_region=ELEC&_producttitle=Samsung+Series+5+550+37%22+LE37B550+%2f+HD+1080p+%2f+Freeview+%2f+LCD+TV+%28Black%29&_smallimageavailable=1", + "title": "Write a review of Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)" + }, + "tag": "a", + "end": 41373, + "tag_type": 1, + "start": 40780 + }, + { + "start": 41373, + "end": 41387 + }, + { + "attributes": {}, + "tag": "a", + "end": 41391, + "tag_type": 2, + "start": 41387 + }, + { + "start": 41391, + "end": 41394 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 41620, + "tag_type": 1, + "start": 41394 + }, + { + "start": 41620, + "end": 41641 + }, + { + "attributes": {}, + "tag": "a", + "end": 41645, + "tag_type": 2, + "start": 41641 + }, + { + "attributes": {}, + "tag": "p", + "end": 41649, + "tag_type": 2, + "start": 41645 + }, + { + "start": 41649, + "end": 41657 + }, + { + "attributes": {}, + "tag": "div", + "end": 41663, + "tag_type": 2, + "start": 41657 + }, + { + "start": 41663, + "end": 41679 + }, + { + "attributes": { + "class": "rnr-review" + }, + "tag": "div", + "end": 41703, + "tag_type": 1, + "start": 41679 + }, + { + "attributes": { + "class": "rnr-header" + }, + "tag": "div", + "end": 41727, + "tag_type": 1, + "start": 41703 + }, + { + "attributes": {}, + "tag": "h4", + "end": 41731, + "tag_type": 1, + "start": 41727 + }, + { + "attributes": { + "name": "346537" + }, + "tag": "a", + "end": 41748, + "tag_type": 1, + "start": 41731 + }, + { + "attributes": {}, + "tag": "a", + "end": 41752, + "tag_type": 2, + "start": 41748 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50.gif", + "alt": "Customer rating: 5 out of 5 stars", + "style": "border-width: 0px; height: 14px; width: 71px;" + }, + "tag": "img", + "end": 41922, + "tag_type": 1, + "start": 41752 + }, + { + "start": 41922, + "end": 41940 + }, + { + "attributes": {}, + "tag": "h4", + "end": 41945, + "tag_type": 2, + "start": 41940 + }, + { + "attributes": { + "class": "rnr-info" + }, + "tag": "p", + "end": 41965, + "tag_type": 1, + "start": 41945 + }, + { + "attributes": {}, + "tag": "strong", + "end": 41973, + "tag_type": 1, + "start": 41965 + }, + { + "start": 41973, + "end": 41980 + }, + { + "attributes": {}, + "tag": "strong", + "end": 41989, + "tag_type": 2, + "start": 41980 + }, + { + "start": 41989, + "end": 42002 + }, + { + "attributes": {}, + "tag": "span", + "end": 42008, + "tag_type": 1, + "start": 42002 + }, + { + "start": 42008, + "end": 42018 + }, + { + "attributes": {}, + "tag": "span", + "end": 42025, + "tag_type": 2, + "start": 42018 + }, + { + "start": 42025, + "end": 42038 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/UserReviews.html?rn=124580&edtm=0" + }, + "tag": "a", + "end": 42100, + "tag_type": 1, + "start": 42038 + }, + { + "start": 42100, + "end": 42131 + }, + { + "attributes": {}, + "tag": "a", + "end": 42135, + "tag_type": 2, + "start": 42131 + }, + { + "attributes": {}, + "tag": "p", + "end": 42139, + "tag_type": 2, + "start": 42135 + }, + { + "attributes": {}, + "tag": "div", + "end": 42145, + "tag_type": 2, + "start": 42139 + }, + { + "attributes": { + "class": "rnr-content" + }, + "tag": "div", + "end": 42170, + "tag_type": 1, + "start": 42145 + }, + { + "attributes": {}, + "tag": "p", + "end": 42173, + "tag_type": 1, + "start": 42170 + }, + { + "start": 42173, + "end": 42316 + }, + { + "attributes": {}, + "tag": "p", + "end": 42320, + "tag_type": 2, + "start": 42316 + }, + { + "attributes": {}, + "tag": "div", + "end": 42326, + "tag_type": 2, + "start": 42320 + }, + { + "attributes": { + "class": "rnr-footer" + }, + "tag": "div", + "end": 42350, + "tag_type": 1, + "start": 42326 + }, + { + "attributes": {}, + "tag": "p", + "end": 42353, + "tag_type": 1, + "start": 42350 + }, + { + "attributes": {}, + "tag": "span", + "end": 42359, + "tag_type": 1, + "start": 42353 + }, + { + "start": 42359, + "end": 42392 + }, + { + "attributes": {}, + "tag": "span", + "end": 42399, + "tag_type": 2, + "start": 42392 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=REVIEW_VOTE&_reviewId=346537&_helpful=y", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__linkYes" + }, + "tag": "a", + "end": 42855, + "tag_type": 1, + "start": 42399 + }, + { + "start": 42855, + "end": 42858 + }, + { + "attributes": {}, + "tag": "a", + "end": 42862, + "tag_type": 2, + "start": 42858 + }, + { + "start": 42862, + "end": 42875 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=REVIEW_VOTE&_reviewId=346537&_helpful=n", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__linkNo" + }, + "tag": "a", + "end": 43330, + "tag_type": 1, + "start": 42875 + }, + { + "start": 43330, + "end": 43332 + }, + { + "attributes": {}, + "tag": "a", + "end": 43336, + "tag_type": 2, + "start": 43332 + }, + { + "start": 43336, + "end": 43349 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=report_review&_reviewId=346537", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__ReportReviewLink_lnkReportReview" + }, + "tag": "a", + "end": 43817, + "tag_type": 1, + "start": 43349 + }, + { + "start": 43817, + "end": 43829 + }, + { + "attributes": {}, + "tag": "a", + "end": 43833, + "tag_type": 2, + "start": 43829 + }, + { + "attributes": {}, + "tag": "p", + "end": 43837, + "tag_type": 2, + "start": 43833 + }, + { + "attributes": {}, + "tag": "div", + "end": 43843, + "tag_type": 2, + "start": 43837 + }, + { + "attributes": {}, + "tag": "div", + "end": 43849, + "tag_type": 2, + "start": 43843 + }, + { + "start": 43849, + "end": 43869 + }, + { + "attributes": { + "class": "rnr-links" + }, + "tag": "div", + "end": 43892, + "tag_type": 1, + "start": 43869 + }, + { + "start": 43892, + "end": 43904 + }, + { + "attributes": {}, + "tag": "p", + "end": 43907, + "tag_type": 1, + "start": 43904 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=productreviewadd&_productid=8986420&_region=ELEC&_producttitle=Samsung+Series+5+550+37%22+LE37B550+%2f+HD+1080p+%2f+Freeview+%2f+LCD+TV+%28Black%29&_smallimageavailable=1", + "title": "Write a review of Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)" + }, + "tag": "a", + "end": 44500, + "tag_type": 1, + "start": 43907 + }, + { + "start": 44500, + "end": 44514 + }, + { + "attributes": {}, + "tag": "a", + "end": 44518, + "tag_type": 2, + "start": 44514 + }, + { + "start": 44518, + "end": 44521 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 44747, + "tag_type": 1, + "start": 44521 + }, + { + "start": 44747, + "end": 44768 + }, + { + "attributes": {}, + "tag": "a", + "end": 44772, + "tag_type": 2, + "start": 44768 + }, + { + "attributes": {}, + "tag": "p", + "end": 44776, + "tag_type": 2, + "start": 44772 + }, + { + "start": 44776, + "end": 44784 + }, + { + "attributes": {}, + "tag": "div", + "end": 44790, + "tag_type": 2, + "start": 44784 + }, + { + "start": 44790, + "end": 44794 + }, + { + "attributes": {}, + "tag": "div", + "end": 44800, + "tag_type": 2, + "start": 44794 + }, + { + "start": 44800, + "end": 44804 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 44825, + "tag_type": 1, + "start": 44804 + }, + { + "start": 44825, + "end": 44833 + }, + { + "attributes": {}, + "tag": "h3", + "end": 44837, + "tag_type": 1, + "start": 44833 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 44876, + "tag_type": 1, + "start": 44837 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 44883, + "tag_type": 1, + "start": 44876 + }, + { + "attributes": {}, + "tag": "tr", + "end": 44887, + "tag_type": 1, + "start": 44883 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 44904, + "tag_type": 1, + "start": 44887 + }, + { + "attributes": {}, + "tag": "span", + "end": 44910, + "tag_type": 1, + "start": 44904 + }, + { + "start": 44910, + "end": 44937 + }, + { + "attributes": {}, + "tag": "span", + "end": 44944, + "tag_type": 2, + "start": 44937 + }, + { + "attributes": {}, + "tag": "td", + "end": 44949, + "tag_type": 2, + "start": 44944 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 44968, + "tag_type": 1, + "start": 44949 + }, + { + "attributes": {}, + "tag": "td", + "end": 44973, + "tag_type": 2, + "start": 44968 + }, + { + "attributes": {}, + "tag": "tr", + "end": 44978, + "tag_type": 2, + "start": 44973 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 44986, + "tag_type": 2, + "start": 44978 + }, + { + "start": 44986, + "end": 44998 + }, + { + "attributes": {}, + "tag": "table", + "end": 45006, + "tag_type": 2, + "start": 44998 + }, + { + "start": 45006, + "end": 45014 + }, + { + "attributes": {}, + "tag": "h3", + "end": 45019, + "tag_type": 2, + "start": 45014 + }, + { + "start": 45019, + "end": 45035 + }, + { + "attributes": {}, + "tag": "p", + "end": 45038, + "tag_type": 1, + "start": 45035 + }, + { + "start": 45038, + "end": 45050 + }, + { + "attributes": { + "href": null + }, + "tag": "a", + "end": 45061, + "tag_type": 1, + "start": 45050 + }, + { + "attributes": {}, + "tag": "a", + "end": 45065, + "tag_type": 2, + "start": 45061 + }, + { + "start": 45065, + "end": 45079 + }, + { + "attributes": {}, + "tag": "p", + "end": 45083, + "tag_type": 2, + "start": 45079 + }, + { + "attributes": {}, + "tag": "div", + "end": 45089, + "tag_type": 2, + "start": 45083 + }, + { + "attributes": { + "class": "related slice" + }, + "tag": "div", + "end": 45116, + "tag_type": 1, + "start": 45089 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 45139, + "tag_type": 1, + "start": 45116 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 45146, + "tag_type": 1, + "start": 45139 + }, + { + "attributes": {}, + "tag": "tr", + "end": 45150, + "tag_type": 1, + "start": 45146 + }, + { + "attributes": {}, + "tag": "td", + "end": 45154, + "tag_type": 1, + "start": 45150 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 45173, + "tag_type": 1, + "start": 45154 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986409/Samsung-Series-5-550-32-LE32B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 45290, + "tag_type": 1, + "start": 45173 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8986409s.jpg", + "alt": "Samsung Series 5 550 32" LE32B550 / HD 1080p / Freeview / LCD TV (Black)", + "style": "border-width: 0px; height: 85px; width: 85px;" + }, + "tag": "img", + "end": 45493, + "tag_type": 1, + "start": 45290 + }, + { + "attributes": {}, + "tag": "a", + "end": 45497, + "tag_type": 2, + "start": 45493 + }, + { + "attributes": {}, + "tag": "div", + "end": 45503, + "tag_type": 2, + "start": 45497 + }, + { + "attributes": {}, + "tag": "td", + "end": 45508, + "tag_type": 2, + "start": 45503 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 45525, + "tag_type": 1, + "start": 45508 + }, + { + "attributes": { + "class": "info" + }, + "tag": "div", + "end": 45543, + "tag_type": 1, + "start": 45525 + }, + { + "attributes": {}, + "tag": "ul", + "end": 45547, + "tag_type": 1, + "start": 45543 + }, + { + "attributes": {}, + "tag": "li", + "end": 45551, + "tag_type": 1, + "start": 45547 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986409/Samsung-Series-5-550-32-LE32B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 45668, + "tag_type": 1, + "start": 45551 + }, + { + "start": 45668, + "end": 45761 + }, + { + "attributes": {}, + "tag": "a", + "end": 45765, + "tag_type": 2, + "start": 45761 + }, + { + "attributes": {}, + "tag": "li", + "end": 45770, + "tag_type": 2, + "start": 45765 + }, + { + "attributes": {}, + "tag": "ul", + "end": 45775, + "tag_type": 2, + "start": 45770 + }, + { + "attributes": {}, + "tag": "div", + "end": 45781, + "tag_type": 2, + "start": 45775 + }, + { + "attributes": {}, + "tag": "td", + "end": 45786, + "tag_type": 2, + "start": 45781 + }, + { + "attributes": {}, + "tag": "tr", + "end": 45791, + "tag_type": 2, + "start": 45786 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 45799, + "tag_type": 2, + "start": 45791 + }, + { + "attributes": {}, + "tag": "table", + "end": 45807, + "tag_type": 2, + "start": 45799 + }, + { + "attributes": {}, + "tag": "div", + "end": 45813, + "tag_type": 2, + "start": 45807 + }, + { + "attributes": {}, + "tag": "div", + "end": 45819, + "tag_type": 2, + "start": 45813 + }, + { + "attributes": {}, + "tag": "div", + "end": 45825, + "tag_type": 2, + "start": 45819 + }, + { + "attributes": { + "class": "footnote wrap" + }, + "tag": "div", + "end": 45852, + "tag_type": 1, + "start": 45825 + }, + { + "attributes": { + "class": "email" + }, + "tag": "p", + "end": 45869, + "tag_type": 1, + "start": 45852 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/EmailAFriend.html" + }, + "tag": "a", + "end": 45935, + "tag_type": 1, + "start": 45869 + }, + { + "start": 45935, + "end": 45969 + }, + { + "attributes": {}, + "tag": "a", + "end": 45973, + "tag_type": 2, + "start": 45969 + }, + { + "attributes": {}, + "tag": "p", + "end": 45977, + "tag_type": 2, + "start": 45973 + }, + { + "attributes": {}, + "tag": "p", + "end": 45980, + "tag_type": 1, + "start": 45977 + }, + { + "start": 45980, + "end": 46009 + }, + { + "attributes": { + "style": null, + "href": "about:blank" + }, + "tag": "a", + "end": 46040, + "tag_type": 1, + "start": 46009 + }, + { + "start": 46040, + "end": 46057 + }, + { + "attributes": {}, + "tag": "a", + "end": 46061, + "tag_type": 2, + "start": 46057 + }, + { + "attributes": {}, + "tag": "p", + "end": 46065, + "tag_type": 2, + "start": 46061 + }, + { + "attributes": {}, + "tag": "p", + "end": 46068, + "tag_type": 1, + "start": 46065 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 46088, + "tag_type": 1, + "start": 46068 + }, + { + "start": 46088, + "end": 46099 + }, + { + "attributes": {}, + "tag": "a", + "end": 46103, + "tag_type": 2, + "start": 46099 + }, + { + "attributes": {}, + "tag": "p", + "end": 46107, + "tag_type": 2, + "start": 46103 + }, + { + "attributes": {}, + "tag": "div", + "end": 46113, + "tag_type": 2, + "start": 46107 + }, + { + "start": 46113, + "end": 46137 + }, + { + "attributes": {}, + "tag": "div", + "end": 46143, + "tag_type": 2, + "start": 46137 + }, + { + "start": 46143, + "end": 46163 + }, + { + "attributes": {}, + "tag": "div", + "end": 46169, + "tag_type": 2, + "start": 46163 + }, + { + "start": 46169, + "end": 46189 + }, + { + "attributes": { + "id": "leftCol" + }, + "tag": "div", + "end": 46207, + "tag_type": 1, + "start": 46189 + }, + { + "start": 46207, + "end": 46231 + }, + { + "attributes": { + "class": "column" + }, + "tag": "div", + "end": 46251, + "tag_type": 1, + "start": 46231 + }, + { + "start": 46251, + "end": 46275 + }, + { + "attributes": { + "class": "browse wrap" + }, + "tag": "div", + "end": 46300, + "tag_type": 1, + "start": 46275 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 46321, + "tag_type": 1, + "start": 46300 + }, + { + "attributes": {}, + "tag": "div", + "end": 46326, + "tag_type": 1, + "start": 46321 + }, + { + "attributes": {}, + "tag": "div", + "end": 46331, + "tag_type": 1, + "start": 46326 + }, + { + "attributes": {}, + "tag": "h2", + "end": 46335, + "tag_type": 1, + "start": 46331 + }, + { + "start": 46335, + "end": 46353 + }, + { + "attributes": {}, + "tag": "h2", + "end": 46358, + "tag_type": 2, + "start": 46353 + }, + { + "attributes": {}, + "tag": "div", + "end": 46364, + "tag_type": 2, + "start": 46358 + }, + { + "attributes": {}, + "tag": "div", + "end": 46370, + "tag_type": 2, + "start": 46364 + }, + { + "attributes": {}, + "tag": "div", + "end": 46376, + "tag_type": 2, + "start": 46370 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 46393, + "tag_type": 1, + "start": 46376 + }, + { + "start": 46393, + "end": 46401 + }, + { + "attributes": { + "class": "top" + }, + "tag": "ul", + "end": 46417, + "tag_type": 1, + "start": 46401 + }, + { + "start": 46417, + "end": 46429 + }, + { + "attributes": {}, + "tag": "li", + "end": 46433, + "tag_type": 1, + "start": 46429 + }, + { + "start": 46433, + "end": 46441 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/NewReleases.html" + }, + "tag": "a", + "end": 46496, + "tag_type": 1, + "start": 46441 + }, + { + "start": 46496, + "end": 46508 + }, + { + "attributes": {}, + "tag": "a", + "end": 46512, + "tag_type": 2, + "start": 46508 + }, + { + "attributes": {}, + "tag": "li", + "end": 46517, + "tag_type": 2, + "start": 46512 + }, + { + "start": 46517, + "end": 46529 + }, + { + "attributes": {}, + "tag": "li", + "end": 46533, + "tag_type": 1, + "start": 46529 + }, + { + "start": 46533, + "end": 46541 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 46622, + "tag_type": 1, + "start": 46541 + }, + { + "start": 46622, + "end": 46633 + }, + { + "attributes": {}, + "tag": "a", + "end": 46637, + "tag_type": 2, + "start": 46633 + }, + { + "attributes": {}, + "tag": "li", + "end": 46642, + "tag_type": 2, + "start": 46637 + }, + { + "start": 46642, + "end": 46654 + }, + { + "attributes": {}, + "tag": "li", + "end": 46658, + "tag_type": 1, + "start": 46654 + }, + { + "start": 46658, + "end": 46666 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 46747, + "tag_type": 1, + "start": 46666 + }, + { + "start": 46747, + "end": 46758 + }, + { + "attributes": {}, + "tag": "a", + "end": 46762, + "tag_type": 2, + "start": 46758 + }, + { + "attributes": {}, + "tag": "li", + "end": 46767, + "tag_type": 2, + "start": 46762 + }, + { + "start": 46767, + "end": 46779 + }, + { + "attributes": { + "class": "bottom" + }, + "tag": "li", + "end": 46798, + "tag_type": 1, + "start": 46779 + }, + { + "start": 46798, + "end": 46806 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RecentReleases.html?searchtype=genre" + }, + "tag": "a", + "end": 46891, + "tag_type": 1, + "start": 46806 + }, + { + "start": 46891, + "end": 46906 + }, + { + "attributes": {}, + "tag": "a", + "end": 46910, + "tag_type": 2, + "start": 46906 + }, + { + "attributes": {}, + "tag": "li", + "end": 46915, + "tag_type": 2, + "start": 46910 + }, + { + "start": 46915, + "end": 46927 + }, + { + "attributes": {}, + "tag": "ul", + "end": 46932, + "tag_type": 2, + "start": 46927 + }, + { + "start": 46932, + "end": 46944 + }, + { + "attributes": {}, + "tag": "ul", + "end": 46948, + "tag_type": 1, + "start": 46944 + }, + { + "start": 46948, + "end": 46960 + }, + { + "attributes": {}, + "tag": "li", + "end": 46964, + "tag_type": 1, + "start": 46960 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/996/1241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47046, + "tag_type": 1, + "start": 46964 + }, + { + "start": 47046, + "end": 47052 + }, + { + "attributes": {}, + "tag": "a", + "end": 47056, + "tag_type": 2, + "start": 47052 + }, + { + "attributes": {}, + "tag": "li", + "end": 47061, + "tag_type": 2, + "start": 47056 + }, + { + "start": 47061, + "end": 47073 + }, + { + "attributes": {}, + "tag": "li", + "end": 47077, + "tag_type": 1, + "start": 47073 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/253/333/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47158, + "tag_type": 1, + "start": 47077 + }, + { + "start": 47158, + "end": 47168 + }, + { + "attributes": {}, + "tag": "a", + "end": 47172, + "tag_type": 2, + "start": 47168 + }, + { + "attributes": {}, + "tag": "li", + "end": 47177, + "tag_type": 2, + "start": 47172 + }, + { + "start": 47177, + "end": 47189 + }, + { + "attributes": {}, + "tag": "li", + "end": 47193, + "tag_type": 1, + "start": 47189 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/248/328/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47274, + "tag_type": 1, + "start": 47193 + }, + { + "start": 47274, + "end": 47298 + }, + { + "attributes": {}, + "tag": "a", + "end": 47302, + "tag_type": 2, + "start": 47298 + }, + { + "attributes": {}, + "tag": "li", + "end": 47307, + "tag_type": 2, + "start": 47302 + }, + { + "start": 47307, + "end": 47319 + }, + { + "attributes": {}, + "tag": "li", + "end": 47323, + "tag_type": 1, + "start": 47319 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47404, + "tag_type": 1, + "start": 47323 + }, + { + "start": 47404, + "end": 47419 + }, + { + "attributes": {}, + "tag": "a", + "end": 47423, + "tag_type": 2, + "start": 47419 + }, + { + "attributes": {}, + "tag": "li", + "end": 47428, + "tag_type": 2, + "start": 47423 + }, + { + "start": 47428, + "end": 47440 + }, + { + "attributes": {}, + "tag": "li", + "end": 47444, + "tag_type": 1, + "start": 47440 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47525, + "tag_type": 1, + "start": 47444 + }, + { + "start": 47525, + "end": 47528 + }, + { + "attributes": {}, + "tag": "a", + "end": 47532, + "tag_type": 2, + "start": 47528 + }, + { + "attributes": {}, + "tag": "li", + "end": 47537, + "tag_type": 2, + "start": 47532 + }, + { + "start": 47537, + "end": 47549 + }, + { + "attributes": {}, + "tag": "li", + "end": 47553, + "tag_type": 1, + "start": 47549 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47634, + "tag_type": 1, + "start": 47553 + }, + { + "start": 47634, + "end": 47646 + }, + { + "attributes": {}, + "tag": "a", + "end": 47650, + "tag_type": 2, + "start": 47646 + }, + { + "attributes": {}, + "tag": "li", + "end": 47655, + "tag_type": 2, + "start": 47650 + }, + { + "start": 47655, + "end": 47667 + }, + { + "attributes": {}, + "tag": "li", + "end": 47671, + "tag_type": 1, + "start": 47667 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47752, + "tag_type": 1, + "start": 47671 + }, + { + "start": 47752, + "end": 47762 + }, + { + "attributes": {}, + "tag": "a", + "end": 47766, + "tag_type": 2, + "start": 47762 + }, + { + "attributes": {}, + "tag": "li", + "end": 47771, + "tag_type": 2, + "start": 47766 + }, + { + "start": 47771, + "end": 47783 + }, + { + "attributes": {}, + "tag": "li", + "end": 47787, + "tag_type": 1, + "start": 47783 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/275/355/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47868, + "tag_type": 1, + "start": 47787 + }, + { + "start": 47868, + "end": 47881 + }, + { + "attributes": {}, + "tag": "a", + "end": 47885, + "tag_type": 2, + "start": 47881 + }, + { + "attributes": {}, + "tag": "li", + "end": 47890, + "tag_type": 2, + "start": 47885 + }, + { + "start": 47890, + "end": 47902 + }, + { + "attributes": {}, + "tag": "li", + "end": 47906, + "tag_type": 1, + "start": 47902 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47987, + "tag_type": 1, + "start": 47906 + }, + { + "start": 47987, + "end": 47998 + }, + { + "attributes": {}, + "tag": "a", + "end": 48002, + "tag_type": 2, + "start": 47998 + }, + { + "attributes": {}, + "tag": "li", + "end": 48007, + "tag_type": 2, + "start": 48002 + }, + { + "start": 48007, + "end": 48019 + }, + { + "attributes": {}, + "tag": "li", + "end": 48023, + "tag_type": 1, + "start": 48019 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48104, + "tag_type": 1, + "start": 48023 + }, + { + "start": 48104, + "end": 48112 + }, + { + "attributes": {}, + "tag": "a", + "end": 48116, + "tag_type": 2, + "start": 48112 + }, + { + "attributes": {}, + "tag": "li", + "end": 48121, + "tag_type": 2, + "start": 48116 + }, + { + "start": 48121, + "end": 48133 + }, + { + "attributes": {}, + "tag": "li", + "end": 48137, + "tag_type": 1, + "start": 48133 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/295/379/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48218, + "tag_type": 1, + "start": 48137 + }, + { + "start": 48218, + "end": 48232 + }, + { + "attributes": {}, + "tag": "a", + "end": 48236, + "tag_type": 2, + "start": 48232 + }, + { + "attributes": {}, + "tag": "li", + "end": 48241, + "tag_type": 2, + "start": 48236 + }, + { + "start": 48241, + "end": 48253 + }, + { + "attributes": {}, + "tag": "li", + "end": 48257, + "tag_type": 1, + "start": 48253 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/316/402/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48338, + "tag_type": 1, + "start": 48257 + }, + { + "start": 48338, + "end": 48345 + }, + { + "attributes": {}, + "tag": "a", + "end": 48349, + "tag_type": 2, + "start": 48345 + }, + { + "attributes": {}, + "tag": "li", + "end": 48354, + "tag_type": 2, + "start": 48349 + }, + { + "start": 48354, + "end": 48366 + }, + { + "attributes": { + "class": "selected" + }, + "tag": "li", + "end": 48387, + "tag_type": 1, + "start": 48366 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre", + "class": "this" + }, + "tag": "a", + "end": 48481, + "tag_type": 1, + "start": 48387 + }, + { + "start": 48481, + "end": 48491 + }, + { + "attributes": {}, + "tag": "a", + "end": 48495, + "tag_type": 2, + "start": 48491 + }, + { + "start": 48495, + "end": 48503 + }, + { + "attributes": {}, + "tag": "ul", + "end": 48507, + "tag_type": 1, + "start": 48503 + }, + { + "start": 48507, + "end": 48519 + }, + { + "attributes": {}, + "tag": "li", + "end": 48523, + "tag_type": 1, + "start": 48519 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/319/405/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48604, + "tag_type": 1, + "start": 48523 + }, + { + "start": 48604, + "end": 48628 + }, + { + "attributes": {}, + "tag": "a", + "end": 48632, + "tag_type": 2, + "start": 48628 + }, + { + "attributes": {}, + "tag": "li", + "end": 48637, + "tag_type": 2, + "start": 48632 + }, + { + "start": 48637, + "end": 48649 + }, + { + "attributes": {}, + "tag": "li", + "end": 48653, + "tag_type": 1, + "start": 48649 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/320/406/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48734, + "tag_type": 1, + "start": 48653 + }, + { + "start": 48734, + "end": 48749 + }, + { + "attributes": {}, + "tag": "a", + "end": 48753, + "tag_type": 2, + "start": 48749 + }, + { + "attributes": {}, + "tag": "li", + "end": 48758, + "tag_type": 2, + "start": 48753 + }, + { + "start": 48758, + "end": 48770 + }, + { + "attributes": {}, + "tag": "li", + "end": 48774, + "tag_type": 1, + "start": 48770 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/949/1189/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48856, + "tag_type": 1, + "start": 48774 + }, + { + "start": 48856, + "end": 48876 + }, + { + "attributes": {}, + "tag": "a", + "end": 48880, + "tag_type": 2, + "start": 48876 + }, + { + "attributes": {}, + "tag": "li", + "end": 48885, + "tag_type": 2, + "start": 48880 + }, + { + "start": 48885, + "end": 48897 + }, + { + "attributes": { + "class": "bottom" + }, + "tag": "li", + "end": 48916, + "tag_type": 1, + "start": 48897 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/995/407/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48997, + "tag_type": 1, + "start": 48916 + }, + { + "start": 48997, + "end": 49008 + }, + { + "attributes": {}, + "tag": "a", + "end": 49012, + "tag_type": 2, + "start": 49008 + }, + { + "attributes": {}, + "tag": "li", + "end": 49017, + "tag_type": 2, + "start": 49012 + }, + { + "start": 49017, + "end": 49029 + }, + { + "attributes": {}, + "tag": "ul", + "end": 49034, + "tag_type": 2, + "start": 49029 + }, + { + "start": 49034, + "end": 49038 + }, + { + "attributes": {}, + "tag": "li", + "end": 49043, + "tag_type": 2, + "start": 49038 + }, + { + "start": 49043, + "end": 49055 + }, + { + "attributes": {}, + "tag": "li", + "end": 49059, + "tag_type": 1, + "start": 49055 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 49142, + "tag_type": 1, + "start": 49059 + }, + { + "start": 49142, + "end": 49150 + }, + { + "attributes": {}, + "tag": "a", + "end": 49154, + "tag_type": 2, + "start": 49150 + }, + { + "attributes": {}, + "tag": "li", + "end": 49159, + "tag_type": 2, + "start": 49154 + }, + { + "start": 49159, + "end": 49171 + }, + { + "attributes": {}, + "tag": "li", + "end": 49175, + "tag_type": 1, + "start": 49171 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/988/1236/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 49257, + "tag_type": 1, + "start": 49175 + }, + { + "start": 49257, + "end": 49277 + }, + { + "attributes": {}, + "tag": "a", + "end": 49281, + "tag_type": 2, + "start": 49277 + }, + { + "attributes": {}, + "tag": "li", + "end": 49286, + "tag_type": 2, + "start": 49281 + }, + { + "start": 49286, + "end": 49298 + }, + { + "attributes": {}, + "tag": "li", + "end": 49302, + "tag_type": 1, + "start": 49298 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/371/471/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 49383, + "tag_type": 1, + "start": 49302 + }, + { + "start": 49383, + "end": 49391 + }, + { + "attributes": {}, + "tag": "a", + "end": 49395, + "tag_type": 2, + "start": 49391 + }, + { + "attributes": {}, + "tag": "li", + "end": 49400, + "tag_type": 2, + "start": 49395 + }, + { + "start": 49400, + "end": 49412 + }, + { + "attributes": {}, + "tag": "ul", + "end": 49417, + "tag_type": 2, + "start": 49412 + }, + { + "start": 49417, + "end": 49421 + }, + { + "attributes": {}, + "tag": "ul", + "end": 49425, + "tag_type": 1, + "start": 49421 + }, + { + "start": 49425, + "end": 49429 + }, + { + "attributes": {}, + "tag": "li", + "end": 49433, + "tag_type": 1, + "start": 49429 + }, + { + "start": 49433, + "end": 49441 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/GenreCategories.html", + "class": "viewcats" + }, + "tag": "a", + "end": 49517, + "tag_type": 1, + "start": 49441 + }, + { + "start": 49517, + "end": 49538 + }, + { + "attributes": {}, + "tag": "a", + "end": 49542, + "tag_type": 2, + "start": 49538 + }, + { + "start": 49542, + "end": 49546 + }, + { + "attributes": {}, + "tag": "li", + "end": 49551, + "tag_type": 2, + "start": 49546 + }, + { + "attributes": {}, + "tag": "ul", + "end": 49556, + "tag_type": 2, + "start": 49551 + }, + { + "attributes": {}, + "tag": "div", + "end": 49562, + "tag_type": 2, + "start": 49556 + }, + { + "attributes": {}, + "tag": "div", + "end": 49568, + "tag_type": 2, + "start": 49562 + }, + { + "attributes": { + "class": "wrap" + }, + "tag": "div", + "end": 49586, + "tag_type": 1, + "start": 49568 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 49609, + "tag_type": 1, + "start": 49586 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 49616, + "tag_type": 1, + "start": 49609 + }, + { + "attributes": {}, + "tag": "tr", + "end": 49620, + "tag_type": 1, + "start": 49616 + }, + { + "attributes": {}, + "tag": "td", + "end": 49624, + "tag_type": 1, + "start": 49620 + }, + { + "attributes": {}, + "tag": "div", + "end": 49629, + "tag_type": 1, + "start": 49624 + }, + { + "attributes": { + "href": "/campaign.aspx?campaign=4894&cid=4089054&dpr=0", + "manual_cm_sp": "digibrick.jpg-_-LeftLandingPageBanner1-_-ELEC", + "manual_cm_re": "Left-_-LandingPageBanner1-_-digibrick.jpg" + }, + "tag": "a", + "end": 49812, + "tag_type": 1, + "start": 49629 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/LANDING_BANNERS/164402.jpg", + "alt": "Digital Camera Store brick", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 49952, + "tag_type": 1, + "start": 49812 + }, + { + "attributes": {}, + "tag": "a", + "end": 49956, + "tag_type": 2, + "start": 49952 + }, + { + "attributes": {}, + "tag": "div", + "end": 49962, + "tag_type": 2, + "start": 49956 + }, + { + "attributes": {}, + "tag": "td", + "end": 49967, + "tag_type": 2, + "start": 49962 + }, + { + "start": 49967, + "end": 49987 + }, + { + "attributes": {}, + "tag": "td", + "end": 49991, + "tag_type": 1, + "start": 49987 + }, + { + "attributes": {}, + "tag": "div", + "end": 49996, + "tag_type": 1, + "start": 49991 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/240913/2-/Promo.html?dpr=240913", + "manual_cm_sp": "High-Def_35per.jpg-_-LeftLandingPageBanner2-_-ELEC", + "manual_cm_re": "Left-_-LandingPageBanner2-_-High-Def_35per.jpg" + }, + "tag": "a", + "end": 50194, + "tag_type": 1, + "start": 49996 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/LANDING_BANNERS/31800.jpg", + "alt": "New Hi Def Technology", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 50328, + "tag_type": 1, + "start": 50194 + }, + { + "attributes": {}, + "tag": "a", + "end": 50332, + "tag_type": 2, + "start": 50328 + }, + { + "attributes": {}, + "tag": "div", + "end": 50338, + "tag_type": 2, + "start": 50332 + }, + { + "attributes": {}, + "tag": "td", + "end": 50343, + "tag_type": 2, + "start": 50338 + }, + { + "attributes": {}, + "tag": "tr", + "end": 50348, + "tag_type": 2, + "start": 50343 + }, + { + "start": 50348, + "end": 50356 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 50364, + "tag_type": 2, + "start": 50356 + }, + { + "attributes": {}, + "tag": "table", + "end": 50372, + "tag_type": 2, + "start": 50364 + }, + { + "start": 50372, + "end": 50376 + }, + { + "attributes": {}, + "tag": "div", + "end": 50382, + "tag_type": 2, + "start": 50376 + }, + { + "attributes": { + "class": "hotpick wrap" + }, + "tag": "div", + "end": 50408, + "tag_type": 1, + "start": 50382 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 50429, + "tag_type": 1, + "start": 50408 + }, + { + "attributes": {}, + "tag": "div", + "end": 50434, + "tag_type": 1, + "start": 50429 + }, + { + "attributes": {}, + "tag": "div", + "end": 50439, + "tag_type": 1, + "start": 50434 + }, + { + "start": 50439, + "end": 50443 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/HotPicksList.html?searchtype=genre" + }, + "tag": "a", + "end": 50526, + "tag_type": 1, + "start": 50443 + }, + { + "start": 50526, + "end": 50534 + }, + { + "attributes": {}, + "tag": "h2", + "end": 50538, + "tag_type": 1, + "start": 50534 + }, + { + "start": 50538, + "end": 50560 + }, + { + "attributes": {}, + "tag": "h2", + "end": 50565, + "tag_type": 2, + "start": 50560 + }, + { + "attributes": {}, + "tag": "a", + "end": 50569, + "tag_type": 2, + "start": 50565 + }, + { + "attributes": {}, + "tag": "div", + "end": 50575, + "tag_type": 2, + "start": 50569 + }, + { + "attributes": {}, + "tag": "div", + "end": 50581, + "tag_type": 2, + "start": 50575 + }, + { + "attributes": {}, + "tag": "div", + "end": 50587, + "tag_type": 2, + "start": 50581 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 50604, + "tag_type": 1, + "start": 50587 + }, + { + "attributes": {}, + "tag": "h5", + "end": 50608, + "tag_type": 1, + "start": 50604 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 50725, + "tag_type": 1, + "start": 50608 + }, + { + "start": 50725, + "end": 50797 + }, + { + "attributes": {}, + "tag": "a", + "end": 50801, + "tag_type": 2, + "start": 50797 + }, + { + "attributes": {}, + "tag": "h5", + "end": 50806, + "tag_type": 2, + "start": 50801 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 50829, + "tag_type": 1, + "start": 50806 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 50836, + "tag_type": 1, + "start": 50829 + }, + { + "attributes": {}, + "tag": "tr", + "end": 50840, + "tag_type": 1, + "start": 50836 + }, + { + "attributes": {}, + "tag": "td", + "end": 50844, + "tag_type": 1, + "start": 50840 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 50863, + "tag_type": 1, + "start": 50844 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html", + "cssclass": "sideimagelink" + }, + "tag": "a", + "end": 51005, + "tag_type": 1, + "start": 50863 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8986397s.jpg", + "alt": "Samsung Series 4 450 32" LE32B450 / HD Ready / Freeview / LCD TV (Black)", + "style": "border-width: 0px; height: 60px; width: 60px;", + "class": "sideimageline" + }, + "tag": "img", + "end": 51230, + "tag_type": 1, + "start": 51005 + }, + { + "attributes": {}, + "tag": "a", + "end": 51234, + "tag_type": 2, + "start": 51230 + }, + { + "attributes": {}, + "tag": "div", + "end": 51240, + "tag_type": 2, + "start": 51234 + }, + { + "attributes": {}, + "tag": "td", + "end": 51245, + "tag_type": 2, + "start": 51240 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 51262, + "tag_type": 1, + "start": 51245 + }, + { + "attributes": {}, + "tag": "h6", + "end": 51266, + "tag_type": 1, + "start": 51262 + }, + { + "start": 51266, + "end": 51273 + }, + { + "attributes": {}, + "tag": "span", + "end": 51279, + "tag_type": 1, + "start": 51273 + }, + { + "start": 51279, + "end": 51293 + }, + { + "attributes": {}, + "tag": "span", + "end": 51300, + "tag_type": 2, + "start": 51293 + }, + { + "attributes": {}, + "tag": "h6", + "end": 51305, + "tag_type": 2, + "start": 51300 + }, + { + "attributes": { + "class": "saving" + }, + "tag": "p", + "end": 51323, + "tag_type": 1, + "start": 51305 + }, + { + "start": 51323, + "end": 51327 + }, + { + "attributes": {}, + "tag": "br", + "end": 51331, + "tag_type": 1, + "start": 51327 + }, + { + "attributes": { + "class": "rrp" + }, + "tag": "span", + "end": 51349, + "tag_type": 1, + "start": 51331 + }, + { + "start": 51349, + "end": 51356 + }, + { + "attributes": {}, + "tag": "span", + "end": 51363, + "tag_type": 2, + "start": 51356 + }, + { + "attributes": {}, + "tag": "br", + "end": 51367, + "tag_type": 1, + "start": 51363 + }, + { + "start": 51367, + "end": 51376 + }, + { + "attributes": {}, + "tag": "br", + "end": 51380, + "tag_type": 1, + "start": 51376 + }, + { + "attributes": { + "class": "drop" + }, + "tag": "span", + "end": 51399, + "tag_type": 1, + "start": 51380 + }, + { + "start": 51399, + "end": 51406 + }, + { + "attributes": {}, + "tag": "span", + "end": 51413, + "tag_type": 2, + "start": 51406 + }, + { + "attributes": {}, + "tag": "p", + "end": 51417, + "tag_type": 2, + "start": 51413 + }, + { + "attributes": {}, + "tag": "td", + "end": 51422, + "tag_type": 2, + "start": 51417 + }, + { + "attributes": {}, + "tag": "tr", + "end": 51427, + "tag_type": 2, + "start": 51422 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 51435, + "tag_type": 2, + "start": 51427 + }, + { + "attributes": {}, + "tag": "table", + "end": 51443, + "tag_type": 2, + "start": 51435 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 51459, + "tag_type": 1, + "start": 51443 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/HotPicksList.html?searchtype=genre" + }, + "tag": "a", + "end": 51542, + "tag_type": 1, + "start": 51459 + }, + { + "start": 51542, + "end": 51551 + }, + { + "attributes": {}, + "tag": "span", + "end": 51557, + "tag_type": 1, + "start": 51551 + }, + { + "start": 51557, + "end": 51558 + }, + { + "attributes": {}, + "tag": "span", + "end": 51565, + "tag_type": 2, + "start": 51558 + }, + { + "start": 51565, + "end": 51566 + }, + { + "attributes": {}, + "tag": "a", + "end": 51570, + "tag_type": 2, + "start": 51566 + }, + { + "attributes": {}, + "tag": "p", + "end": 51574, + "tag_type": 2, + "start": 51570 + }, + { + "attributes": {}, + "tag": "div", + "end": 51580, + "tag_type": 2, + "start": 51574 + }, + { + "attributes": {}, + "tag": "div", + "end": 51586, + "tag_type": 2, + "start": 51580 + }, + { + "attributes": { + "class": "recentlyviewed wrap" + }, + "tag": "div", + "end": 51619, + "tag_type": 1, + "start": 51586 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 51640, + "tag_type": 1, + "start": 51619 + }, + { + "attributes": {}, + "tag": "div", + "end": 51645, + "tag_type": 1, + "start": 51640 + }, + { + "attributes": {}, + "tag": "div", + "end": 51650, + "tag_type": 1, + "start": 51645 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51654, + "tag_type": 1, + "start": 51650 + }, + { + "start": 51654, + "end": 51675 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51680, + "tag_type": 2, + "start": 51675 + }, + { + "attributes": {}, + "tag": "div", + "end": 51686, + "tag_type": 2, + "start": 51680 + }, + { + "attributes": {}, + "tag": "div", + "end": 51692, + "tag_type": 2, + "start": 51686 + }, + { + "attributes": {}, + "tag": "div", + "end": 51698, + "tag_type": 2, + "start": 51692 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 51715, + "tag_type": 1, + "start": 51698 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51719, + "tag_type": 1, + "start": 51715 + }, + { + "start": 51719, + "end": 51732 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51737, + "tag_type": 2, + "start": 51732 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51741, + "tag_type": 1, + "start": 51737 + }, + { + "attributes": {}, + "tag": "li", + "end": 51745, + "tag_type": 1, + "start": 51741 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 51862, + "tag_type": 1, + "start": 51745 + }, + { + "start": 51862, + "end": 51934 + }, + { + "attributes": {}, + "tag": "a", + "end": 51938, + "tag_type": 2, + "start": 51934 + }, + { + "attributes": {}, + "tag": "li", + "end": 51943, + "tag_type": 2, + "start": 51938 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51948, + "tag_type": 2, + "start": 51943 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 51964, + "tag_type": 1, + "start": 51948 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/Product.html" + }, + "tag": "a", + "end": 52025, + "tag_type": 1, + "start": 51964 + }, + { + "start": 52025, + "end": 52041 + }, + { + "attributes": { + "class": "orangepanel" + }, + "tag": "span", + "end": 52067, + "tag_type": 1, + "start": 52041 + }, + { + "start": 52067, + "end": 52068 + }, + { + "attributes": {}, + "tag": "span", + "end": 52075, + "tag_type": 2, + "start": 52068 + }, + { + "attributes": {}, + "tag": "a", + "end": 52079, + "tag_type": 2, + "start": 52075 + }, + { + "attributes": {}, + "tag": "p", + "end": 52083, + "tag_type": 2, + "start": 52079 + }, + { + "attributes": {}, + "tag": "div", + "end": 52089, + "tag_type": 2, + "start": 52083 + }, + { + "attributes": {}, + "tag": "div", + "end": 52095, + "tag_type": 2, + "start": 52089 + }, + { + "attributes": { + "class": "charts wrap", + "id": "charts" + }, + "tag": "div", + "end": 52132, + "tag_type": 1, + "start": 52095 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 52153, + "tag_type": 1, + "start": 52132 + }, + { + "attributes": {}, + "tag": "div", + "end": 52158, + "tag_type": 1, + "start": 52153 + }, + { + "attributes": {}, + "tag": "div", + "end": 52163, + "tag_type": 1, + "start": 52158 + }, + { + "attributes": {}, + "tag": "h2", + "end": 52167, + "tag_type": 1, + "start": 52163 + }, + { + "start": 52167, + "end": 52173 + }, + { + "attributes": {}, + "tag": "h2", + "end": 52178, + "tag_type": 2, + "start": 52173 + }, + { + "attributes": {}, + "tag": "div", + "end": 52184, + "tag_type": 2, + "start": 52178 + }, + { + "attributes": {}, + "tag": "div", + "end": 52190, + "tag_type": 2, + "start": 52184 + }, + { + "attributes": {}, + "tag": "div", + "end": 52196, + "tag_type": 2, + "start": 52190 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 52213, + "tag_type": 1, + "start": 52196 + }, + { + "attributes": {}, + "tag": "ul", + "end": 52217, + "tag_type": 1, + "start": 52213 + }, + { + "attributes": {}, + "tag": "li", + "end": 52221, + "tag_type": 1, + "start": 52217 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/TopSellers.html" + }, + "tag": "a", + "end": 52275, + "tag_type": 1, + "start": 52221 + }, + { + "start": 52275, + "end": 52286 + }, + { + "attributes": {}, + "tag": "a", + "end": 52290, + "tag_type": 2, + "start": 52286 + }, + { + "attributes": {}, + "tag": "ul", + "end": 52294, + "tag_type": 1, + "start": 52290 + }, + { + "attributes": { + "class": "charts-topsellers" + }, + "tag": "li", + "end": 52324, + "tag_type": 1, + "start": 52294 + }, + { + "attributes": {}, + "tag": "h3", + "end": 52328, + "tag_type": 1, + "start": 52324 + }, + { + "start": 52328, + "end": 52339 + }, + { + "attributes": {}, + "tag": "h3", + "end": 52344, + "tag_type": 2, + "start": 52339 + }, + { + "attributes": {}, + "tag": "li", + "end": 52349, + "tag_type": 2, + "start": 52344 + }, + { + "attributes": {}, + "tag": "li", + "end": 52353, + "tag_type": 1, + "start": 52349 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/TopSellers.html" + }, + "tag": "a", + "end": 52391, + "tag_type": 1, + "start": 52353 + }, + { + "start": 52391, + "end": 52394 + }, + { + "attributes": {}, + "tag": "a", + "end": 52398, + "tag_type": 2, + "start": 52394 + }, + { + "attributes": {}, + "tag": "li", + "end": 52403, + "tag_type": 2, + "start": 52398 + }, + { + "attributes": {}, + "tag": "li", + "end": 52407, + "tag_type": 1, + "start": 52403 + }, + { + "attributes": { + "href": "/Music/CD/6-/TopSellers.html" + }, + "tag": "a", + "end": 52446, + "tag_type": 1, + "start": 52407 + }, + { + "start": 52446, + "end": 52451 + }, + { + "attributes": {}, + "tag": "a", + "end": 52455, + "tag_type": 2, + "start": 52451 + }, + { + "attributes": {}, + "tag": "li", + "end": 52460, + "tag_type": 2, + "start": 52455 + }, + { + "attributes": {}, + "tag": "li", + "end": 52464, + "tag_type": 1, + "start": 52460 + }, + { + "attributes": { + "href": "/Books/Books/6-/TopSellers.html" + }, + "tag": "a", + "end": 52506, + "tag_type": 1, + "start": 52464 + }, + { + "start": 52506, + "end": 52511 + }, + { + "attributes": {}, + "tag": "a", + "end": 52515, + "tag_type": 2, + "start": 52511 + }, + { + "attributes": {}, + "tag": "li", + "end": 52520, + "tag_type": 2, + "start": 52515 + }, + { + "attributes": {}, + "tag": "li", + "end": 52524, + "tag_type": 1, + "start": 52520 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/TopSellers.html" + }, + "tag": "a", + "end": 52575, + "tag_type": 1, + "start": 52524 + }, + { + "start": 52575, + "end": 52582 + }, + { + "attributes": {}, + "tag": "a", + "end": 52586, + "tag_type": 2, + "start": 52582 + }, + { + "attributes": {}, + "tag": "li", + "end": 52591, + "tag_type": 2, + "start": 52586 + }, + { + "attributes": {}, + "tag": "li", + "end": 52595, + "tag_type": 1, + "start": 52591 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/TopSellers.html" + }, + "tag": "a", + "end": 52642, + "tag_type": 1, + "start": 52595 + }, + { + "start": 52642, + "end": 52652 + }, + { + "attributes": {}, + "tag": "a", + "end": 52656, + "tag_type": 2, + "start": 52652 + }, + { + "attributes": {}, + "tag": "li", + "end": 52661, + "tag_type": 2, + "start": 52656 + }, + { + "attributes": {}, + "tag": "li", + "end": 52665, + "tag_type": 1, + "start": 52661 + }, + { + "attributes": { + "href": "/Books/Calendars/6-/TopSellers.html" + }, + "tag": "a", + "end": 52711, + "tag_type": 1, + "start": 52665 + }, + { + "start": 52711, + "end": 52720 + }, + { + "attributes": {}, + "tag": "a", + "end": 52724, + "tag_type": 2, + "start": 52720 + }, + { + "attributes": {}, + "tag": "li", + "end": 52729, + "tag_type": 2, + "start": 52724 + }, + { + "attributes": {}, + "tag": "li", + "end": 52733, + "tag_type": 1, + "start": 52729 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/TopSellers.html" + }, + "tag": "a", + "end": 52774, + "tag_type": 1, + "start": 52733 + }, + { + "start": 52774, + "end": 52784 + }, + { + "attributes": {}, + "tag": "a", + "end": 52788, + "tag_type": 2, + "start": 52784 + }, + { + "attributes": {}, + "tag": "li", + "end": 52793, + "tag_type": 2, + "start": 52788 + }, + { + "attributes": {}, + "tag": "li", + "end": 52797, + "tag_type": 1, + "start": 52793 + }, + { + "attributes": { + "href": "/Games/DS/6-/TopSellers.html" + }, + "tag": "a", + "end": 52836, + "tag_type": 1, + "start": 52797 + }, + { + "start": 52836, + "end": 52844 + }, + { + "attributes": {}, + "tag": "a", + "end": 52848, + "tag_type": 2, + "start": 52844 + }, + { + "attributes": {}, + "tag": "li", + "end": 52853, + "tag_type": 2, + "start": 52848 + }, + { + "attributes": {}, + "tag": "li", + "end": 52857, + "tag_type": 1, + "start": 52853 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/TopSellers.html" + }, + "tag": "a", + "end": 52906, + "tag_type": 1, + "start": 52857 + }, + { + "start": 52906, + "end": 52915 + }, + { + "attributes": {}, + "tag": "a", + "end": 52919, + "tag_type": 2, + "start": 52915 + }, + { + "attributes": {}, + "tag": "li", + "end": 52924, + "tag_type": 2, + "start": 52919 + }, + { + "attributes": {}, + "tag": "li", + "end": 52928, + "tag_type": 1, + "start": 52924 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/TopSellers.html" + }, + "tag": "a", + "end": 52980, + "tag_type": 1, + "start": 52928 + }, + { + "start": 52980, + "end": 52989 + }, + { + "attributes": {}, + "tag": "a", + "end": 52993, + "tag_type": 2, + "start": 52989 + }, + { + "attributes": {}, + "tag": "li", + "end": 52998, + "tag_type": 2, + "start": 52993 + }, + { + "attributes": {}, + "tag": "li", + "end": 53002, + "tag_type": 1, + "start": 52998 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/TopSellers.html" + }, + "tag": "a", + "end": 53047, + "tag_type": 1, + "start": 53002 + }, + { + "start": 53047, + "end": 53061 + }, + { + "attributes": {}, + "tag": "a", + "end": 53065, + "tag_type": 2, + "start": 53061 + }, + { + "attributes": {}, + "tag": "li", + "end": 53070, + "tag_type": 2, + "start": 53065 + }, + { + "attributes": {}, + "tag": "li", + "end": 53074, + "tag_type": 1, + "start": 53070 + }, + { + "attributes": { + "href": "/Games/PC/6-/TopSellers.html" + }, + "tag": "a", + "end": 53113, + "tag_type": 1, + "start": 53074 + }, + { + "start": 53113, + "end": 53121 + }, + { + "attributes": {}, + "tag": "a", + "end": 53125, + "tag_type": 2, + "start": 53121 + }, + { + "attributes": {}, + "tag": "li", + "end": 53130, + "tag_type": 2, + "start": 53125 + }, + { + "attributes": {}, + "tag": "ul", + "end": 53135, + "tag_type": 2, + "start": 53130 + }, + { + "attributes": {}, + "tag": "li", + "end": 53140, + "tag_type": 2, + "start": 53135 + }, + { + "attributes": {}, + "tag": "li", + "end": 53144, + "tag_type": 1, + "start": 53140 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53201, + "tag_type": 1, + "start": 53144 + }, + { + "start": 53201, + "end": 53212 + }, + { + "attributes": {}, + "tag": "a", + "end": 53216, + "tag_type": 2, + "start": 53212 + }, + { + "attributes": {}, + "tag": "ul", + "end": 53220, + "tag_type": 1, + "start": 53216 + }, + { + "attributes": { + "class": "charts-comingsoon" + }, + "tag": "li", + "end": 53250, + "tag_type": 1, + "start": 53220 + }, + { + "attributes": {}, + "tag": "h3", + "end": 53254, + "tag_type": 1, + "start": 53250 + }, + { + "start": 53254, + "end": 53265 + }, + { + "attributes": {}, + "tag": "h3", + "end": 53270, + "tag_type": 2, + "start": 53265 + }, + { + "attributes": {}, + "tag": "li", + "end": 53275, + "tag_type": 2, + "start": 53270 + }, + { + "attributes": {}, + "tag": "li", + "end": 53279, + "tag_type": 1, + "start": 53275 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53320, + "tag_type": 1, + "start": 53279 + }, + { + "start": 53320, + "end": 53323 + }, + { + "attributes": {}, + "tag": "a", + "end": 53327, + "tag_type": 2, + "start": 53323 + }, + { + "attributes": {}, + "tag": "li", + "end": 53332, + "tag_type": 2, + "start": 53327 + }, + { + "attributes": {}, + "tag": "li", + "end": 53336, + "tag_type": 1, + "start": 53332 + }, + { + "attributes": { + "href": "/Music/CD/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53378, + "tag_type": 1, + "start": 53336 + }, + { + "start": 53378, + "end": 53383 + }, + { + "attributes": {}, + "tag": "a", + "end": 53387, + "tag_type": 2, + "start": 53383 + }, + { + "attributes": {}, + "tag": "li", + "end": 53392, + "tag_type": 2, + "start": 53387 + }, + { + "attributes": {}, + "tag": "li", + "end": 53396, + "tag_type": 1, + "start": 53392 + }, + { + "attributes": { + "href": "/Music/MP3-Download/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53448, + "tag_type": 1, + "start": 53396 + }, + { + "start": 53448, + "end": 53465 + }, + { + "attributes": {}, + "tag": "a", + "end": 53469, + "tag_type": 2, + "start": 53465 + }, + { + "attributes": {}, + "tag": "li", + "end": 53474, + "tag_type": 2, + "start": 53469 + }, + { + "attributes": {}, + "tag": "li", + "end": 53478, + "tag_type": 1, + "start": 53474 + }, + { + "attributes": { + "href": "/Music/MP3-Download-Album/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53536, + "tag_type": 1, + "start": 53478 + }, + { + "start": 53536, + "end": 53555 + }, + { + "attributes": {}, + "tag": "a", + "end": 53559, + "tag_type": 2, + "start": 53555 + }, + { + "attributes": {}, + "tag": "li", + "end": 53564, + "tag_type": 2, + "start": 53559 + }, + { + "attributes": {}, + "tag": "li", + "end": 53568, + "tag_type": 1, + "start": 53564 + }, + { + "attributes": { + "href": "/Music/MP3-Download-Track/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53626, + "tag_type": 1, + "start": 53568 + }, + { + "start": 53626, + "end": 53645 + }, + { + "attributes": {}, + "tag": "a", + "end": 53649, + "tag_type": 2, + "start": 53645 + }, + { + "attributes": {}, + "tag": "li", + "end": 53654, + "tag_type": 2, + "start": 53649 + }, + { + "attributes": {}, + "tag": "li", + "end": 53658, + "tag_type": 1, + "start": 53654 + }, + { + "attributes": { + "href": "/Books/Books/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53703, + "tag_type": 1, + "start": 53658 + }, + { + "start": 53703, + "end": 53708 + }, + { + "attributes": {}, + "tag": "a", + "end": 53712, + "tag_type": 2, + "start": 53708 + }, + { + "attributes": {}, + "tag": "li", + "end": 53717, + "tag_type": 2, + "start": 53712 + }, + { + "attributes": {}, + "tag": "li", + "end": 53721, + "tag_type": 1, + "start": 53717 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53771, + "tag_type": 1, + "start": 53721 + }, + { + "start": 53771, + "end": 53781 + }, + { + "attributes": {}, + "tag": "a", + "end": 53785, + "tag_type": 2, + "start": 53781 + }, + { + "attributes": {}, + "tag": "li", + "end": 53790, + "tag_type": 2, + "start": 53785 + }, + { + "attributes": {}, + "tag": "li", + "end": 53794, + "tag_type": 1, + "start": 53790 + }, + { + "attributes": { + "href": "/Books/Calendars/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53843, + "tag_type": 1, + "start": 53794 + }, + { + "start": 53843, + "end": 53852 + }, + { + "attributes": {}, + "tag": "a", + "end": 53856, + "tag_type": 2, + "start": 53852 + }, + { + "attributes": {}, + "tag": "li", + "end": 53861, + "tag_type": 2, + "start": 53856 + }, + { + "attributes": {}, + "tag": "li", + "end": 53865, + "tag_type": 1, + "start": 53861 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53909, + "tag_type": 1, + "start": 53865 + }, + { + "start": 53909, + "end": 53919 + }, + { + "attributes": {}, + "tag": "a", + "end": 53923, + "tag_type": 2, + "start": 53919 + }, + { + "attributes": {}, + "tag": "li", + "end": 53928, + "tag_type": 2, + "start": 53923 + }, + { + "attributes": {}, + "tag": "li", + "end": 53932, + "tag_type": 1, + "start": 53928 + }, + { + "attributes": { + "href": "/Games/Xbox360/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53979, + "tag_type": 1, + "start": 53932 + }, + { + "start": 53979, + "end": 53993 + }, + { + "attributes": {}, + "tag": "a", + "end": 53997, + "tag_type": 2, + "start": 53993 + }, + { + "attributes": {}, + "tag": "li", + "end": 54002, + "tag_type": 2, + "start": 53997 + }, + { + "attributes": {}, + "tag": "li", + "end": 54006, + "tag_type": 1, + "start": 54002 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54058, + "tag_type": 1, + "start": 54006 + }, + { + "start": 54058, + "end": 54067 + }, + { + "attributes": {}, + "tag": "a", + "end": 54071, + "tag_type": 2, + "start": 54067 + }, + { + "attributes": {}, + "tag": "li", + "end": 54076, + "tag_type": 2, + "start": 54071 + }, + { + "attributes": {}, + "tag": "li", + "end": 54080, + "tag_type": 1, + "start": 54076 + }, + { + "attributes": { + "href": "/Games/PSP/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54123, + "tag_type": 1, + "start": 54080 + }, + { + "start": 54123, + "end": 54132 + }, + { + "attributes": {}, + "tag": "a", + "end": 54136, + "tag_type": 2, + "start": 54132 + }, + { + "attributes": {}, + "tag": "li", + "end": 54141, + "tag_type": 2, + "start": 54136 + }, + { + "attributes": {}, + "tag": "li", + "end": 54145, + "tag_type": 1, + "start": 54141 + }, + { + "attributes": { + "href": "/Games/DS/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54187, + "tag_type": 1, + "start": 54145 + }, + { + "start": 54187, + "end": 54195 + }, + { + "attributes": {}, + "tag": "a", + "end": 54199, + "tag_type": 2, + "start": 54195 + }, + { + "attributes": {}, + "tag": "li", + "end": 54204, + "tag_type": 2, + "start": 54199 + }, + { + "attributes": {}, + "tag": "li", + "end": 54208, + "tag_type": 1, + "start": 54204 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54263, + "tag_type": 1, + "start": 54208 + }, + { + "start": 54263, + "end": 54272 + }, + { + "attributes": {}, + "tag": "a", + "end": 54276, + "tag_type": 2, + "start": 54272 + }, + { + "attributes": {}, + "tag": "li", + "end": 54281, + "tag_type": 2, + "start": 54276 + }, + { + "attributes": {}, + "tag": "li", + "end": 54285, + "tag_type": 1, + "start": 54281 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54333, + "tag_type": 1, + "start": 54285 + }, + { + "start": 54333, + "end": 54347 + }, + { + "attributes": {}, + "tag": "a", + "end": 54351, + "tag_type": 2, + "start": 54347 + }, + { + "attributes": {}, + "tag": "li", + "end": 54356, + "tag_type": 2, + "start": 54351 + }, + { + "attributes": {}, + "tag": "li", + "end": 54360, + "tag_type": 1, + "start": 54356 + }, + { + "attributes": { + "href": "/Games/PC/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54402, + "tag_type": 1, + "start": 54360 + }, + { + "start": 54402, + "end": 54410 + }, + { + "attributes": {}, + "tag": "a", + "end": 54414, + "tag_type": 2, + "start": 54410 + }, + { + "attributes": {}, + "tag": "li", + "end": 54419, + "tag_type": 2, + "start": 54414 + }, + { + "attributes": {}, + "tag": "li", + "end": 54423, + "tag_type": 1, + "start": 54419 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 54472, + "tag_type": 1, + "start": 54423 + }, + { + "start": 54472, + "end": 54479 + }, + { + "attributes": {}, + "tag": "a", + "end": 54483, + "tag_type": 2, + "start": 54479 + }, + { + "attributes": {}, + "tag": "li", + "end": 54488, + "tag_type": 2, + "start": 54483 + }, + { + "attributes": {}, + "tag": "ul", + "end": 54493, + "tag_type": 2, + "start": 54488 + }, + { + "attributes": {}, + "tag": "li", + "end": 54498, + "tag_type": 2, + "start": 54493 + }, + { + "attributes": {}, + "tag": "li", + "end": 54502, + "tag_type": 1, + "start": 54498 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54560, + "tag_type": 1, + "start": 54502 + }, + { + "start": 54560, + "end": 54575 + }, + { + "attributes": {}, + "tag": "a", + "end": 54579, + "tag_type": 2, + "start": 54575 + }, + { + "attributes": {}, + "tag": "ul", + "end": 54583, + "tag_type": 1, + "start": 54579 + }, + { + "attributes": { + "class": "charts-newreleases" + }, + "tag": "li", + "end": 54614, + "tag_type": 1, + "start": 54583 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54618, + "tag_type": 1, + "start": 54614 + }, + { + "start": 54618, + "end": 54630 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54635, + "tag_type": 2, + "start": 54630 + }, + { + "attributes": {}, + "tag": "li", + "end": 54640, + "tag_type": 2, + "start": 54635 + }, + { + "attributes": {}, + "tag": "li", + "end": 54644, + "tag_type": 1, + "start": 54640 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54686, + "tag_type": 1, + "start": 54644 + }, + { + "start": 54686, + "end": 54689 + }, + { + "attributes": {}, + "tag": "a", + "end": 54693, + "tag_type": 2, + "start": 54689 + }, + { + "attributes": {}, + "tag": "li", + "end": 54698, + "tag_type": 2, + "start": 54693 + }, + { + "attributes": {}, + "tag": "li", + "end": 54702, + "tag_type": 1, + "start": 54698 + }, + { + "attributes": { + "href": "/Music/CD/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54745, + "tag_type": 1, + "start": 54702 + }, + { + "start": 54745, + "end": 54750 + }, + { + "attributes": {}, + "tag": "a", + "end": 54754, + "tag_type": 2, + "start": 54750 + }, + { + "attributes": {}, + "tag": "li", + "end": 54759, + "tag_type": 2, + "start": 54754 + }, + { + "attributes": {}, + "tag": "li", + "end": 54763, + "tag_type": 1, + "start": 54759 + }, + { + "attributes": { + "href": "/Books/Books/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54809, + "tag_type": 1, + "start": 54763 + }, + { + "start": 54809, + "end": 54814 + }, + { + "attributes": {}, + "tag": "a", + "end": 54818, + "tag_type": 2, + "start": 54814 + }, + { + "attributes": {}, + "tag": "li", + "end": 54823, + "tag_type": 2, + "start": 54818 + }, + { + "attributes": {}, + "tag": "li", + "end": 54827, + "tag_type": 1, + "start": 54823 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54878, + "tag_type": 1, + "start": 54827 + }, + { + "start": 54878, + "end": 54888 + }, + { + "attributes": {}, + "tag": "a", + "end": 54892, + "tag_type": 2, + "start": 54888 + }, + { + "attributes": {}, + "tag": "li", + "end": 54897, + "tag_type": 2, + "start": 54892 + }, + { + "attributes": {}, + "tag": "li", + "end": 54901, + "tag_type": 1, + "start": 54897 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54946, + "tag_type": 1, + "start": 54901 + }, + { + "start": 54946, + "end": 54956 + }, + { + "attributes": {}, + "tag": "a", + "end": 54960, + "tag_type": 2, + "start": 54956 + }, + { + "attributes": {}, + "tag": "li", + "end": 54965, + "tag_type": 2, + "start": 54960 + }, + { + "attributes": {}, + "tag": "li", + "end": 54969, + "tag_type": 1, + "start": 54965 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/RecentReleases.html" + }, + "tag": "a", + "end": 55022, + "tag_type": 1, + "start": 54969 + }, + { + "start": 55022, + "end": 55031 + }, + { + "attributes": {}, + "tag": "a", + "end": 55035, + "tag_type": 2, + "start": 55031 + }, + { + "attributes": {}, + "tag": "li", + "end": 55040, + "tag_type": 2, + "start": 55035 + }, + { + "attributes": {}, + "tag": "li", + "end": 55044, + "tag_type": 1, + "start": 55040 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/RecentReleases.html" + }, + "tag": "a", + "end": 55100, + "tag_type": 1, + "start": 55044 + }, + { + "start": 55100, + "end": 55109 + }, + { + "attributes": {}, + "tag": "a", + "end": 55113, + "tag_type": 2, + "start": 55109 + }, + { + "attributes": {}, + "tag": "li", + "end": 55118, + "tag_type": 2, + "start": 55113 + }, + { + "attributes": {}, + "tag": "li", + "end": 55122, + "tag_type": 1, + "start": 55118 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/RecentReleases.html" + }, + "tag": "a", + "end": 55171, + "tag_type": 1, + "start": 55122 + }, + { + "start": 55171, + "end": 55185 + }, + { + "attributes": {}, + "tag": "a", + "end": 55189, + "tag_type": 2, + "start": 55185 + }, + { + "attributes": {}, + "tag": "li", + "end": 55194, + "tag_type": 2, + "start": 55189 + }, + { + "attributes": {}, + "tag": "li", + "end": 55198, + "tag_type": 1, + "start": 55194 + }, + { + "attributes": { + "href": "/Games/PC/6-/RecentReleases.html" + }, + "tag": "a", + "end": 55241, + "tag_type": 1, + "start": 55198 + }, + { + "start": 55241, + "end": 55249 + }, + { + "attributes": {}, + "tag": "a", + "end": 55253, + "tag_type": 2, + "start": 55249 + }, + { + "attributes": {}, + "tag": "li", + "end": 55258, + "tag_type": 2, + "start": 55253 + }, + { + "attributes": {}, + "tag": "li", + "end": 55262, + "tag_type": 1, + "start": 55258 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RecentReleases.html" + }, + "tag": "a", + "end": 55312, + "tag_type": 1, + "start": 55262 + }, + { + "start": 55312, + "end": 55319 + }, + { + "attributes": {}, + "tag": "a", + "end": 55323, + "tag_type": 2, + "start": 55319 + }, + { + "attributes": {}, + "tag": "li", + "end": 55328, + "tag_type": 2, + "start": 55323 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55333, + "tag_type": 2, + "start": 55328 + }, + { + "attributes": {}, + "tag": "li", + "end": 55338, + "tag_type": 2, + "start": 55333 + }, + { + "attributes": {}, + "tag": "li", + "end": 55342, + "tag_type": 1, + "start": 55338 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 55485, + "tag_type": 1, + "start": 55342 + }, + { + "start": 55485, + "end": 55492 + }, + { + "attributes": {}, + "tag": "a", + "end": 55496, + "tag_type": 2, + "start": 55492 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55500, + "tag_type": 1, + "start": 55496 + }, + { + "attributes": { + "class": "charts-top100" + }, + "tag": "li", + "end": 55526, + "tag_type": 1, + "start": 55500 + }, + { + "attributes": {}, + "tag": "h3", + "end": 55530, + "tag_type": 1, + "start": 55526 + }, + { + "start": 55530, + "end": 55537 + }, + { + "attributes": {}, + "tag": "h3", + "end": 55542, + "tag_type": 2, + "start": 55537 + }, + { + "attributes": {}, + "tag": "li", + "end": 55547, + "tag_type": 2, + "start": 55542 + }, + { + "attributes": {}, + "tag": "li", + "end": 55551, + "tag_type": 1, + "start": 55547 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/Top100.html" + }, + "tag": "a", + "end": 55585, + "tag_type": 1, + "start": 55551 + }, + { + "start": 55585, + "end": 55588 + }, + { + "attributes": {}, + "tag": "a", + "end": 55592, + "tag_type": 2, + "start": 55588 + }, + { + "attributes": {}, + "tag": "li", + "end": 55597, + "tag_type": 2, + "start": 55592 + }, + { + "attributes": {}, + "tag": "li", + "end": 55601, + "tag_type": 1, + "start": 55597 + }, + { + "attributes": { + "href": "/Music/CD/6-/Top100.html" + }, + "tag": "a", + "end": 55636, + "tag_type": 1, + "start": 55601 + }, + { + "start": 55636, + "end": 55641 + }, + { + "attributes": {}, + "tag": "a", + "end": 55645, + "tag_type": 2, + "start": 55641 + }, + { + "attributes": {}, + "tag": "li", + "end": 55650, + "tag_type": 2, + "start": 55645 + }, + { + "attributes": {}, + "tag": "li", + "end": 55654, + "tag_type": 1, + "start": 55650 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/Top100.html" + }, + "tag": "a", + "end": 55691, + "tag_type": 1, + "start": 55654 + }, + { + "start": 55691, + "end": 55701 + }, + { + "attributes": {}, + "tag": "a", + "end": 55705, + "tag_type": 2, + "start": 55701 + }, + { + "attributes": {}, + "tag": "li", + "end": 55710, + "tag_type": 2, + "start": 55705 + }, + { + "attributes": {}, + "tag": "li", + "end": 55714, + "tag_type": 1, + "start": 55710 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/Top100.html" + }, + "tag": "a", + "end": 55759, + "tag_type": 1, + "start": 55714 + }, + { + "start": 55759, + "end": 55768 + }, + { + "attributes": {}, + "tag": "a", + "end": 55772, + "tag_type": 2, + "start": 55768 + }, + { + "attributes": {}, + "tag": "li", + "end": 55777, + "tag_type": 2, + "start": 55772 + }, + { + "attributes": {}, + "tag": "li", + "end": 55781, + "tag_type": 1, + "start": 55777 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/Top100.html" + }, + "tag": "a", + "end": 55829, + "tag_type": 1, + "start": 55781 + }, + { + "start": 55829, + "end": 55838 + }, + { + "attributes": {}, + "tag": "a", + "end": 55842, + "tag_type": 2, + "start": 55838 + }, + { + "attributes": {}, + "tag": "li", + "end": 55847, + "tag_type": 2, + "start": 55842 + }, + { + "attributes": {}, + "tag": "li", + "end": 55851, + "tag_type": 1, + "start": 55847 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/Top100.html" + }, + "tag": "a", + "end": 55892, + "tag_type": 1, + "start": 55851 + }, + { + "start": 55892, + "end": 55906 + }, + { + "attributes": {}, + "tag": "a", + "end": 55910, + "tag_type": 2, + "start": 55906 + }, + { + "attributes": {}, + "tag": "li", + "end": 55915, + "tag_type": 2, + "start": 55910 + }, + { + "attributes": {}, + "tag": "li", + "end": 55919, + "tag_type": 1, + "start": 55915 + }, + { + "attributes": { + "href": "/Games/PC/6-/Top100.html" + }, + "tag": "a", + "end": 55954, + "tag_type": 1, + "start": 55919 + }, + { + "start": 55954, + "end": 55962 + }, + { + "attributes": {}, + "tag": "a", + "end": 55966, + "tag_type": 2, + "start": 55962 + }, + { + "attributes": {}, + "tag": "li", + "end": 55971, + "tag_type": 2, + "start": 55966 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55976, + "tag_type": 2, + "start": 55971 + }, + { + "attributes": {}, + "tag": "li", + "end": 55981, + "tag_type": 2, + "start": 55976 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55986, + "tag_type": 2, + "start": 55981 + }, + { + "attributes": {}, + "tag": "div", + "end": 55992, + "tag_type": 2, + "start": 55986 + }, + { + "attributes": {}, + "tag": "div", + "end": 55998, + "tag_type": 2, + "start": 55992 + }, + { + "attributes": { + "class": "help wrap" + }, + "tag": "div", + "end": 56021, + "tag_type": 1, + "start": 55998 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 56042, + "tag_type": 1, + "start": 56021 + }, + { + "attributes": {}, + "tag": "div", + "end": 56047, + "tag_type": 1, + "start": 56042 + }, + { + "attributes": {}, + "tag": "div", + "end": 56052, + "tag_type": 1, + "start": 56047 + }, + { + "attributes": {}, + "tag": "h2", + "end": 56056, + "tag_type": 1, + "start": 56052 + }, + { + "start": 56056, + "end": 56069 + }, + { + "attributes": {}, + "tag": "h2", + "end": 56074, + "tag_type": 2, + "start": 56069 + }, + { + "attributes": {}, + "tag": "div", + "end": 56080, + "tag_type": 2, + "start": 56074 + }, + { + "attributes": {}, + "tag": "div", + "end": 56086, + "tag_type": 2, + "start": 56080 + }, + { + "attributes": {}, + "tag": "div", + "end": 56092, + "tag_type": 2, + "start": 56086 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 56109, + "tag_type": 1, + "start": 56092 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk", + "title": "Play.com Helpdesk" + }, + "tag": "a", + "end": 56183, + "tag_type": 1, + "start": 56109 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/helpdesk.gif", + "style": "border-style: none; border-width: 0px; height: 56px; width: 163px;", + "title": "Play.com Helpdesk" + }, + "tag": "img", + "end": 56360, + "tag_type": 1, + "start": 56183 + }, + { + "attributes": {}, + "tag": "a", + "end": 56364, + "tag_type": 2, + "start": 56360 + }, + { + "attributes": {}, + "tag": "div", + "end": 56370, + "tag_type": 2, + "start": 56364 + }, + { + "attributes": {}, + "tag": "div", + "end": 56376, + "tag_type": 2, + "start": 56370 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 56405, + "tag_type": 1, + "start": 56376 + }, + { + "attributes": {}, + "tag": "div", + "end": 56410, + "tag_type": 1, + "start": 56405 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8821116/-/Product.html?page=title&dpr=0", + "manual_cm_re": "Left-_-SideBanner1-_-ELEC_freeAlbumDownload_double.jpg" + }, + "tag": "a", + "end": 56562, + "tag_type": 1, + "start": 56410 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/253462.jpg", + "alt": "Free album download - Double", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 56701, + "tag_type": 1, + "start": 56562 + }, + { + "attributes": {}, + "tag": "a", + "end": 56705, + "tag_type": 2, + "start": 56701 + }, + { + "attributes": {}, + "tag": "div", + "end": 56711, + "tag_type": 2, + "start": 56705 + }, + { + "attributes": {}, + "tag": "div", + "end": 56717, + "tag_type": 2, + "start": 56711 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 56746, + "tag_type": 1, + "start": 56717 + }, + { + "attributes": {}, + "tag": "div", + "end": 56751, + "tag_type": 1, + "start": 56746 + }, + { + "attributes": { + "href": "/Campaign.html?campaign=6453&cid=2839989&dpr=0", + "manual_cm_sp": "ELEC_SonyHeadphones.jpg-_-LeftSideBanner3-_-ELEC", + "manual_cm_re": "Left-_-SideBanner3-_-ELEC_SonyHeadphones.jpg" + }, + "tag": "a", + "end": 56940, + "tag_type": 1, + "start": 56751 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/208001.jpg", + "alt": "Sony Headphones", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 57066, + "tag_type": 1, + "start": 56940 + }, + { + "attributes": {}, + "tag": "a", + "end": 57070, + "tag_type": 2, + "start": 57066 + }, + { + "attributes": {}, + "tag": "div", + "end": 57076, + "tag_type": 2, + "start": 57070 + }, + { + "attributes": {}, + "tag": "div", + "end": 57082, + "tag_type": 2, + "start": 57076 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 57111, + "tag_type": 1, + "start": 57082 + }, + { + "attributes": {}, + "tag": "div", + "end": 57116, + "tag_type": 1, + "start": 57111 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/255882/2-/Promo.html?dpr=255882", + "manual_cm_sp": "ELEC_ToshibaDVD_GBP.jpg_GBP-_-LeftSideBanner4-_-ELEC", + "manual_cm_re": "Left-_-SideBanner4-_-ELEC_ToshibaDVD_GBP.jpg_GBP" + }, + "tag": "a", + "end": 57318, + "tag_type": 1, + "start": 57116 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/181202_GBP.jpg", + "alt": "Toshiba DVD Players", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 57452, + "tag_type": 1, + "start": 57318 + }, + { + "attributes": {}, + "tag": "a", + "end": 57456, + "tag_type": 2, + "start": 57452 + }, + { + "attributes": {}, + "tag": "div", + "end": 57462, + "tag_type": 2, + "start": 57456 + }, + { + "attributes": {}, + "tag": "div", + "end": 57468, + "tag_type": 2, + "start": 57462 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 57497, + "tag_type": 1, + "start": 57468 + }, + { + "attributes": {}, + "tag": "div", + "end": 57502, + "tag_type": 1, + "start": 57497 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/166828/2-/Promo.html?dpr=166828", + "manual_cm_sp": "ELEC_LogitechRemotes.gif-_-LeftSideBanner5-_-ELEC", + "manual_cm_re": "Left-_-SideBanner5-_-ELEC_LogitechRemotes.gif" + }, + "tag": "a", + "end": 57698, + "tag_type": 1, + "start": 57502 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/218403.gif", + "alt": "Logitech Remotes", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 57825, + "tag_type": 1, + "start": 57698 + }, + { + "attributes": {}, + "tag": "a", + "end": 57829, + "tag_type": 2, + "start": 57825 + }, + { + "attributes": {}, + "tag": "div", + "end": 57835, + "tag_type": 2, + "start": 57829 + }, + { + "attributes": {}, + "tag": "div", + "end": 57841, + "tag_type": 2, + "start": 57835 + }, + { + "attributes": { + "class": "playstores wrap" + }, + "tag": "div", + "end": 57870, + "tag_type": 1, + "start": 57841 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 57891, + "tag_type": 1, + "start": 57870 + }, + { + "attributes": {}, + "tag": "div", + "end": 57896, + "tag_type": 1, + "start": 57891 + }, + { + "attributes": {}, + "tag": "div", + "end": 57901, + "tag_type": 1, + "start": 57896 + }, + { + "attributes": {}, + "tag": "h2", + "end": 57905, + "tag_type": 1, + "start": 57901 + }, + { + "start": 57905, + "end": 57916 + }, + { + "attributes": {}, + "tag": "h2", + "end": 57921, + "tag_type": 2, + "start": 57916 + }, + { + "attributes": {}, + "tag": "div", + "end": 57927, + "tag_type": 2, + "start": 57921 + }, + { + "attributes": {}, + "tag": "div", + "end": 57933, + "tag_type": 2, + "start": 57927 + }, + { + "attributes": {}, + "tag": "div", + "end": 57939, + "tag_type": 2, + "start": 57933 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 57956, + "tag_type": 1, + "start": 57939 + }, + { + "attributes": {}, + "tag": "div", + "end": 57961, + "tag_type": 1, + "start": 57956 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6383&cid=5044118" + }, + "tag": "a", + "end": 58029, + "tag_type": 1, + "start": 57961 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_disney.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58117, + "tag_type": 1, + "start": 58029 + }, + { + "attributes": {}, + "tag": "a", + "end": 58121, + "tag_type": 2, + "start": 58117 + }, + { + "attributes": {}, + "tag": "div", + "end": 58127, + "tag_type": 2, + "start": 58121 + }, + { + "attributes": {}, + "tag": "div", + "end": 58132, + "tag_type": 1, + "start": 58127 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/Campaign.html?campaign=2450&cid=9602708" + }, + "tag": "a", + "end": 58214, + "tag_type": 1, + "start": 58132 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_sony.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58300, + "tag_type": 1, + "start": 58214 + }, + { + "attributes": {}, + "tag": "a", + "end": 58304, + "tag_type": 2, + "start": 58300 + }, + { + "attributes": {}, + "tag": "div", + "end": 58310, + "tag_type": 2, + "start": 58304 + }, + { + "attributes": {}, + "tag": "div", + "end": 58315, + "tag_type": 1, + "start": 58310 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=621&cid=6096431" + }, + "tag": "a", + "end": 58382, + "tag_type": 1, + "start": 58315 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_dummies.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58471, + "tag_type": 1, + "start": 58382 + }, + { + "attributes": {}, + "tag": "a", + "end": 58475, + "tag_type": 2, + "start": 58471 + }, + { + "attributes": {}, + "tag": "div", + "end": 58481, + "tag_type": 2, + "start": 58475 + }, + { + "attributes": {}, + "tag": "div", + "end": 58486, + "tag_type": 1, + "start": 58481 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6001&cid=3425819" + }, + "tag": "a", + "end": 58554, + "tag_type": 1, + "start": 58486 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_nintendo.jpg", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58644, + "tag_type": 1, + "start": 58554 + }, + { + "attributes": {}, + "tag": "a", + "end": 58648, + "tag_type": 2, + "start": 58644 + }, + { + "attributes": {}, + "tag": "div", + "end": 58654, + "tag_type": 2, + "start": 58648 + }, + { + "attributes": {}, + "tag": "div", + "end": 58659, + "tag_type": 1, + "start": 58654 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=2030&cid=6256562" + }, + "tag": "a", + "end": 58727, + "tag_type": 1, + "start": 58659 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/ea_store.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58811, + "tag_type": 1, + "start": 58727 + }, + { + "attributes": {}, + "tag": "a", + "end": 58815, + "tag_type": 2, + "start": 58811 + }, + { + "attributes": {}, + "tag": "div", + "end": 58821, + "tag_type": 2, + "start": 58815 + }, + { + "attributes": {}, + "tag": "div", + "end": 58826, + "tag_type": 1, + "start": 58821 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=2720&cid=6896143" + }, + "tag": "a", + "end": 58894, + "tag_type": 1, + "start": 58826 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_hbo.gif", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 58979, + "tag_type": 1, + "start": 58894 + }, + { + "attributes": {}, + "tag": "a", + "end": 58983, + "tag_type": 2, + "start": 58979 + }, + { + "attributes": {}, + "tag": "div", + "end": 58989, + "tag_type": 2, + "start": 58983 + }, + { + "attributes": {}, + "tag": "div", + "end": 58995, + "tag_type": 2, + "start": 58989 + }, + { + "attributes": {}, + "tag": "div", + "end": 59001, + "tag_type": 2, + "start": 58995 + }, + { + "start": 59001, + "end": 59009 + }, + { + "attributes": {}, + "tag": "div", + "end": 59015, + "tag_type": 2, + "start": 59009 + }, + { + "start": 59015, + "end": 59019 + }, + { + "attributes": {}, + "tag": "div", + "end": 59025, + "tag_type": 2, + "start": 59019 + }, + { + "start": 59025, + "end": 59029 + }, + { + "attributes": { + "class": "clear" + }, + "tag": "div", + "end": 59048, + "tag_type": 1, + "start": 59029 + }, + { + "attributes": {}, + "tag": "div", + "end": 59054, + "tag_type": 2, + "start": 59048 + }, + { + "attributes": {}, + "tag": "div", + "end": 59060, + "tag_type": 2, + "start": 59054 + }, + { + "start": 59060, + "end": 59080 + }, + { + "attributes": { + "class": null, + "id": "rightCol" + }, + "tag": "div", + "end": 59108, + "tag_type": 1, + "start": 59080 + }, + { + "start": 59108, + "end": 59132 + }, + { + "attributes": { + "class": "column" + }, + "tag": "div", + "end": 59152, + "tag_type": 1, + "start": 59132 + }, + { + "start": 59152, + "end": 59172 + }, + { + "attributes": { + "class": "shortbanner wrap" + }, + "tag": "div", + "end": 59202, + "tag_type": 1, + "start": 59172 + }, + { + "attributes": {}, + "tag": "div", + "end": 59207, + "tag_type": 1, + "start": 59202 + }, + { + "attributes": { + "href": "/campaign.aspx?campaign=6688&cid=5685422&dpr=0", + "manual_cm_sp": "ELEC_valpak.jpg-_-RightShortBanner1-_-ELEC", + "manual_cm_re": "Right-_-ShortBanner1-_-ELEC_valpak.jpg" + }, + "tag": "a", + "end": 59384, + "tag_type": 1, + "start": 59207 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SHORT_BANNERS/220656.jpg", + "alt": "Valpak - short banner", + "style": "border-width: 0px;", + "class": null + }, + "tag": "img", + "end": 59526, + "tag_type": 1, + "start": 59384 + }, + { + "attributes": {}, + "tag": "a", + "end": 59530, + "tag_type": 2, + "start": 59526 + }, + { + "attributes": {}, + "tag": "div", + "end": 59536, + "tag_type": 2, + "start": 59530 + }, + { + "attributes": {}, + "tag": "div", + "end": 59542, + "tag_type": 2, + "start": 59536 + }, + { + "attributes": { + "class": "shortbanner wrap" + }, + "tag": "div", + "end": 59572, + "tag_type": 1, + "start": 59542 + }, + { + "attributes": {}, + "tag": "div", + "end": 59577, + "tag_type": 1, + "start": 59572 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/2074/2-/Promo.html?dpr=2074", + "manual_cm_sp": "ELEC_I-Pod-Speakers.jpg-_-RightShortBanner2-_-ELEC", + "manual_cm_re": "Right-_-ShortBanner2-_-ELEC_I-Pod-Speakers.jpg" + }, + "tag": "a", + "end": 59771, + "tag_type": 1, + "start": 59577 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SHORT_BANNERS/10287.jpg", + "alt": "iPod speakers Save Up To 50%", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 59910, + "tag_type": 1, + "start": 59771 + }, + { + "attributes": {}, + "tag": "a", + "end": 59914, + "tag_type": 2, + "start": 59910 + }, + { + "attributes": {}, + "tag": "div", + "end": 59920, + "tag_type": 2, + "start": 59914 + }, + { + "attributes": {}, + "tag": "div", + "end": 59926, + "tag_type": 2, + "start": 59920 + }, + { + "attributes": { + "class": "countdown wrap" + }, + "tag": "div", + "end": 59954, + "tag_type": 1, + "start": 59926 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 59975, + "tag_type": 1, + "start": 59954 + }, + { + "attributes": {}, + "tag": "div", + "end": 59980, + "tag_type": 1, + "start": 59975 + }, + { + "attributes": {}, + "tag": "div", + "end": 59985, + "tag_type": 1, + "start": 59980 + }, + { + "start": 59985, + "end": 59989 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/CountDownList.html?searchtype=genre" + }, + "tag": "a", + "end": 60073, + "tag_type": 1, + "start": 59989 + }, + { + "start": 60073, + "end": 60081 + }, + { + "attributes": {}, + "tag": "h2", + "end": 60085, + "tag_type": 1, + "start": 60081 + }, + { + "start": 60085, + "end": 60094 + }, + { + "attributes": {}, + "tag": "h2", + "end": 60099, + "tag_type": 2, + "start": 60094 + }, + { + "attributes": {}, + "tag": "a", + "end": 60103, + "tag_type": 2, + "start": 60099 + }, + { + "attributes": {}, + "tag": "div", + "end": 60109, + "tag_type": 2, + "start": 60103 + }, + { + "attributes": {}, + "tag": "div", + "end": 60115, + "tag_type": 2, + "start": 60109 + }, + { + "attributes": {}, + "tag": "div", + "end": 60121, + "tag_type": 2, + "start": 60115 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 60138, + "tag_type": 1, + "start": 60121 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 60161, + "tag_type": 1, + "start": 60138 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 60168, + "tag_type": 1, + "start": 60161 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60172, + "tag_type": 1, + "start": 60168 + }, + { + "attributes": {}, + "tag": "td", + "end": 60176, + "tag_type": 1, + "start": 60172 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 60195, + "tag_type": 1, + "start": 60176 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 60348, + "tag_type": 1, + "start": 60195 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8839534s.jpg", + "alt": "Sony Bravia S Series 26" 26S5500 HD Ready Freeview Widescreen LCD TV", + "style": "border-width: 0px; height: 60px; width: 60px;", + "class": "sideimageline" + }, + "tag": "img", + "end": 60569, + "tag_type": 1, + "start": 60348 + }, + { + "attributes": {}, + "tag": "a", + "end": 60573, + "tag_type": 2, + "start": 60569 + }, + { + "attributes": {}, + "tag": "div", + "end": 60579, + "tag_type": 2, + "start": 60573 + }, + { + "attributes": {}, + "tag": "td", + "end": 60584, + "tag_type": 2, + "start": 60579 + }, + { + "attributes": {}, + "tag": "td", + "end": 60588, + "tag_type": 1, + "start": 60584 + }, + { + "attributes": { + "class": "days" + }, + "tag": "div", + "end": 60606, + "tag_type": 1, + "start": 60588 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/countdown/28.gif", + "style": "border-width: 0px;", + "border": "0" + }, + "tag": "img", + "end": 60718, + "tag_type": 1, + "start": 60606 + }, + { + "attributes": {}, + "tag": "div", + "end": 60724, + "tag_type": 2, + "start": 60718 + }, + { + "attributes": {}, + "tag": "td", + "end": 60729, + "tag_type": 2, + "start": 60724 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60734, + "tag_type": 2, + "start": 60729 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60738, + "tag_type": 1, + "start": 60734 + }, + { + "attributes": { + "colspan": "2" + }, + "tag": "td", + "end": 60754, + "tag_type": 1, + "start": 60738 + }, + { + "attributes": {}, + "tag": "h5", + "end": 60758, + "tag_type": 1, + "start": 60754 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 60911, + "tag_type": 1, + "start": 60758 + }, + { + "start": 60911, + "end": 60979 + }, + { + "attributes": {}, + "tag": "a", + "end": 60983, + "tag_type": 2, + "start": 60979 + }, + { + "attributes": {}, + "tag": "h5", + "end": 60988, + "tag_type": 2, + "start": 60983 + }, + { + "attributes": {}, + "tag": "td", + "end": 60993, + "tag_type": 2, + "start": 60988 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60998, + "tag_type": 2, + "start": 60993 + }, + { + "attributes": {}, + "tag": "tr", + "end": 61002, + "tag_type": 1, + "start": 60998 + }, + { + "attributes": { + "colspan": "2" + }, + "tag": "td", + "end": 61018, + "tag_type": 1, + "start": 61002 + }, + { + "attributes": {}, + "tag": "h6", + "end": 61022, + "tag_type": 1, + "start": 61018 + }, + { + "attributes": {}, + "tag": "h6", + "end": 61027, + "tag_type": 2, + "start": 61022 + }, + { + "attributes": {}, + "tag": "h6", + "end": 61031, + "tag_type": 1, + "start": 61027 + }, + { + "start": 61031, + "end": 61038 + }, + { + "attributes": {}, + "tag": "span", + "end": 61044, + "tag_type": 1, + "start": 61038 + }, + { + "start": 61044, + "end": 61058 + }, + { + "attributes": {}, + "tag": "span", + "end": 61065, + "tag_type": 2, + "start": 61058 + }, + { + "attributes": {}, + "tag": "h6", + "end": 61070, + "tag_type": 2, + "start": 61065 + }, + { + "attributes": {}, + "tag": "td", + "end": 61075, + "tag_type": 2, + "start": 61070 + }, + { + "attributes": {}, + "tag": "tr", + "end": 61080, + "tag_type": 2, + "start": 61075 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 61088, + "tag_type": 2, + "start": 61080 + }, + { + "attributes": {}, + "tag": "table", + "end": 61096, + "tag_type": 2, + "start": 61088 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 61112, + "tag_type": 1, + "start": 61096 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/CountDownList.html?searchtype=genre" + }, + "tag": "a", + "end": 61196, + "tag_type": 1, + "start": 61112 + }, + { + "start": 61196, + "end": 61205 + }, + { + "attributes": {}, + "tag": "span", + "end": 61211, + "tag_type": 1, + "start": 61205 + }, + { + "start": 61211, + "end": 61212 + }, + { + "attributes": {}, + "tag": "span", + "end": 61219, + "tag_type": 2, + "start": 61212 + }, + { + "start": 61219, + "end": 61220 + }, + { + "attributes": {}, + "tag": "a", + "end": 61224, + "tag_type": 2, + "start": 61220 + }, + { + "attributes": {}, + "tag": "p", + "end": 61228, + "tag_type": 2, + "start": 61224 + }, + { + "attributes": {}, + "tag": "div", + "end": 61234, + "tag_type": 2, + "start": 61228 + }, + { + "attributes": {}, + "tag": "div", + "end": 61240, + "tag_type": 2, + "start": 61234 + }, + { + "attributes": { + "class": "topsellers wrap" + }, + "tag": "div", + "end": 61269, + "tag_type": 1, + "start": 61240 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 61290, + "tag_type": 1, + "start": 61269 + }, + { + "attributes": {}, + "tag": "div", + "end": 61295, + "tag_type": 1, + "start": 61290 + }, + { + "attributes": {}, + "tag": "div", + "end": 61300, + "tag_type": 1, + "start": 61295 + }, + { + "start": 61300, + "end": 61304 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 61385, + "tag_type": 1, + "start": 61304 + }, + { + "start": 61385, + "end": 61393 + }, + { + "attributes": {}, + "tag": "h2", + "end": 61397, + "tag_type": 1, + "start": 61393 + }, + { + "start": 61397, + "end": 61420 + }, + { + "attributes": {}, + "tag": "h2", + "end": 61425, + "tag_type": 2, + "start": 61420 + }, + { + "attributes": {}, + "tag": "a", + "end": 61429, + "tag_type": 2, + "start": 61425 + }, + { + "attributes": {}, + "tag": "div", + "end": 61435, + "tag_type": 2, + "start": 61429 + }, + { + "attributes": {}, + "tag": "div", + "end": 61441, + "tag_type": 2, + "start": 61435 + }, + { + "attributes": {}, + "tag": "div", + "end": 61447, + "tag_type": 2, + "start": 61441 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 61464, + "tag_type": 1, + "start": 61447 + }, + { + "attributes": {}, + "tag": "ol", + "end": 61468, + "tag_type": 1, + "start": 61464 + }, + { + "attributes": {}, + "tag": "li", + "end": 61472, + "tag_type": 1, + "start": 61468 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839538/Sony-Bravia-S-Series-32-32S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart01", + "title": "Price: \u00a3379.99 Free Delivery" + }, + "tag": "a", + "end": 61652, + "tag_type": 1, + "start": 61472 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61672, + "tag_type": 1, + "start": 61652 + }, + { + "start": 61672, + "end": 61773 + }, + { + "attributes": {}, + "tag": "span", + "end": 61780, + "tag_type": 2, + "start": 61773 + }, + { + "attributes": {}, + "tag": "a", + "end": 61784, + "tag_type": 2, + "start": 61780 + }, + { + "attributes": {}, + "tag": "li", + "end": 61789, + "tag_type": 2, + "start": 61784 + }, + { + "attributes": {}, + "tag": "li", + "end": 61793, + "tag_type": 1, + "start": 61789 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html", + "class": "chart02", + "title": "Price: \u00a3334.99 Free Delivery" + }, + "tag": "a", + "end": 61963, + "tag_type": 1, + "start": 61793 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61983, + "tag_type": 1, + "start": 61963 + }, + { + "start": 61983, + "end": 62055 + }, + { + "attributes": {}, + "tag": "span", + "end": 62062, + "tag_type": 2, + "start": 62055 + }, + { + "attributes": {}, + "tag": "a", + "end": 62066, + "tag_type": 2, + "start": 62062 + }, + { + "attributes": {}, + "tag": "li", + "end": 62071, + "tag_type": 2, + "start": 62066 + }, + { + "attributes": {}, + "tag": "li", + "end": 62075, + "tag_type": 1, + "start": 62071 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9159265/Humax-FoxSat-HDR-Freesat-320GB-HDD-DTR-HD-Recorder/Product.html", + "class": "chart03", + "title": "Price: \u00a3249.99 Free Delivery" + }, + "tag": "a", + "end": 62238, + "tag_type": 1, + "start": 62075 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62258, + "tag_type": 1, + "start": 62238 + }, + { + "start": 62258, + "end": 62308 + }, + { + "attributes": {}, + "tag": "span", + "end": 62315, + "tag_type": 2, + "start": 62308 + }, + { + "attributes": {}, + "tag": "a", + "end": 62319, + "tag_type": 2, + "start": 62315 + }, + { + "attributes": {}, + "tag": "li", + "end": 62324, + "tag_type": 2, + "start": 62319 + }, + { + "attributes": {}, + "tag": "li", + "end": 62328, + "tag_type": 1, + "start": 62324 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/6904657/Vivanco-Universal-Sky-Remote-Control-Sky-Sky+/Product.html", + "class": "chart04", + "title": "Price: \u00a34.99 Free Delivery" + }, + "tag": "a", + "end": 62484, + "tag_type": 1, + "start": 62328 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62504, + "tag_type": 1, + "start": 62484 + }, + { + "start": 62504, + "end": 62551 + }, + { + "attributes": {}, + "tag": "span", + "end": 62558, + "tag_type": 2, + "start": 62551 + }, + { + "attributes": {}, + "tag": "a", + "end": 62562, + "tag_type": 2, + "start": 62558 + }, + { + "attributes": {}, + "tag": "li", + "end": 62567, + "tag_type": 2, + "start": 62562 + }, + { + "attributes": {}, + "tag": "li", + "end": 62571, + "tag_type": 1, + "start": 62567 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/5985149/Synn-LTS4201-B-Glass-Stand-for-TVs-Up-To-42-/Product.html", + "class": "chart05", + "title": "Price: \u00a399.99 Free Delivery" + }, + "tag": "a", + "end": 62727, + "tag_type": 1, + "start": 62571 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62747, + "tag_type": 1, + "start": 62727 + }, + { + "start": 62747, + "end": 62808 + }, + { + "attributes": {}, + "tag": "span", + "end": 62815, + "tag_type": 2, + "start": 62808 + }, + { + "attributes": {}, + "tag": "a", + "end": 62819, + "tag_type": 2, + "start": 62815 + }, + { + "attributes": {}, + "tag": "li", + "end": 62824, + "tag_type": 2, + "start": 62819 + }, + { + "attributes": {}, + "tag": "li", + "end": 62828, + "tag_type": 1, + "start": 62824 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9404087/LG-22-M227WD-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart06", + "title": "Price: \u00a3199.99 Free Delivery" + }, + "tag": "a", + "end": 62989, + "tag_type": 1, + "start": 62828 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63009, + "tag_type": 1, + "start": 62989 + }, + { + "start": 63009, + "end": 63058 + }, + { + "attributes": {}, + "tag": "span", + "end": 63065, + "tag_type": 2, + "start": 63058 + }, + { + "attributes": {}, + "tag": "a", + "end": 63069, + "tag_type": 2, + "start": 63065 + }, + { + "attributes": {}, + "tag": "li", + "end": 63074, + "tag_type": 2, + "start": 63069 + }, + { + "attributes": {}, + "tag": "li", + "end": 63078, + "tag_type": 1, + "start": 63074 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/1112311/Linx-1-2m-Luxury-24k-Gold-Plated-HDMI-Cable/Product.html", + "class": "chart07", + "title": "Price: \u00a38.99 Free Delivery" + }, + "tag": "a", + "end": 63232, + "tag_type": 1, + "start": 63078 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63252, + "tag_type": 1, + "start": 63232 + }, + { + "start": 63252, + "end": 63296 + }, + { + "attributes": {}, + "tag": "span", + "end": 63303, + "tag_type": 2, + "start": 63296 + }, + { + "attributes": {}, + "tag": "a", + "end": 63307, + "tag_type": 2, + "start": 63303 + }, + { + "attributes": {}, + "tag": "li", + "end": 63312, + "tag_type": 2, + "start": 63307 + }, + { + "attributes": {}, + "tag": "li", + "end": 63316, + "tag_type": 1, + "start": 63312 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/5447796/Samsung-20-T200-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart08", + "title": "Price: \u00a3169.99 Free Delivery" + }, + "tag": "a", + "end": 63480, + "tag_type": 1, + "start": 63316 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63500, + "tag_type": 1, + "start": 63480 + }, + { + "start": 63500, + "end": 63572 + }, + { + "attributes": {}, + "tag": "span", + "end": 63579, + "tag_type": 2, + "start": 63572 + }, + { + "attributes": {}, + "tag": "a", + "end": 63583, + "tag_type": 2, + "start": 63579 + }, + { + "attributes": {}, + "tag": "li", + "end": 63588, + "tag_type": 2, + "start": 63583 + }, + { + "attributes": {}, + "tag": "li", + "end": 63592, + "tag_type": 1, + "start": 63588 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/3271416/Linx-TVM021-TV-Stand-Up-To-37-/Product.html", + "class": "chart09", + "title": "Price: \u00a329.99 Free Delivery" + }, + "tag": "a", + "end": 63734, + "tag_type": 1, + "start": 63592 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63754, + "tag_type": 1, + "start": 63734 + }, + { + "start": 63754, + "end": 63784 + }, + { + "attributes": {}, + "tag": "span", + "end": 63791, + "tag_type": 2, + "start": 63784 + }, + { + "attributes": {}, + "tag": "a", + "end": 63795, + "tag_type": 2, + "start": 63791 + }, + { + "attributes": {}, + "tag": "li", + "end": 63800, + "tag_type": 2, + "start": 63795 + }, + { + "attributes": {}, + "tag": "li", + "end": 63804, + "tag_type": 1, + "start": 63800 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9481062/Toshiba-Regza-AV-Series-32-32AV615DB-HD-Ready-Freeview-LCD-TV/Product.html", + "class": "chart10", + "title": "Price: \u00a3339.99 Free Delivery" + }, + "tag": "a", + "end": 63978, + "tag_type": 1, + "start": 63804 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63998, + "tag_type": 1, + "start": 63978 + }, + { + "start": 63998, + "end": 64112 + }, + { + "attributes": {}, + "tag": "span", + "end": 64119, + "tag_type": 2, + "start": 64112 + }, + { + "attributes": {}, + "tag": "a", + "end": 64123, + "tag_type": 2, + "start": 64119 + }, + { + "attributes": {}, + "tag": "li", + "end": 64128, + "tag_type": 2, + "start": 64123 + }, + { + "attributes": {}, + "tag": "ol", + "end": 64133, + "tag_type": 2, + "start": 64128 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 64149, + "tag_type": 1, + "start": 64133 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 64230, + "tag_type": 1, + "start": 64149 + }, + { + "start": 64230, + "end": 64247 + }, + { + "attributes": {}, + "tag": "span", + "end": 64253, + "tag_type": 1, + "start": 64247 + }, + { + "start": 64253, + "end": 64254 + }, + { + "attributes": {}, + "tag": "span", + "end": 64261, + "tag_type": 2, + "start": 64254 + }, + { + "start": 64261, + "end": 64262 + }, + { + "attributes": {}, + "tag": "a", + "end": 64266, + "tag_type": 2, + "start": 64262 + }, + { + "attributes": {}, + "tag": "p", + "end": 64270, + "tag_type": 2, + "start": 64266 + }, + { + "attributes": {}, + "tag": "div", + "end": 64276, + "tag_type": 2, + "start": 64270 + }, + { + "attributes": {}, + "tag": "div", + "end": 64282, + "tag_type": 2, + "start": 64276 + }, + { + "attributes": { + "class": "comingsoon wrap" + }, + "tag": "div", + "end": 64311, + "tag_type": 1, + "start": 64282 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 64332, + "tag_type": 1, + "start": 64311 + }, + { + "attributes": {}, + "tag": "div", + "end": 64337, + "tag_type": 1, + "start": 64332 + }, + { + "attributes": {}, + "tag": "div", + "end": 64342, + "tag_type": 1, + "start": 64337 + }, + { + "start": 64342, + "end": 64346 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 64427, + "tag_type": 1, + "start": 64346 + }, + { + "start": 64427, + "end": 64435 + }, + { + "attributes": {}, + "tag": "h2", + "end": 64439, + "tag_type": 1, + "start": 64435 + }, + { + "start": 64439, + "end": 64450 + }, + { + "attributes": {}, + "tag": "h2", + "end": 64455, + "tag_type": 2, + "start": 64450 + }, + { + "attributes": {}, + "tag": "a", + "end": 64459, + "tag_type": 2, + "start": 64455 + }, + { + "attributes": {}, + "tag": "div", + "end": 64465, + "tag_type": 2, + "start": 64459 + }, + { + "attributes": {}, + "tag": "div", + "end": 64471, + "tag_type": 2, + "start": 64465 + }, + { + "attributes": {}, + "tag": "div", + "end": 64477, + "tag_type": 2, + "start": 64471 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 64494, + "tag_type": 1, + "start": 64477 + }, + { + "attributes": {}, + "tag": "ul", + "end": 64498, + "tag_type": 1, + "start": 64494 + }, + { + "attributes": {}, + "tag": "li", + "end": 64502, + "tag_type": 1, + "start": 64498 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10502045/Accessory-Agents-10-37-Low-Profile-Wall-Bracket/Product.html", + "class": "arrow", + "title": "Price: \u00a314.99 Free Delivery" + }, + "tag": "a", + "end": 64660, + "tag_type": 1, + "start": 64502 + }, + { + "start": 64660, + "end": 64711 + }, + { + "attributes": {}, + "tag": "a", + "end": 64715, + "tag_type": 2, + "start": 64711 + }, + { + "attributes": {}, + "tag": "li", + "end": 64720, + "tag_type": 2, + "start": 64715 + }, + { + "attributes": {}, + "tag": "li", + "end": 64724, + "tag_type": 1, + "start": 64720 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839704/Sony-Bravia-Z-Series-40-40Z5500-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a31399.99 Free Delivery" + }, + "tag": "a", + "end": 64903, + "tag_type": 1, + "start": 64724 + }, + { + "start": 64903, + "end": 65004 + }, + { + "attributes": {}, + "tag": "a", + "end": 65008, + "tag_type": 2, + "start": 65004 + }, + { + "attributes": {}, + "tag": "li", + "end": 65013, + "tag_type": 2, + "start": 65008 + }, + { + "attributes": {}, + "tag": "li", + "end": 65017, + "tag_type": 1, + "start": 65013 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3399.99 Free Delivery" + }, + "tag": "a", + "end": 65195, + "tag_type": 1, + "start": 65017 + }, + { + "start": 65195, + "end": 65263 + }, + { + "attributes": {}, + "tag": "a", + "end": 65267, + "tag_type": 2, + "start": 65263 + }, + { + "attributes": {}, + "tag": "li", + "end": 65272, + "tag_type": 2, + "start": 65267 + }, + { + "attributes": {}, + "tag": "li", + "end": 65276, + "tag_type": 1, + "start": 65272 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10772232/Samsung-22-LE22B350-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3199.99 Free Delivery" + }, + "tag": "a", + "end": 65425, + "tag_type": 1, + "start": 65276 + }, + { + "start": 65425, + "end": 65463 + }, + { + "attributes": {}, + "tag": "a", + "end": 65467, + "tag_type": 2, + "start": 65463 + }, + { + "attributes": {}, + "tag": "li", + "end": 65472, + "tag_type": 2, + "start": 65467 + }, + { + "attributes": {}, + "tag": "li", + "end": 65476, + "tag_type": 1, + "start": 65472 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839719/Sony-Bravia-Z-Series-52-52Z5500-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a32199.99 Free Delivery" + }, + "tag": "a", + "end": 65655, + "tag_type": 1, + "start": 65476 + }, + { + "start": 65655, + "end": 65756 + }, + { + "attributes": {}, + "tag": "a", + "end": 65760, + "tag_type": 2, + "start": 65756 + }, + { + "attributes": {}, + "tag": "li", + "end": 65765, + "tag_type": 2, + "start": 65760 + }, + { + "attributes": {}, + "tag": "li", + "end": 65769, + "tag_type": 1, + "start": 65765 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9223463/Panasonic-Viera-NeoPDP-G15-Series-46-TX-P46G15-HD-1080p-Freesat-Freeview-Plasma-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a31299.99 Free Delivery" + }, + "tag": "a", + "end": 65963, + "tag_type": 1, + "start": 65769 + }, + { + "start": 65963, + "end": 66052 + }, + { + "attributes": {}, + "tag": "a", + "end": 66056, + "tag_type": 2, + "start": 66052 + }, + { + "attributes": {}, + "tag": "li", + "end": 66061, + "tag_type": 2, + "start": 66056 + }, + { + "attributes": {}, + "tag": "li", + "end": 66065, + "tag_type": 1, + "start": 66061 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10333427/Samsung-Series-7-7020-32-UE32B7020-HD-1080p-Freeview-Ultra-Slim-LED-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3999.99 Free Delivery" + }, + "tag": "a", + "end": 66247, + "tag_type": 1, + "start": 66065 + }, + { + "start": 66247, + "end": 66341 + }, + { + "attributes": {}, + "tag": "a", + "end": 66345, + "tag_type": 2, + "start": 66341 + }, + { + "attributes": {}, + "tag": "li", + "end": 66350, + "tag_type": 2, + "start": 66345 + }, + { + "attributes": {}, + "tag": "li", + "end": 66354, + "tag_type": 1, + "start": 66350 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9924416/Toshiba-DV-Series-19-DV616DB-HD-Ready-Freeview-Integrated-DVD-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3269.99 Free Delivery" + }, + "tag": "a", + "end": 66533, + "tag_type": 1, + "start": 66354 + }, + { + "start": 66533, + "end": 66616 + }, + { + "attributes": {}, + "tag": "a", + "end": 66620, + "tag_type": 2, + "start": 66616 + }, + { + "attributes": {}, + "tag": "li", + "end": 66625, + "tag_type": 2, + "start": 66620 + }, + { + "attributes": {}, + "tag": "li", + "end": 66629, + "tag_type": 1, + "start": 66625 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9769759/Toshiba-Regza-ZV-Series-42-42ZV635-HD-1080p-Freeview-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3899.99 Free Delivery" + }, + "tag": "a", + "end": 66799, + "tag_type": 1, + "start": 66629 + }, + { + "start": 66799, + "end": 66863 + }, + { + "attributes": {}, + "tag": "a", + "end": 66867, + "tag_type": 2, + "start": 66863 + }, + { + "attributes": {}, + "tag": "li", + "end": 66872, + "tag_type": 2, + "start": 66867 + }, + { + "attributes": {}, + "tag": "li", + "end": 66876, + "tag_type": 1, + "start": 66872 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10772167/Samsung-Series-5-530-32-LE32B530-HD-1080p-Freeview-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3449.99 Free Delivery" + }, + "tag": "a", + "end": 67045, + "tag_type": 1, + "start": 66876 + }, + { + "start": 67045, + "end": 67107 + }, + { + "attributes": {}, + "tag": "a", + "end": 67111, + "tag_type": 2, + "start": 67107 + }, + { + "attributes": {}, + "tag": "li", + "end": 67116, + "tag_type": 2, + "start": 67111 + }, + { + "attributes": {}, + "tag": "ul", + "end": 67121, + "tag_type": 2, + "start": 67116 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 67137, + "tag_type": 1, + "start": 67121 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 67218, + "tag_type": 1, + "start": 67137 + }, + { + "start": 67218, + "end": 67230 + }, + { + "attributes": { + "class": "orangepanel" + }, + "tag": "span", + "end": 67256, + "tag_type": 1, + "start": 67230 + }, + { + "start": 67256, + "end": 67257 + }, + { + "attributes": {}, + "tag": "span", + "end": 67264, + "tag_type": 2, + "start": 67257 + }, + { + "attributes": {}, + "tag": "a", + "end": 67268, + "tag_type": 2, + "start": 67264 + }, + { + "attributes": {}, + "tag": "p", + "end": 67272, + "tag_type": 2, + "start": 67268 + }, + { + "attributes": {}, + "tag": "div", + "end": 67278, + "tag_type": 2, + "start": 67272 + }, + { + "attributes": {}, + "tag": "div", + "end": 67284, + "tag_type": 2, + "start": 67278 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 67313, + "tag_type": 1, + "start": 67284 + }, + { + "attributes": {}, + "tag": "div", + "end": 67318, + "tag_type": 1, + "start": 67313 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/Campaign.html?campaign=7147&cid=1528342&dpr=0", + "manual_cm_sp": "BLU_blu-ray_month_from799_doubles_GBP.jpg_GBP-_-RightSideBanner1-_-ELEC", + "manual_cm_re": "Right-_-SideBanner1-_-BLU_blu-ray_month_from799_doubles_GBP.jpg_GBP" + }, + "tag": "a", + "end": 67568, + "tag_type": 1, + "start": 67318 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/249662_GBP.jpg", + "alt": "Blu-ray from \u00a37.99", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 67701, + "tag_type": 1, + "start": 67568 + }, + { + "attributes": {}, + "tag": "a", + "end": 67705, + "tag_type": 2, + "start": 67701 + }, + { + "attributes": {}, + "tag": "div", + "end": 67711, + "tag_type": 2, + "start": 67705 + }, + { + "attributes": {}, + "tag": "div", + "end": 67717, + "tag_type": 2, + "start": 67711 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 67746, + "tag_type": 1, + "start": 67717 + }, + { + "attributes": {}, + "tag": "div", + "end": 67751, + "tag_type": 1, + "start": 67746 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/301482/2-/Promo.html?dpr=301482", + "manual_cm_sp": "ELEC_SonyLCDTVs_GBP.gif_GBP-_-RightSideBanner2-_-ELEC", + "manual_cm_re": "Right-_-SideBanner2-_-ELEC_SonyLCDTVs_GBP.gif_GBP" + }, + "tag": "a", + "end": 67955, + "tag_type": 1, + "start": 67751 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/225463_GBP.gif", + "alt": "Sony LCD TV's - Double", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 68092, + "tag_type": 1, + "start": 67955 + }, + { + "attributes": {}, + "tag": "a", + "end": 68096, + "tag_type": 2, + "start": 68092 + }, + { + "attributes": {}, + "tag": "div", + "end": 68102, + "tag_type": 2, + "start": 68096 + }, + { + "attributes": {}, + "tag": "div", + "end": 68108, + "tag_type": 2, + "start": 68102 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 68137, + "tag_type": 1, + "start": 68108 + }, + { + "attributes": {}, + "tag": "div", + "end": 68142, + "tag_type": 1, + "start": 68137 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/255083/2-/Promo.html?dpr=255083", + "manual_cm_sp": "ELEC_Blu-ray-Players_GBP.jpg_GBP-_-RightSideBanner3-_-ELEC", + "manual_cm_re": "Right-_-SideBanner3-_-ELEC_Blu-ray-Players_GBP.jpg_GBP" + }, + "tag": "a", + "end": 68356, + "tag_type": 1, + "start": 68142 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/181200_GBP.jpg", + "alt": "Blu-ray players from \u00a3199.99", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 68499, + "tag_type": 1, + "start": 68356 + }, + { + "attributes": {}, + "tag": "a", + "end": 68503, + "tag_type": 2, + "start": 68499 + }, + { + "attributes": {}, + "tag": "div", + "end": 68509, + "tag_type": 2, + "start": 68503 + }, + { + "attributes": {}, + "tag": "div", + "end": 68515, + "tag_type": 2, + "start": 68509 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 68544, + "tag_type": 1, + "start": 68515 + }, + { + "attributes": {}, + "tag": "div", + "end": 68549, + "tag_type": 1, + "start": 68544 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/351362/2-/Promo.html?dpr=351362", + "manual_cm_sp": "ELEC_Flip_GBP.gif_GBP-_-RightSideBanner4-_-ELEC", + "manual_cm_re": "Right-_-SideBanner4-_-ELEC_Flip_GBP.gif_GBP" + }, + "tag": "a", + "end": 68741, + "tag_type": 1, + "start": 68549 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/250490_GBP.gif", + "alt": "Flip Camcorders - From Only \u00a379.99", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 68890, + "tag_type": 1, + "start": 68741 + }, + { + "attributes": {}, + "tag": "a", + "end": 68894, + "tag_type": 2, + "start": 68890 + }, + { + "attributes": {}, + "tag": "div", + "end": 68900, + "tag_type": 2, + "start": 68894 + }, + { + "attributes": {}, + "tag": "div", + "end": 68906, + "tag_type": 2, + "start": 68900 + }, + { + "start": 68906, + "end": 68926 + }, + { + "attributes": { + "class": "secureshopping wrap" + }, + "tag": "div", + "end": 68959, + "tag_type": 1, + "start": 68926 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 68980, + "tag_type": 1, + "start": 68959 + }, + { + "attributes": {}, + "tag": "div", + "end": 68985, + "tag_type": 1, + "start": 68980 + }, + { + "attributes": {}, + "tag": "div", + "end": 68990, + "tag_type": 1, + "start": 68985 + }, + { + "attributes": {}, + "tag": "h2", + "end": 68994, + "tag_type": 1, + "start": 68990 + }, + { + "start": 68994, + "end": 69009 + }, + { + "attributes": {}, + "tag": "h2", + "end": 69014, + "tag_type": 2, + "start": 69009 + }, + { + "attributes": {}, + "tag": "div", + "end": 69020, + "tag_type": 2, + "start": 69014 + }, + { + "attributes": {}, + "tag": "div", + "end": 69026, + "tag_type": 2, + "start": 69020 + }, + { + "attributes": {}, + "tag": "div", + "end": 69032, + "tag_type": 2, + "start": 69026 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 69049, + "tag_type": 1, + "start": 69032 + }, + { + "attributes": { + "href": "about:blank", + "border": "0" + }, + "tag": "a", + "end": 69082, + "tag_type": 1, + "start": 69049 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/verisign.gif", + "height": "52", + "border": "0", + "width": "94" + }, + "tag": "img", + "end": 69192, + "tag_type": 1, + "start": 69082 + }, + { + "attributes": {}, + "tag": "a", + "end": 69196, + "tag_type": 2, + "start": 69192 + }, + { + "attributes": {}, + "tag": "div", + "end": 69202, + "tag_type": 2, + "start": 69196 + }, + { + "attributes": {}, + "tag": "div", + "end": 69208, + "tag_type": 2, + "start": 69202 + }, + { + "start": 69208, + "end": 69228 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 69257, + "tag_type": 1, + "start": 69228 + }, + { + "attributes": {}, + "tag": "div", + "end": 69262, + "tag_type": 1, + "start": 69257 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/GiftVouchers.html?dpr=0", + "manual_cm_sp": "giftvoucher_sb.jpg-_-SideBanner1-_-ELEC", + "manual_cm_re": "-_-SideBanner1-_-giftvoucher_sb.jpg" + }, + "tag": "a", + "end": 69416, + "tag_type": 1, + "start": 69262 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/229863.jpg", + "alt": "Buy Gift Vouchers", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 69544, + "tag_type": 1, + "start": 69416 + }, + { + "attributes": {}, + "tag": "a", + "end": 69548, + "tag_type": 2, + "start": 69544 + }, + { + "attributes": {}, + "tag": "div", + "end": 69554, + "tag_type": 2, + "start": 69548 + }, + { + "attributes": {}, + "tag": "div", + "end": 69560, + "tag_type": 2, + "start": 69554 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 69589, + "tag_type": 1, + "start": 69560 + }, + { + "attributes": {}, + "tag": "div", + "end": 69594, + "tag_type": 1, + "start": 69589 + }, + { + "attributes": { + "href": "/Campaign.html?campaign=6748&cid=5106868&dpr=0", + "manual_cm_sp": "ccard_sb.jpg-_-SideBanner2-_-ELEC", + "manual_cm_re": "-_-SideBanner2-_-ccard_sb.jpg" + }, + "tag": "a", + "end": 69753, + "tag_type": 1, + "start": 69594 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/238668.jpg", + "alt": "Play.com Credit Card", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 69884, + "tag_type": 1, + "start": 69753 + }, + { + "attributes": {}, + "tag": "a", + "end": 69888, + "tag_type": 2, + "start": 69884 + }, + { + "attributes": {}, + "tag": "div", + "end": 69894, + "tag_type": 2, + "start": 69888 + }, + { + "attributes": {}, + "tag": "div", + "end": 69900, + "tag_type": 2, + "start": 69894 + }, + { + "start": 69900, + "end": 69924 + }, + { + "attributes": {}, + "tag": "div", + "end": 69930, + "tag_type": 2, + "start": 69924 + }, + { + "start": 69930, + "end": 69950 + }, + { + "attributes": {}, + "tag": "div", + "end": 69956, + "tag_type": 2, + "start": 69950 + }, + { + "start": 69956, + "end": 69976 + }, + { + "attributes": { + "class": "clear" + }, + "tag": "div", + "end": 69995, + "tag_type": 1, + "start": 69976 + }, + { + "attributes": {}, + "tag": "div", + "end": 70001, + "tag_type": 2, + "start": 69995 + }, + { + "start": 70001, + "end": 70021 + }, + { + "attributes": {}, + "tag": "div", + "end": 70027, + "tag_type": 2, + "start": 70021 + }, + { + "start": 70027, + "end": 70035 + }, + { + "attributes": {}, + "tag": "div", + "end": 70041, + "tag_type": 2, + "start": 70035 + }, + { + "start": 70041, + "end": 70045 + }, + { + "attributes": {}, + "tag": "div", + "end": 70051, + "tag_type": 2, + "start": 70045 + }, + { + "start": 70051, + "end": 70059 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 70112, + "tag_type": 1, + "start": 70059 + }, + { + "start": 70112, + "end": 70136 + }, + { + "attributes": {}, + "tag": "script", + "end": 70145, + "tag_type": 2, + "start": 70136 + }, + { + "start": 70145, + "end": 70153 + }, + { + "attributes": { + "class": "footer" + }, + "tag": "div", + "end": 70173, + "tag_type": 1, + "start": 70153 + }, + { + "start": 70173, + "end": 70181 + }, + { + "attributes": { + "class": "links" + }, + "tag": "p", + "end": 70198, + "tag_type": 1, + "start": 70181 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 70210, + "tag_type": 1, + "start": 70198 + }, + { + "start": 70210, + "end": 70214 + }, + { + "attributes": {}, + "tag": "a", + "end": 70218, + "tag_type": 2, + "start": 70214 + }, + { + "start": 70218, + "end": 70231 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 70269, + "tag_type": 1, + "start": 70231 + }, + { + "start": 70269, + "end": 70272 + }, + { + "attributes": {}, + "tag": "a", + "end": 70276, + "tag_type": 2, + "start": 70272 + }, + { + "start": 70276, + "end": 70289 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 70331, + "tag_type": 1, + "start": 70289 + }, + { + "start": 70331, + "end": 70338 + }, + { + "attributes": {}, + "tag": "a", + "end": 70342, + "tag_type": 2, + "start": 70338 + }, + { + "start": 70342, + "end": 70355 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 70394, + "tag_type": 1, + "start": 70355 + }, + { + "start": 70394, + "end": 70399 + }, + { + "attributes": {}, + "tag": "a", + "end": 70403, + "tag_type": 2, + "start": 70399 + }, + { + "start": 70403, + "end": 70416 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 70467, + "tag_type": 1, + "start": 70416 + }, + { + "start": 70467, + "end": 70474 + }, + { + "attributes": {}, + "tag": "a", + "end": 70478, + "tag_type": 2, + "start": 70474 + }, + { + "start": 70478, + "end": 70491 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 70533, + "tag_type": 1, + "start": 70491 + }, + { + "start": 70533, + "end": 70538 + }, + { + "attributes": {}, + "tag": "a", + "end": 70542, + "tag_type": 2, + "start": 70538 + }, + { + "start": 70542, + "end": 70555 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 70597, + "tag_type": 1, + "start": 70555 + }, + { + "start": 70597, + "end": 70602 + }, + { + "attributes": {}, + "tag": "a", + "end": 70606, + "tag_type": 2, + "start": 70602 + }, + { + "start": 70606, + "end": 70619 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/RegionHome.html" + }, + "tag": "a", + "end": 70667, + "tag_type": 1, + "start": 70619 + }, + { + "start": 70667, + "end": 70675 + }, + { + "attributes": {}, + "tag": "a", + "end": 70679, + "tag_type": 2, + "start": 70675 + }, + { + "start": 70679, + "end": 70692 + }, + { + "attributes": {}, + "tag": "strong", + "end": 70700, + "tag_type": 1, + "start": 70692 + }, + { + "start": 70700, + "end": 70711 + }, + { + "attributes": {}, + "tag": "strong", + "end": 70720, + "tag_type": 2, + "start": 70711 + }, + { + "start": 70720, + "end": 70733 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 70770, + "tag_type": 1, + "start": 70733 + }, + { + "start": 70770, + "end": 70779 + }, + { + "attributes": {}, + "tag": "a", + "end": 70783, + "tag_type": 2, + "start": 70779 + }, + { + "start": 70783, + "end": 70796 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 70842, + "tag_type": 1, + "start": 70796 + }, + { + "start": 70842, + "end": 70849 + }, + { + "attributes": {}, + "tag": "a", + "end": 70853, + "tag_type": 2, + "start": 70849 + }, + { + "start": 70853, + "end": 70866 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 70911, + "tag_type": 1, + "start": 70866 + }, + { + "start": 70911, + "end": 70917 + }, + { + "attributes": {}, + "tag": "a", + "end": 70921, + "tag_type": 2, + "start": 70917 + }, + { + "start": 70921, + "end": 70934 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/LandingPage.html?page=playtrade" + }, + "tag": "a", + "end": 70990, + "tag_type": 1, + "start": 70934 + }, + { + "start": 70990, + "end": 71005 + }, + { + "attributes": {}, + "tag": "a", + "end": 71009, + "tag_type": 2, + "start": 71005 + }, + { + "attributes": {}, + "tag": "p", + "end": 71013, + "tag_type": 2, + "start": 71009 + }, + { + "start": 71013, + "end": 71021 + }, + { + "attributes": { + "class": "cards" + }, + "tag": "div", + "end": 71040, + "tag_type": 1, + "start": 71021 + }, + { + "start": 71040, + "end": 71061 + }, + { + "attributes": { + "cellpadding": "0" + }, + "tag": "table", + "end": 71084, + "tag_type": 1, + "start": 71061 + }, + { + "start": 71084, + "end": 71096 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 71103, + "tag_type": 1, + "start": 71096 + }, + { + "start": 71103, + "end": 71119 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71123, + "tag_type": 1, + "start": 71119 + }, + { + "start": 71123, + "end": 71143 + }, + { + "attributes": {}, + "tag": "td", + "end": 71147, + "tag_type": 1, + "start": 71143 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/cards.gif", + "alt": "We accept these cards: Delta, MasterCard, Solo, Switch, Maestro, Visa, Electron", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 71334, + "tag_type": 1, + "start": 71147 + }, + { + "attributes": {}, + "tag": "td", + "end": 71339, + "tag_type": 2, + "start": 71334 + }, + { + "start": 71339, + "end": 71359 + }, + { + "attributes": {}, + "tag": "td", + "end": 71363, + "tag_type": 1, + "start": 71359 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6748&cid=5106868", + "title": "Play.com Credit Card" + }, + "tag": "a", + "end": 71460, + "tag_type": 1, + "start": 71363 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/play-credit-cards.gif", + "alt": "Play.com Credit Card", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 71600, + "tag_type": 1, + "start": 71460 + }, + { + "attributes": {}, + "tag": "a", + "end": 71604, + "tag_type": 2, + "start": 71600 + }, + { + "attributes": {}, + "tag": "td", + "end": 71609, + "tag_type": 2, + "start": 71604 + }, + { + "start": 71609, + "end": 71625 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71630, + "tag_type": 2, + "start": 71625 + }, + { + "start": 71630, + "end": 71642 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 71650, + "tag_type": 2, + "start": 71642 + }, + { + "start": 71650, + "end": 71658 + }, + { + "attributes": {}, + "tag": "table", + "end": 71666, + "tag_type": 2, + "start": 71658 + }, + { + "start": 71666, + "end": 71670 + }, + { + "attributes": {}, + "tag": "div", + "end": 71676, + "tag_type": 2, + "start": 71670 + }, + { + "attributes": { + "class": "contact" + }, + "tag": "div", + "end": 71697, + "tag_type": 1, + "start": 71676 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 71720, + "tag_type": 1, + "start": 71697 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 71727, + "tag_type": 1, + "start": 71720 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71731, + "tag_type": 1, + "start": 71727 + }, + { + "attributes": {}, + "tag": "td", + "end": 71735, + "tag_type": 1, + "start": 71731 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk", + "title": "Play.com Helpdesk" + }, + "tag": "a", + "end": 71809, + "tag_type": 1, + "start": 71735 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/helpdesk.gif", + "alt": "Play.com Helpdesk", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 71937, + "tag_type": 1, + "start": 71809 + }, + { + "attributes": {}, + "tag": "a", + "end": 71941, + "tag_type": 2, + "start": 71937 + }, + { + "attributes": {}, + "tag": "td", + "end": 71946, + "tag_type": 2, + "start": 71941 + }, + { + "attributes": {}, + "tag": "td", + "end": 71950, + "tag_type": 1, + "start": 71946 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/pipe.gif", + "style": "border-width: 0px; height: 32px; width: 23px;" + }, + "tag": "img", + "end": 72077, + "tag_type": 1, + "start": 71950 + }, + { + "attributes": {}, + "tag": "td", + "end": 72082, + "tag_type": 2, + "start": 72077 + }, + { + "attributes": {}, + "tag": "td", + "end": 72086, + "tag_type": 1, + "start": 72082 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/phone.gif", + "alt": "Customer Services: 0845 800 1020", + "style": "border-width: 0px;" + }, + "tag": "img", + "end": 72226, + "tag_type": 1, + "start": 72086 + }, + { + "attributes": {}, + "tag": "td", + "end": 72231, + "tag_type": 2, + "start": 72226 + }, + { + "attributes": {}, + "tag": "tr", + "end": 72236, + "tag_type": 2, + "start": 72231 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 72244, + "tag_type": 2, + "start": 72236 + }, + { + "attributes": {}, + "tag": "table", + "end": 72252, + "tag_type": 2, + "start": 72244 + }, + { + "attributes": {}, + "tag": "div", + "end": 72258, + "tag_type": 2, + "start": 72252 + }, + { + "attributes": { + "class": "legal" + }, + "tag": "p", + "end": 72275, + "tag_type": 1, + "start": 72258 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=priv" + }, + "tag": "a", + "end": 72319, + "tag_type": 1, + "start": 72275 + }, + { + "start": 72319, + "end": 72333 + }, + { + "attributes": {}, + "tag": "a", + "end": 72337, + "tag_type": 2, + "start": 72333 + }, + { + "start": 72337, + "end": 72340 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=terms" + }, + "tag": "a", + "end": 72385, + "tag_type": 1, + "start": 72340 + }, + { + "start": 72385, + "end": 72407 + }, + { + "attributes": {}, + "tag": "a", + "end": 72411, + "tag_type": 2, + "start": 72407 + }, + { + "start": 72411, + "end": 72414 + }, + { + "attributes": { + "style": "color: rgb(0, 0, 0);" + }, + "tag": "span", + "end": 72449, + "tag_type": 1, + "start": 72414 + }, + { + "start": 72449, + "end": 72484 + }, + { + "attributes": {}, + "tag": "span", + "end": 72491, + "tag_type": 2, + "start": 72484 + }, + { + "start": 72491, + "end": 72494 + }, + { + "attributes": {}, + "tag": "span", + "end": 72500, + "tag_type": 1, + "start": 72494 + }, + { + "start": 72500, + "end": 72515 + }, + { + "attributes": {}, + "tag": "span", + "end": 72522, + "tag_type": 2, + "start": 72515 + }, + { + "start": 72522, + "end": 72523 + }, + { + "attributes": { + "href": "http://www.PlayUSA.com" + }, + "tag": "a", + "end": 72556, + "tag_type": 1, + "start": 72523 + }, + { + "start": 72556, + "end": 72557 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/playincorporated.gif", + "alt": "Play Incorporated", + "style": "border-width: 0px; height: 16px; width: 55px;" + }, + "tag": "img", + "end": 72720, + "tag_type": 1, + "start": 72557 + }, + { + "attributes": {}, + "tag": "a", + "end": 72724, + "tag_type": 2, + "start": 72720 + }, + { + "attributes": {}, + "tag": "p", + "end": 72728, + "tag_type": 2, + "start": 72724 + }, + { + "start": 72728, + "end": 72736 + }, + { + "attributes": {}, + "tag": "div", + "end": 72742, + "tag_type": 2, + "start": 72736 + }, + { + "start": 72742, + "end": 72786 + }, + { + "attributes": {}, + "tag": "div", + "end": 72792, + "tag_type": 2, + "start": 72786 + }, + { + "attributes": {}, + "tag": "body", + "end": 72799, + "tag_type": 2, + "start": 72792 + } +] \ No newline at end of file diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.html b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.html new file mode 100644 index 000000000..330ae6fe3 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.html @@ -0,0 +1,31 @@ +Play.com (UK) : Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) : Electronics - Free Delivery + + + + + + + + + + + + + + +
| Help

£

€

My Shopping Basket

Your basket is empty

Electronics

Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)
Enlarge Image

Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)

Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars ( 1 customer rating )

£579.99 Free Delivery

RRP: £749.99 | You save: £170.00 (22%)

In stock | Usually dispatched within 24 hours

Half Price TV Stand

Save 50% On This TV Stand When Purchased With This TV

Related Promotions

 

Specifications

 

  • diagram
  • Please be aware that this item will be delivered via a courier and will require a signature. Please contact customer service team with a daytime contact number.
  • Screen Size: 37"
  • Resolution: 1920 x 1080
  • Technology: CCFL
  • Picture Engine: DNIe+
  • Dynamic Contrast Ratio: High Contrast
  • Wide Colour Enhancer:WCE 2
  • 1080 24p Real Movie
  • Audio
  • Sound Effect System: SRS Trusurround HD & Dolby Digital Plus
  • Speaker Type: Down Firing
  • Sound Output(RMS): 10W x 2
  • Features
  • USB 2.0
  • Teletext(TTXT)
  • Anynet+ (HDMI-CEC)
  • Game mode
  • User Interface
  • OSD Language
  • Sleep Timer
  • Clock & On/Off Timer
  • Auto Channel Search
  • Auto Power Off
  • EPG
  • Auto Volume Leveller
  • Hotel Mode(S/W)
  • System
  • DTV Type
  • DTV Tuner Built-in
  • Inputs / Outputs
  • HDMI: back + side
  • USB: side
  • CI Slot: side
  • Composite(AV): side
  • Service: back
  • PC input (D-sub): back
  • PC Audio Input (Mini Jack): back
  • DVI Audio Input (Mini Jack): back
  • Component(Y/Pb/Pr): back
  • Digital Audio (Optical): back
  • Headphone: back
  • RF Input: back
  • Audio Out(L/R): back
  • RS232C: back
  • Scart: back
  • Design
  • Type: Samsung Crystal TV
  • Colour: Platinum Black
  • Swivel (Left/Right)
  • Dimensions:
  • Set Size(WXDXH) with Stand: 923 x 253 x 659.4
  • Set Size(WXDXH) without Stand: 923 x 78.5 x 597
  • Weight
  • Set Weight with Stand: 19.4
  • Set weight without stand: 14.8
  • Accessory
  • Vesa Wall Mount (WXH): Yes (32-40":200x200)
  • Remote Controller
  • Batteries
  • Power Cable

Description

 

Samsung LCD TV perfectly balances style and techonology to give you an unrivalled viewing experience, no matter what you choose to watch.


HD 1080p
Full HD has twice the resolution of ordinary HD TV. Twice the resolution means twice the detail. Which means you get vividly realistic images with unmatched depth, clarity and sharpness. For more pixels, more detail and more pleasure nothing performs better than Full HD.



Wide Colour Enhancer
Samsung Wide Colour Enhancer technology lengthens and expands luminance level and colour range for more intense, vivid and realistic colours.



4 HDMI Connections
HDMI (High Definition Multimedia Interface) is the gold standard in HD connectivity. Uncompressed and 100% digital, HDMI delivers pure HD quality audio and video with no loss of signal.



USB 2.0
USB 2.0 uses a simple USB interface to let you play music and view pictures right on your TV screen.

Customer Reviews

 

Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars

Average rating (1 review)

Customer rating: 5 out of 5 stars Looking Good

Geniemo | 08/06/2009 | See all Geniemo's reviews (1) »

This TV is amazing - if you unlock some setting you can play Xvid, Dvix and MKV files through the TV (USB 2.0). The TV is well worth the money.

Related Items - Electronics

 

Valpak - short banner
iPod speakers Save Up To 50%
Blu-ray from £7.99
Sony LCD TV's - Double
Blu-ray players from £199.99
Flip Camcorders - From Only £79.99

Secure Shopping

Buy Gift Vouchers
Play.com Credit Card
+ diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json new file mode 100644 index 000000000..3fa134f28 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json @@ -0,0 +1,21768 @@ +[ + { + "attributes": { + "lang": "en", + "xml:lang": "en", + "xmlns": "http://www.w3.org/1999/xhtml" + }, + "tag": "html", + "end": 188, + "start": 121, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "head", + "end": 194, + "start": 188, + "tag_type": 1 + }, + { + "attributes": { + "id": "_pageTemplate__header__title" + }, + "tag": "title", + "end": 235, + "start": 194, + "tag_type": 1 + }, + { + "start": 235, + "end": 358 + }, + { + "attributes": {}, + "tag": "title", + "end": 366, + "start": 358, + "tag_type": 2 + }, + { + "start": 366, + "end": 367 + }, + { + "attributes": { + "content": "NOODP", + "name": "ROBOTS" + }, + "tag": "meta", + "end": 403, + "start": 367, + "tag_type": 1 + }, + { + "attributes": { + "content": "no-cache", + "http-equiv": "Pragma" + }, + "tag": "meta", + "end": 450, + "start": 403, + "tag_type": 3 + }, + { + "attributes": { + "content": "en-us", + "http-equiv": "Content-Language" + }, + "tag": "meta", + "end": 504, + "start": 450, + "tag_type": 3 + }, + { + "attributes": { + "content": "Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV, electronics, dvd players, digital cameras, mobile phones, pc peripherals, buy, free delivery, uk, online, entertainment, shopping, shop, bargain, special offer", + "id": "_pageTemplate__header__metaKeywords", + "name": "keywords" + }, + "tag": "meta", + "end": 808, + "start": 504, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "meta", + "end": 815, + "start": 808, + "tag_type": 2 + }, + { + "attributes": { + "content": "Play.com - Buy Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV, with free delivery to UK and Europe. Play.com is the top site for dvds, cds and games in the UK. We stock all major movies on DVD.", + "id": "_pageTemplate__header__metaDescription", + "name": "description" + }, + "tag": "meta", + "end": 1113, + "start": 815, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "meta", + "end": 1120, + "start": 1113, + "tag_type": 2 + }, + { + "attributes": { + "content": "text/html; charset=ISO-8859-1", + "http-equiv": "Content-Type" + }, + "tag": "meta", + "end": 1194, + "start": 1120, + "tag_type": 3 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/css/play.min.css", + "type": "text/css", + "id": "_pageTemplate__header__styleSheet", + "rel": "stylesheet" + }, + "tag": "link", + "end": 1338, + "start": 1194, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "link", + "end": 1345, + "start": 1338, + "tag_type": 2 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/img/brand/favicon.ico", + "rel": "icon" + }, + "tag": "link", + "end": 1435, + "start": 1345, + "tag_type": 3 + }, + { + "attributes": { + "href": "http://images.play.com/SiteCSS/Play/Live1/img/brand/favicon.ico", + "rel": "shortcut icon" + }, + "tag": "link", + "end": 1534, + "start": 1435, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/ChartsMenu.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1668, + "start": 1534, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 1677, + "start": 1668, + "tag_type": 2 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/Other.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1806, + "start": 1677, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 1815, + "start": 1806, + "tag_type": 2 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/Reloaded.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 1947, + "start": 1815, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 1956, + "start": 1947, + "tag_type": 2 + }, + { + "attributes": { + "src": "http://images.play.com/SiteScript/Play/Components/JavaScript/cookieTools.js", + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 2091, + "start": 1956, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 2100, + "start": 2091, + "tag_type": 2 + }, + { + "attributes": { + "content": "6hM6+2zExVEjvWx8GYWXLAXLBAOfYdLvkK8mzEZLy6o=", + "name": "verify-v1" + }, + "tag": "meta", + "end": 2180, + "start": 2100, + "tag_type": 3 + }, + { + "start": 2180, + "end": 2206 + }, + { + "attributes": { + "src": "http://images.play.com/sitetrak/cmdatatagutilsA.js", + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2319, + "start": 2206, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 2328, + "start": 2319, + "tag_type": 2 + }, + { + "start": 2328, + "end": 2329 + }, + { + "attributes": { + "src": "http://images.play.com/sitetrak/v40/eluminateA.js", + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2441, + "start": 2329, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "script", + "end": 2450, + "start": 2441, + "tag_type": 2 + }, + { + "start": 2450, + "end": 2452 + }, + { + "attributes": { + "type": "text/javascript", + "language": "javascript1.1" + }, + "tag": "script", + "end": 2508, + "start": 2452, + "tag_type": 1 + }, + { + "start": 2508, + "end": 2664 + }, + { + "attributes": {}, + "tag": "script", + "end": 2673, + "start": 2664, + "tag_type": 2 + }, + { + "start": 2673, + "end": 2677 + }, + { + "attributes": { + "type": "text/javascript" + }, + "tag": "script", + "end": 2708, + "start": 2677, + "tag_type": 1 + }, + { + "start": 2708, + "end": 2928 + }, + { + "attributes": {}, + "tag": "script", + "end": 2937, + "start": 2928, + "tag_type": 2 + }, + { + "start": 2937, + "end": 2938 + }, + { + "attributes": { + "type": "text/javascript" + }, + "tag": "script", + "end": 2969, + "start": 2938, + "tag_type": 1 + }, + { + "start": 2969, + "end": 3077 + }, + { + "attributes": {}, + "tag": "script", + "end": 3086, + "start": 3077, + "tag_type": 2 + }, + { + "start": 3086, + "end": 3110 + }, + { + "attributes": {}, + "tag": "head", + "end": 3117, + "start": 3110, + "tag_type": 2 + }, + { + "start": 3117, + "end": 3118 + }, + { + "attributes": { + "id": "goto-top", + "class": "region-ELEC-404 greyBg goto-top", + "name": "goto-top" + }, + "tag": "body", + "end": 3194, + "start": 3118, + "tag_type": 1 + }, + { + "start": 3194, + "end": 3198 + }, + { + "attributes": { + "id": "mainContainer" + }, + "tag": "div", + "end": 3222, + "start": 3198, + "tag_type": 1 + }, + { + "start": 3222, + "end": 3226 + }, + { + "attributes": { + "class": "header" + }, + "tag": "div", + "end": 3246, + "start": 3226, + "tag_type": 1 + }, + { + "start": 3246, + "end": 3250 + }, + { + "attributes": { + "class": "new_menu" + }, + "tag": "div", + "end": 3272, + "start": 3250, + "tag_type": 1 + }, + { + "attributes": { + "action": "https://www.play.com/OrdersPost.aspx", + "method": "post", + "class": "nomargin" + }, + "tag": "form", + "end": 3355, + "start": 3272, + "tag_type": 1 + }, + { + "attributes": { + "type": "hidden", + "name": "transfer", + "value": "transfer" + }, + "tag": "input", + "end": 3411, + "start": 3355, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "returnURL", + "value": "http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV" + }, + "tag": "input", + "end": 3614, + "start": 3411, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "hpcode", + "value": null + }, + "tag": "input", + "end": 3660, + "start": 3614, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "hpCardMessage", + "value": "no" + }, + "tag": "input", + "end": 3715, + "start": 3660, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "basketPromotionId", + "value": null + }, + "tag": "input", + "end": 3772, + "start": 3715, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "products", + "value": null + }, + "tag": "input", + "end": 3820, + "start": 3772, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "quantity", + "value": null + }, + "tag": "input", + "end": 3868, + "start": 3820, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "promoid", + "value": null + }, + "tag": "input", + "end": 3915, + "start": 3868, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "source", + "value": "0" + }, + "tag": "input", + "end": 3962, + "start": 3915, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "currency", + "value": "257" + }, + "tag": "input", + "end": 4013, + "start": 3962, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "regions", + "value": null + }, + "tag": "input", + "end": 4060, + "start": 4013, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "mpListings", + "value": null + }, + "tag": "input", + "end": 4110, + "start": 4060, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "sitecurrencies", + "value": null + }, + "tag": "input", + "end": 4164, + "start": 4110, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "applyPromotions", + "value": null + }, + "tag": "input", + "end": 4219, + "start": 4164, + "tag_type": 3 + }, + { + "attributes": { + "type": "hidden", + "name": "lispTypes", + "value": null + }, + "tag": "input", + "end": 4268, + "start": 4219, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/menu/my_account.gif", + "name": "My Account", + "type": "image", + "alt": "My Account", + "border": "0", + "class": "my_account" + }, + "tag": "input", + "end": 4426, + "start": 4268, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "form", + "end": 4433, + "start": 4426, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "span", + "end": 4439, + "start": 4433, + "tag_type": 1 + }, + { + "start": 4439, + "end": 4442 + }, + { + "attributes": {}, + "tag": "span", + "end": 4449, + "start": 4442, + "tag_type": 2 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk" + }, + "tag": "a", + "end": 4497, + "start": 4449, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/menu/help_r.gif", + "alt": "Help" + }, + "tag": "img", + "end": 4582, + "start": 4497, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 4586, + "start": 4582, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 4592, + "start": 4586, + "tag_type": 2 + }, + { + "attributes": { + "class": "currency_flags" + }, + "tag": "div", + "end": 4620, + "start": 4592, + "tag_type": 1 + }, + { + "attributes": { + "class": "gbp" + }, + "tag": "div", + "end": 4637, + "start": 4620, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 4640, + "start": 4637, + "tag_type": 1 + }, + { + "start": 4640, + "end": 4641 + }, + { + "attributes": {}, + "tag": "p", + "end": 4645, + "start": 4641, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 4651, + "start": 4645, + "tag_type": 2 + }, + { + "attributes": { + "class": "gbp_active" + }, + "tag": "div", + "end": 4675, + "start": 4651, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&cur=257" + }, + "tag": "a", + "end": 4826, + "start": 4675, + "tag_type": 1 + }, + { + "start": 4826, + "end": 4832 + }, + { + "attributes": {}, + "tag": "a", + "end": 4836, + "start": 4832, + "tag_type": 2 + }, + { + "start": 4836, + "end": 4837 + }, + { + "attributes": {}, + "tag": "div", + "end": 4843, + "start": 4837, + "tag_type": 2 + }, + { + "attributes": { + "class": "euro" + }, + "tag": "div", + "end": 4861, + "start": 4843, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 4864, + "start": 4861, + "tag_type": 1 + }, + { + "start": 4864, + "end": 4865 + }, + { + "attributes": {}, + "tag": "p", + "end": 4869, + "start": 4865, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 4875, + "start": 4869, + "tag_type": 2 + }, + { + "attributes": { + "class": "euro_inactive" + }, + "tag": "div", + "end": 4902, + "start": 4875, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&cur=258" + }, + "tag": "a", + "end": 5053, + "start": 4902, + "tag_type": 1 + }, + { + "start": 5053, + "end": 5058 + }, + { + "attributes": {}, + "tag": "a", + "end": 5062, + "start": 5058, + "tag_type": 2 + }, + { + "start": 5062, + "end": 5063 + }, + { + "attributes": {}, + "tag": "div", + "end": 5069, + "start": 5063, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 5075, + "start": 5069, + "tag_type": 2 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "div", + "end": 5093, + "start": 5075, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 5132, + "start": 5093, + "tag_type": 1 + }, + { + "start": 5132, + "end": 5136 + }, + { + "attributes": {}, + "tag": "tr", + "end": 5140, + "start": 5136, + "tag_type": 1 + }, + { + "start": 5140, + "end": 5144 + }, + { + "attributes": { + "class": "head_l" + }, + "tag": "td", + "end": 5163, + "start": 5144, + "tag_type": 1 + }, + { + "attributes": { + "class": "newlogo" + }, + "tag": "div", + "end": 5184, + "start": 5163, + "tag_type": 1 + }, + { + "start": 5184, + "end": 5188 + }, + { + "attributes": {}, + "tag": "h1", + "end": 5192, + "start": 5188, + "tag_type": 1 + }, + { + "start": 5192, + "end": 5196 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 5208, + "start": 5196, + "tag_type": 1 + }, + { + "start": 5208, + "end": 5212 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/logo.gif", + "alt": "play.com", + "style": "height:38px;width:194px;border-width:0px;" + }, + "tag": "img", + "end": 5351, + "start": 5212, + "tag_type": 3 + }, + { + "start": 5351, + "end": 5355 + }, + { + "attributes": {}, + "tag": "a", + "end": 5359, + "start": 5355, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h1", + "end": 5364, + "start": 5359, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 5370, + "start": 5364, + "tag_type": 2 + }, + { + "attributes": { + "class": "freedelivery" + }, + "tag": "div", + "end": 5396, + "start": 5370, + "tag_type": 1 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 5449, + "start": 5396, + "tag_type": 1 + }, + { + "start": 5449, + "end": 5640 + }, + { + "attributes": {}, + "tag": "script", + "end": 5649, + "start": 5640, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "noscript", + "end": 5659, + "start": 5649, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 5664, + "start": 5659, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/freedelivery.gif", + "alt": "Free delivery on everything!", + "height": "28", + "width": "200" + }, + "tag": "img", + "end": 5805, + "start": 5664, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "div", + "end": 5811, + "start": 5805, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "noscript", + "end": 5822, + "start": 5811, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 5828, + "start": 5822, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 5833, + "start": 5828, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 5837, + "start": 5833, + "tag_type": 1 + }, + { + "attributes": { + "class": "sc" + }, + "tag": "div", + "end": 5853, + "start": 5837, + "tag_type": 1 + }, + { + "start": 5853, + "end": 5857 + }, + { + "attributes": { + "class": "sback_r" + }, + "tag": "div", + "end": 5878, + "start": 5857, + "tag_type": 1 + }, + { + "start": 5878, + "end": 5882 + }, + { + "attributes": { + "class": "searchbox" + }, + "tag": "div", + "end": 5905, + "start": 5882, + "tag_type": 1 + }, + { + "start": 5905, + "end": 5909 + }, + { + "attributes": { + "action": "/Search.aspx", + "method": "get", + "name": "search", + "class": "nomargin" + }, + "tag": "form", + "end": 5981, + "start": 5909, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 6020, + "start": 5981, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 6024, + "start": 6020, + "tag_type": 1 + }, + { + "attributes": { + "class": "region_td" + }, + "tag": "td", + "end": 6046, + "start": 6024, + "tag_type": 1 + }, + { + "attributes": { + "class": "region" + }, + "tag": "div", + "end": 6066, + "start": 6046, + "tag_type": 1 + }, + { + "attributes": { + "name": "searchtype", + "class": "searchtype" + }, + "tag": "select", + "end": 6111, + "start": 6066, + "tag_type": 1 + }, + { + "attributes": { + "value": "allproducts" + }, + "tag": "option", + "end": 6140, + "start": 6111, + "tag_type": 1 + }, + { + "start": 6140, + "end": 6152 + }, + { + "attributes": {}, + "tag": "option", + "end": 6161, + "start": 6152, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 6202, + "start": 6161, + "tag_type": 1 + }, + { + "start": 6202, + "end": 6225 + }, + { + "attributes": {}, + "tag": "option", + "end": 6234, + "start": 6225, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2alldvd" + }, + "tag": "option", + "end": 6260, + "start": 6234, + "tag_type": 1 + }, + { + "start": 6260, + "end": 6263 + }, + { + "attributes": {}, + "tag": "option", + "end": 6272, + "start": 6263, + "tag_type": 2 + }, + { + "attributes": { + "value": "musicall" + }, + "tag": "option", + "end": 6298, + "start": 6272, + "tag_type": 1 + }, + { + "start": 6298, + "end": 6303 + }, + { + "attributes": {}, + "tag": "option", + "end": 6312, + "start": 6303, + "tag_type": 2 + }, + { + "attributes": { + "value": "gameall" + }, + "tag": "option", + "end": 6337, + "start": 6312, + "tag_type": 1 + }, + { + "start": 6337, + "end": 6342 + }, + { + "attributes": {}, + "tag": "option", + "end": 6351, + "start": 6342, + "tag_type": 2 + }, + { + "attributes": { + "value": "bookall" + }, + "tag": "option", + "end": 6376, + "start": 6351, + "tag_type": 1 + }, + { + "start": 6376, + "end": 6381 + }, + { + "attributes": {}, + "tag": "option", + "end": 6390, + "start": 6381, + "tag_type": 2 + }, + { + "attributes": { + "value": "abcdall" + }, + "tag": "option", + "end": 6415, + "start": 6390, + "tag_type": 1 + }, + { + "start": 6415, + "end": 6425 + }, + { + "attributes": {}, + "tag": "option", + "end": 6434, + "start": 6425, + "tag_type": 2 + }, + { + "attributes": { + "value": "CAL" + }, + "tag": "option", + "end": 6455, + "start": 6434, + "tag_type": 1 + }, + { + "start": 6455, + "end": 6464 + }, + { + "attributes": {}, + "tag": "option", + "end": 6473, + "start": 6464, + "tag_type": 2 + }, + { + "attributes": { + "selected": null, + "value": "ELEC" + }, + "tag": "option", + "end": 6503, + "start": 6473, + "tag_type": 1 + }, + { + "start": 6503, + "end": 6514 + }, + { + "attributes": {}, + "tag": "option", + "end": 6523, + "start": 6514, + "tag_type": 2 + }, + { + "attributes": { + "value": "PCSH" + }, + "tag": "option", + "end": 6545, + "start": 6523, + "tag_type": 1 + }, + { + "start": 6545, + "end": 6554 + }, + { + "attributes": {}, + "tag": "option", + "end": 6563, + "start": 6554, + "tag_type": 2 + }, + { + "attributes": { + "value": "GADG" + }, + "tag": "option", + "end": 6585, + "start": 6563, + "tag_type": 1 + }, + { + "start": 6585, + "end": 6592 + }, + { + "attributes": {}, + "tag": "option", + "end": 6601, + "start": 6592, + "tag_type": 2 + }, + { + "attributes": { + "value": "MBLS" + }, + "tag": "option", + "end": 6623, + "start": 6601, + "tag_type": 1 + }, + { + "start": 6623, + "end": 6636 + }, + { + "attributes": {}, + "tag": "option", + "end": 6645, + "start": 6636, + "tag_type": 2 + }, + { + "attributes": { + "value": "mobileall" + }, + "tag": "option", + "end": 6672, + "start": 6645, + "tag_type": 1 + }, + { + "start": 6672, + "end": 6686 + }, + { + "attributes": {}, + "tag": "option", + "end": 6695, + "start": 6686, + "tag_type": 2 + }, + { + "attributes": { + "value": "clothingall" + }, + "tag": "option", + "end": 6724, + "start": 6695, + "tag_type": 1 + }, + { + "start": 6724, + "end": 6732 + }, + { + "attributes": {}, + "tag": "option", + "end": 6741, + "start": 6732, + "tag_type": 2 + }, + { + "attributes": { + "value": "TICKETS_ALL" + }, + "tag": "option", + "end": 6770, + "start": 6741, + "tag_type": 1 + }, + { + "start": 6770, + "end": 6777 + }, + { + "attributes": {}, + "tag": "option", + "end": 6786, + "start": 6777, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 6827, + "start": 6786, + "tag_type": 1 + }, + { + "start": 6827, + "end": 6850 + }, + { + "attributes": {}, + "tag": "option", + "end": 6859, + "start": 6850, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2alldvd" + }, + "tag": "option", + "end": 6885, + "start": 6859, + "tag_type": 1 + }, + { + "start": 6885, + "end": 6888 + }, + { + "attributes": {}, + "tag": "option", + "end": 6897, + "start": 6888, + "tag_type": 2 + }, + { + "attributes": { + "value": "R2" + }, + "tag": "option", + "end": 6917, + "start": 6897, + "tag_type": 1 + }, + { + "start": 6917, + "end": 6924 + }, + { + "attributes": {}, + "tag": "option", + "end": 6933, + "start": 6924, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2title" + }, + "tag": "option", + "end": 6958, + "start": 6933, + "tag_type": 1 + }, + { + "start": 6958, + "end": 6971 + }, + { + "attributes": {}, + "tag": "option", + "end": 6980, + "start": 6971, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2actor" + }, + "tag": "option", + "end": 7005, + "start": 6980, + "tag_type": 1 + }, + { + "start": 7005, + "end": 7018 + }, + { + "attributes": {}, + "tag": "option", + "end": 7027, + "start": 7018, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2director" + }, + "tag": "option", + "end": 7055, + "start": 7027, + "tag_type": 1 + }, + { + "start": 7055, + "end": 7071 + }, + { + "attributes": {}, + "tag": "option", + "end": 7080, + "start": 7071, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2language" + }, + "tag": "option", + "end": 7108, + "start": 7080, + "tag_type": 1 + }, + { + "start": 7108, + "end": 7124 + }, + { + "attributes": {}, + "tag": "option", + "end": 7133, + "start": 7124, + "tag_type": 2 + }, + { + "attributes": { + "value": "r2subtitles" + }, + "tag": "option", + "end": 7162, + "start": 7133, + "tag_type": 1 + }, + { + "start": 7162, + "end": 7178 + }, + { + "attributes": {}, + "tag": "option", + "end": 7187, + "start": 7178, + "tag_type": 2 + }, + { + "attributes": { + "value": "BLU" + }, + "tag": "option", + "end": 7208, + "start": 7187, + "tag_type": 1 + }, + { + "start": 7208, + "end": 7219 + }, + { + "attributes": {}, + "tag": "option", + "end": 7228, + "start": 7219, + "tag_type": 2 + }, + { + "attributes": { + "value": "HD" + }, + "tag": "option", + "end": 7248, + "start": 7228, + "tag_type": 1 + }, + { + "start": 7248, + "end": 7258 + }, + { + "attributes": {}, + "tag": "option", + "end": 7267, + "start": 7258, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 7308, + "start": 7267, + "tag_type": 1 + }, + { + "start": 7308, + "end": 7331 + }, + { + "attributes": {}, + "tag": "option", + "end": 7340, + "start": 7331, + "tag_type": 2 + }, + { + "attributes": { + "value": "musicall" + }, + "tag": "option", + "end": 7366, + "start": 7340, + "tag_type": 1 + }, + { + "start": 7366, + "end": 7371 + }, + { + "attributes": {}, + "tag": "option", + "end": 7380, + "start": 7371, + "tag_type": 2 + }, + { + "attributes": { + "value": "cdall" + }, + "tag": "option", + "end": 7403, + "start": 7380, + "tag_type": 1 + }, + { + "start": 7403, + "end": 7409 + }, + { + "attributes": {}, + "tag": "option", + "end": 7418, + "start": 7409, + "tag_type": 2 + }, + { + "attributes": { + "value": "downloadall" + }, + "tag": "option", + "end": 7447, + "start": 7418, + "tag_type": 1 + }, + { + "start": 7447, + "end": 7460 + }, + { + "attributes": {}, + "tag": "option", + "end": 7469, + "start": 7460, + "tag_type": 2 + }, + { + "attributes": { + "value": "rmtitle" + }, + "tag": "option", + "end": 7494, + "start": 7469, + "tag_type": 1 + }, + { + "start": 7494, + "end": 7507 + }, + { + "attributes": {}, + "tag": "option", + "end": 7516, + "start": 7507, + "tag_type": 2 + }, + { + "attributes": { + "value": "musicartist" + }, + "tag": "option", + "end": 7545, + "start": 7516, + "tag_type": 1 + }, + { + "start": 7545, + "end": 7555 + }, + { + "attributes": {}, + "tag": "option", + "end": 7564, + "start": 7555, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 7605, + "start": 7564, + "tag_type": 1 + }, + { + "start": 7605, + "end": 7628 + }, + { + "attributes": {}, + "tag": "option", + "end": 7637, + "start": 7628, + "tag_type": 2 + }, + { + "attributes": { + "value": "gameall" + }, + "tag": "option", + "end": 7662, + "start": 7637, + "tag_type": 1 + }, + { + "start": 7662, + "end": 7667 + }, + { + "attributes": {}, + "tag": "option", + "end": 7676, + "start": 7667, + "tag_type": 2 + }, + { + "attributes": { + "value": "PC" + }, + "tag": "option", + "end": 7696, + "start": 7676, + "tag_type": 1 + }, + { + "start": 7696, + "end": 7702 + }, + { + "attributes": {}, + "tag": "option", + "end": 7711, + "start": 7702, + "tag_type": 2 + }, + { + "attributes": { + "value": "PS2" + }, + "tag": "option", + "end": 7732, + "start": 7711, + "tag_type": 1 + }, + { + "start": 7732, + "end": 7739 + }, + { + "attributes": {}, + "tag": "option", + "end": 7748, + "start": 7739, + "tag_type": 2 + }, + { + "attributes": { + "value": "PS3" + }, + "tag": "option", + "end": 7769, + "start": 7748, + "tag_type": 1 + }, + { + "start": 7769, + "end": 7776 + }, + { + "attributes": {}, + "tag": "option", + "end": 7785, + "start": 7776, + "tag_type": 2 + }, + { + "attributes": { + "value": "PSP" + }, + "tag": "option", + "end": 7806, + "start": 7785, + "tag_type": 1 + }, + { + "start": 7806, + "end": 7813 + }, + { + "attributes": {}, + "tag": "option", + "end": 7822, + "start": 7813, + "tag_type": 2 + }, + { + "attributes": { + "value": "XBOX" + }, + "tag": "option", + "end": 7844, + "start": 7822, + "tag_type": 1 + }, + { + "start": 7844, + "end": 7852 + }, + { + "attributes": {}, + "tag": "option", + "end": 7861, + "start": 7852, + "tag_type": 2 + }, + { + "attributes": { + "value": "X360" + }, + "tag": "option", + "end": 7883, + "start": 7861, + "tag_type": 1 + }, + { + "start": 7883, + "end": 7895 + }, + { + "attributes": {}, + "tag": "option", + "end": 7904, + "start": 7895, + "tag_type": 2 + }, + { + "attributes": { + "value": "DS" + }, + "tag": "option", + "end": 7924, + "start": 7904, + "tag_type": 1 + }, + { + "start": 7924, + "end": 7930 + }, + { + "attributes": {}, + "tag": "option", + "end": 7939, + "start": 7930, + "tag_type": 2 + }, + { + "attributes": { + "value": "GBA" + }, + "tag": "option", + "end": 7960, + "start": 7939, + "tag_type": 1 + }, + { + "start": 7960, + "end": 7967 + }, + { + "attributes": {}, + "tag": "option", + "end": 7976, + "start": 7967, + "tag_type": 2 + }, + { + "attributes": { + "value": "GC" + }, + "tag": "option", + "end": 7996, + "start": 7976, + "tag_type": 1 + }, + { + "start": 7996, + "end": 8008 + }, + { + "attributes": {}, + "tag": "option", + "end": 8017, + "start": 8008, + "tag_type": 2 + }, + { + "attributes": { + "value": "WII" + }, + "tag": "option", + "end": 8038, + "start": 8017, + "tag_type": 1 + }, + { + "start": 8038, + "end": 8045 + }, + { + "attributes": {}, + "tag": "option", + "end": 8054, + "start": 8045, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 8095, + "start": 8054, + "tag_type": 1 + }, + { + "start": 8095, + "end": 8118 + }, + { + "attributes": {}, + "tag": "option", + "end": 8127, + "start": 8118, + "tag_type": 2 + }, + { + "attributes": { + "value": "bookall" + }, + "tag": "option", + "end": 8152, + "start": 8127, + "tag_type": 1 + }, + { + "start": 8152, + "end": 8157 + }, + { + "attributes": {}, + "tag": "option", + "end": 8166, + "start": 8157, + "tag_type": 2 + }, + { + "attributes": { + "value": "booktitle" + }, + "tag": "option", + "end": 8193, + "start": 8166, + "tag_type": 1 + }, + { + "start": 8193, + "end": 8202 + }, + { + "attributes": {}, + "tag": "option", + "end": 8211, + "start": 8202, + "tag_type": 2 + }, + { + "attributes": { + "value": "bookauthor" + }, + "tag": "option", + "end": 8239, + "start": 8211, + "tag_type": 1 + }, + { + "start": 8239, + "end": 8249 + }, + { + "attributes": {}, + "tag": "option", + "end": 8258, + "start": 8249, + "tag_type": 2 + }, + { + "attributes": { + "value": "bookisbn" + }, + "tag": "option", + "end": 8284, + "start": 8258, + "tag_type": 1 + }, + { + "start": 8284, + "end": 8292 + }, + { + "attributes": {}, + "tag": "option", + "end": 8301, + "start": 8292, + "tag_type": 2 + }, + { + "attributes": { + "value": "-----------------------" + }, + "tag": "option", + "end": 8342, + "start": 8301, + "tag_type": 1 + }, + { + "start": 8342, + "end": 8365 + }, + { + "attributes": {}, + "tag": "option", + "end": 8374, + "start": 8365, + "tag_type": 2 + }, + { + "attributes": { + "value": "abcdall" + }, + "tag": "option", + "end": 8399, + "start": 8374, + "tag_type": 1 + }, + { + "start": 8399, + "end": 8409 + }, + { + "attributes": {}, + "tag": "option", + "end": 8418, + "start": 8409, + "tag_type": 2 + }, + { + "attributes": { + "value": "abcdtitle" + }, + "tag": "option", + "end": 8445, + "start": 8418, + "tag_type": 1 + }, + { + "start": 8445, + "end": 8454 + }, + { + "attributes": {}, + "tag": "option", + "end": 8463, + "start": 8454, + "tag_type": 2 + }, + { + "attributes": { + "value": "abcdauthor" + }, + "tag": "option", + "end": 8491, + "start": 8463, + "tag_type": 1 + }, + { + "start": 8491, + "end": 8501 + }, + { + "attributes": {}, + "tag": "option", + "end": 8510, + "start": 8501, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "select", + "end": 8519, + "start": 8510, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 8525, + "start": 8519, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 8530, + "start": 8525, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 8534, + "start": 8530, + "tag_type": 1 + }, + { + "attributes": { + "class": "data" + }, + "tag": "div", + "end": 8552, + "start": 8534, + "tag_type": 1 + }, + { + "attributes": { + "type": "text", + "name": "searchstring", + "value": null + }, + "tag": "input", + "end": 8602, + "start": 8552, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 8608, + "start": 8602, + "tag_type": 2 + }, + { + "attributes": { + "type": "hidden", + "name": "page", + "value": "search" + }, + "tag": "input", + "end": 8656, + "start": 8608, + "tag_type": 1 + }, + { + "attributes": { + "type": "hidden", + "name": "pa", + "value": "search" + }, + "tag": "input", + "end": 8702, + "start": 8656, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 8707, + "start": 8702, + "tag_type": 2 + }, + { + "attributes": { + "class": "action_td" + }, + "tag": "td", + "end": 8729, + "start": 8707, + "tag_type": 1 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 8749, + "start": 8729, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/button/search.gif", + "name": "go", + "type": "image", + "alt": "Search", + "border": "0", + "id": "go" + }, + "tag": "input", + "end": 8883, + "start": 8749, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "div", + "end": 8889, + "start": 8883, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 8894, + "start": 8889, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 8899, + "start": 8894, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 8907, + "start": 8899, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "form", + "end": 8914, + "start": 8907, + "tag_type": 2 + }, + { + "start": 8914, + "end": 8918 + }, + { + "attributes": {}, + "tag": "div", + "end": 8924, + "start": 8918, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 8930, + "start": 8924, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 8936, + "start": 8930, + "tag_type": 2 + }, + { + "attributes": { + "class": "head_r" + }, + "tag": "td", + "end": 8955, + "start": 8936, + "tag_type": 1 + }, + { + "attributes": { + "class": "sbasket" + }, + "tag": "div", + "end": 8976, + "start": 8955, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 8980, + "start": 8976, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/ShoppingBasket.html" + }, + "tag": "a", + "end": 9024, + "start": 8980, + "tag_type": 1 + }, + { + "start": 9024, + "end": 9042 + }, + { + "attributes": {}, + "tag": "a", + "end": 9046, + "start": 9042, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h3", + "end": 9051, + "start": 9046, + "tag_type": 2 + }, + { + "attributes": { + "class": "text_empty" + }, + "tag": "div", + "end": 9075, + "start": 9051, + "tag_type": 1 + }, + { + "start": 9075, + "end": 9082 + }, + { + "attributes": {}, + "tag": "p", + "end": 9085, + "start": 9082, + "tag_type": 1 + }, + { + "start": 9085, + "end": 9105 + }, + { + "attributes": {}, + "tag": "p", + "end": 9109, + "start": 9105, + "tag_type": 2 + }, + { + "start": 9109, + "end": 9113 + }, + { + "attributes": {}, + "tag": "div", + "end": 9119, + "start": 9113, + "tag_type": 2 + }, + { + "start": 9119, + "end": 9123 + }, + { + "attributes": {}, + "tag": "div", + "end": 9129, + "start": 9123, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 9134, + "start": 9129, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 9139, + "start": 9134, + "tag_type": 2 + }, + { + "start": 9139, + "end": 9143 + }, + { + "attributes": {}, + "tag": "table", + "end": 9151, + "start": 9143, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 9157, + "start": 9151, + "tag_type": 2 + }, + { + "start": 9157, + "end": 9169 + }, + { + "attributes": { + "id": "navbar_contain" + }, + "tag": "div", + "end": 9194, + "start": 9169, + "tag_type": 1 + }, + { + "start": 9194, + "end": 9206 + }, + { + "attributes": { + "id": "navbar" + }, + "tag": "ul", + "end": 9222, + "start": 9206, + "tag_type": 1 + }, + { + "start": 9222, + "end": 9234 + }, + { + "attributes": { + "id": "nav_home" + }, + "tag": "li", + "end": 9252, + "start": 9234, + "tag_type": 1 + }, + { + "start": 9252, + "end": 9264 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 9276, + "start": 9264, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 9282, + "start": 9276, + "tag_type": 1 + }, + { + "start": 9282, + "end": 9286 + }, + { + "attributes": {}, + "tag": "span", + "end": 9293, + "start": 9286, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 9297, + "start": 9293, + "tag_type": 2 + }, + { + "start": 9297, + "end": 9321 + }, + { + "attributes": {}, + "tag": "li", + "end": 9326, + "start": 9321, + "tag_type": 2 + }, + { + "start": 9326, + "end": 9338 + }, + { + "attributes": { + "id": "nav_dvd" + }, + "tag": "li", + "end": 9355, + "start": 9338, + "tag_type": 1 + }, + { + "start": 9355, + "end": 9367 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9405, + "start": 9367, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 9411, + "start": 9405, + "tag_type": 1 + }, + { + "start": 9411, + "end": 9414 + }, + { + "attributes": {}, + "tag": "span", + "end": 9421, + "start": 9414, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 9425, + "start": 9421, + "tag_type": 2 + }, + { + "start": 9425, + "end": 9465 + }, + { + "attributes": {}, + "tag": "ul", + "end": 9469, + "start": 9465, + "tag_type": 1 + }, + { + "start": 9469, + "end": 9513 + }, + { + "attributes": {}, + "tag": "li", + "end": 9517, + "start": 9513, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9555, + "start": 9517, + "tag_type": 1 + }, + { + "start": 9555, + "end": 9558 + }, + { + "attributes": {}, + "tag": "a", + "end": 9562, + "start": 9558, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 9567, + "start": 9562, + "tag_type": 2 + }, + { + "start": 9567, + "end": 9611 + }, + { + "attributes": {}, + "tag": "li", + "end": 9615, + "start": 9611, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/-/55/70/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 9678, + "start": 9615, + "tag_type": 1 + }, + { + "start": 9678, + "end": 9687 + }, + { + "attributes": {}, + "tag": "a", + "end": 9691, + "start": 9687, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 9696, + "start": 9691, + "tag_type": 2 + }, + { + "start": 9696, + "end": 9740 + }, + { + "attributes": {}, + "tag": "li", + "end": 9744, + "start": 9740, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/-/46/61/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 9807, + "start": 9744, + "tag_type": 1 + }, + { + "start": 9807, + "end": 9820 + }, + { + "attributes": {}, + "tag": "a", + "end": 9824, + "start": 9820, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 9829, + "start": 9824, + "tag_type": 2 + }, + { + "start": 9829, + "end": 9873 + }, + { + "attributes": {}, + "tag": "li", + "end": 9877, + "start": 9873, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MusicDVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 9922, + "start": 9877, + "tag_type": 1 + }, + { + "start": 9922, + "end": 9931 + }, + { + "attributes": {}, + "tag": "a", + "end": 9935, + "start": 9931, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 9940, + "start": 9935, + "tag_type": 2 + }, + { + "start": 9940, + "end": 9984 + }, + { + "attributes": {}, + "tag": "li", + "end": 9988, + "start": 9984, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10069, + "start": 9988, + "tag_type": 1 + }, + { + "start": 10069, + "end": 10080 + }, + { + "attributes": {}, + "tag": "a", + "end": 10084, + "start": 10080, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10089, + "start": 10084, + "tag_type": 2 + }, + { + "start": 10089, + "end": 10133 + }, + { + "attributes": {}, + "tag": "li", + "end": 10137, + "start": 10133, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/392/492/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10210, + "start": 10137, + "tag_type": 1 + }, + { + "start": 10210, + "end": 10226 + }, + { + "attributes": {}, + "tag": "a", + "end": 10230, + "start": 10226, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10235, + "start": 10230, + "tag_type": 2 + }, + { + "start": 10235, + "end": 10279 + }, + { + "attributes": {}, + "tag": "li", + "end": 10283, + "start": 10279, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/723/931/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10358, + "start": 10283, + "tag_type": 1 + }, + { + "start": 10358, + "end": 10376 + }, + { + "attributes": {}, + "tag": "a", + "end": 10380, + "start": 10376, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10385, + "start": 10380, + "tag_type": 2 + }, + { + "start": 10385, + "end": 10429 + }, + { + "attributes": {}, + "tag": "li", + "end": 10433, + "start": 10429, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/565/750/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10506, + "start": 10433, + "tag_type": 1 + }, + { + "start": 10506, + "end": 10518 + }, + { + "attributes": {}, + "tag": "a", + "end": 10522, + "start": 10518, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10527, + "start": 10522, + "tag_type": 2 + }, + { + "start": 10527, + "end": 10571 + }, + { + "attributes": {}, + "tag": "li", + "end": 10575, + "start": 10571, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/184/241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 10644, + "start": 10575, + "tag_type": 1 + }, + { + "start": 10644, + "end": 10654 + }, + { + "attributes": {}, + "tag": "a", + "end": 10658, + "start": 10654, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10663, + "start": 10658, + "tag_type": 2 + }, + { + "start": 10663, + "end": 10707 + }, + { + "attributes": {}, + "tag": "li", + "end": 10711, + "start": 10707, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=dvd" + }, + "tag": "a", + "end": 10784, + "start": 10711, + "tag_type": 1 + }, + { + "start": 10784, + "end": 10798 + }, + { + "attributes": {}, + "tag": "a", + "end": 10802, + "start": 10798, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 10807, + "start": 10802, + "tag_type": 2 + }, + { + "start": 10807, + "end": 10851 + }, + { + "attributes": {}, + "tag": "ul", + "end": 10856, + "start": 10851, + "tag_type": 2 + }, + { + "start": 10856, + "end": 10884 + }, + { + "attributes": {}, + "tag": "li", + "end": 10889, + "start": 10884, + "tag_type": 2 + }, + { + "start": 10889, + "end": 10901 + }, + { + "attributes": { + "id": "nav_blu" + }, + "tag": "li", + "end": 10918, + "start": 10901, + "tag_type": 1 + }, + { + "start": 10918, + "end": 10930 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 10972, + "start": 10930, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 10978, + "start": 10972, + "tag_type": 1 + }, + { + "start": 10978, + "end": 10985 + }, + { + "attributes": {}, + "tag": "span", + "end": 10992, + "start": 10985, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 10996, + "start": 10992, + "tag_type": 2 + }, + { + "start": 10996, + "end": 11036 + }, + { + "attributes": {}, + "tag": "ul", + "end": 11040, + "start": 11036, + "tag_type": 1 + }, + { + "start": 11040, + "end": 11084 + }, + { + "attributes": {}, + "tag": "li", + "end": 11088, + "start": 11084, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 11130, + "start": 11088, + "tag_type": 1 + }, + { + "start": 11130, + "end": 11134 + }, + { + "attributes": {}, + "tag": "a", + "end": 11138, + "start": 11134, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11143, + "start": 11138, + "tag_type": 2 + }, + { + "start": 11143, + "end": 11187 + }, + { + "attributes": {}, + "tag": "li", + "end": 11191, + "start": 11187, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/TopSellers.html" + }, + "tag": "a", + "end": 11233, + "start": 11191, + "tag_type": 1 + }, + { + "start": 11233, + "end": 11252 + }, + { + "attributes": {}, + "tag": "a", + "end": 11256, + "start": 11252, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11261, + "start": 11256, + "tag_type": 2 + }, + { + "start": 11261, + "end": 11305 + }, + { + "attributes": {}, + "tag": "li", + "end": 11309, + "start": 11305, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 11354, + "start": 11309, + "tag_type": 1 + }, + { + "start": 11354, + "end": 11371 + }, + { + "attributes": {}, + "tag": "a", + "end": 11375, + "start": 11371, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11380, + "start": 11375, + "tag_type": 2 + }, + { + "start": 11380, + "end": 11424 + }, + { + "attributes": {}, + "tag": "li", + "end": 11428, + "start": 11424, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/PromoList.html" + }, + "tag": "a", + "end": 11469, + "start": 11428, + "tag_type": 1 + }, + { + "start": 11469, + "end": 11485 + }, + { + "attributes": {}, + "tag": "a", + "end": 11489, + "start": 11485, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11494, + "start": 11489, + "tag_type": 2 + }, + { + "start": 11494, + "end": 11538 + }, + { + "attributes": {}, + "tag": "li", + "end": 11542, + "start": 11538, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/836/1052/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 11624, + "start": 11542, + "tag_type": 1 + }, + { + "start": 11624, + "end": 11639 + }, + { + "attributes": {}, + "tag": "a", + "end": 11643, + "start": 11639, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11648, + "start": 11643, + "tag_type": 2 + }, + { + "start": 11648, + "end": 11692 + }, + { + "attributes": {}, + "tag": "li", + "end": 11696, + "start": 11692, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 11777, + "start": 11696, + "tag_type": 1 + }, + { + "start": 11777, + "end": 11783 + }, + { + "attributes": {}, + "tag": "a", + "end": 11787, + "start": 11783, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11792, + "start": 11787, + "tag_type": 2 + }, + { + "start": 11792, + "end": 11836 + }, + { + "attributes": {}, + "tag": "li", + "end": 11840, + "start": 11836, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation3/3-/164637/2-/Promo.html" + }, + "tag": "a", + "end": 11894, + "start": 11840, + "tag_type": 1 + }, + { + "start": 11894, + "end": 11906 + }, + { + "attributes": {}, + "tag": "a", + "end": 11910, + "start": 11906, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 11915, + "start": 11910, + "tag_type": 2 + }, + { + "start": 11915, + "end": 11959 + }, + { + "attributes": {}, + "tag": "li", + "end": 11963, + "start": 11959, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation3/6-/RegionHome.html" + }, + "tag": "a", + "end": 12012, + "start": 11963, + "tag_type": 1 + }, + { + "start": 12012, + "end": 12021 + }, + { + "attributes": {}, + "tag": "a", + "end": 12025, + "start": 12021, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12030, + "start": 12025, + "tag_type": 2 + }, + { + "start": 12030, + "end": 12074 + }, + { + "attributes": {}, + "tag": "li", + "end": 12078, + "start": 12074, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12159, + "start": 12078, + "tag_type": 1 + }, + { + "start": 12159, + "end": 12178 + }, + { + "attributes": {}, + "tag": "a", + "end": 12182, + "start": 12178, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12187, + "start": 12182, + "tag_type": 2 + }, + { + "start": 12187, + "end": 12231 + }, + { + "attributes": {}, + "tag": "ul", + "end": 12236, + "start": 12231, + "tag_type": 2 + }, + { + "start": 12236, + "end": 12264 + }, + { + "attributes": {}, + "tag": "li", + "end": 12269, + "start": 12264, + "tag_type": 2 + }, + { + "start": 12269, + "end": 12281 + }, + { + "attributes": { + "id": "nav_music" + }, + "tag": "li", + "end": 12300, + "start": 12281, + "tag_type": 1 + }, + { + "start": 12300, + "end": 12312 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 12351, + "start": 12312, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 12357, + "start": 12351, + "tag_type": 1 + }, + { + "start": 12357, + "end": 12362 + }, + { + "attributes": {}, + "tag": "span", + "end": 12369, + "start": 12362, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 12373, + "start": 12369, + "tag_type": 2 + }, + { + "start": 12373, + "end": 12413 + }, + { + "attributes": {}, + "tag": "ul", + "end": 12417, + "start": 12413, + "tag_type": 1 + }, + { + "start": 12417, + "end": 12461 + }, + { + "attributes": {}, + "tag": "li", + "end": 12465, + "start": 12461, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 12504, + "start": 12465, + "tag_type": 1 + }, + { + "start": 12504, + "end": 12506 + }, + { + "attributes": {}, + "tag": "a", + "end": 12510, + "start": 12506, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12515, + "start": 12510, + "tag_type": 2 + }, + { + "start": 12515, + "end": 12559 + }, + { + "attributes": {}, + "tag": "li", + "end": 12563, + "start": 12559, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/-/27/30/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12627, + "start": 12563, + "tag_type": 1 + }, + { + "start": 12627, + "end": 12639 + }, + { + "attributes": {}, + "tag": "a", + "end": 12643, + "start": 12639, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12648, + "start": 12643, + "tag_type": 2 + }, + { + "start": 12648, + "end": 12692 + }, + { + "attributes": {}, + "tag": "li", + "end": 12696, + "start": 12692, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/959/1208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 12775, + "start": 12696, + "tag_type": 1 + }, + { + "start": 12775, + "end": 12790 + }, + { + "attributes": {}, + "tag": "a", + "end": 12794, + "start": 12790, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12799, + "start": 12794, + "tag_type": 2 + }, + { + "start": 12799, + "end": 12843 + }, + { + "attributes": {}, + "tag": "li", + "end": 12847, + "start": 12843, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MP3-Download/6-/DigitalHome.html" + }, + "tag": "a", + "end": 12897, + "start": 12847, + "tag_type": 1 + }, + { + "start": 12897, + "end": 12910 + }, + { + "attributes": {}, + "tag": "a", + "end": 12914, + "start": 12910, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 12919, + "start": 12914, + "tag_type": 2 + }, + { + "start": 12919, + "end": 12963 + }, + { + "attributes": {}, + "tag": "li", + "end": 12967, + "start": 12963, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MusicDVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 13012, + "start": 12967, + "tag_type": 1 + }, + { + "start": 13012, + "end": 13021 + }, + { + "attributes": {}, + "tag": "a", + "end": 13025, + "start": 13021, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13030, + "start": 13025, + "tag_type": 2 + }, + { + "start": 13030, + "end": 13074 + }, + { + "attributes": {}, + "tag": "li", + "end": 13078, + "start": 13074, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13159, + "start": 13078, + "tag_type": 1 + }, + { + "start": 13159, + "end": 13178 + }, + { + "attributes": {}, + "tag": "a", + "end": 13182, + "start": 13178, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13187, + "start": 13182, + "tag_type": 2 + }, + { + "start": 13187, + "end": 13231 + }, + { + "attributes": {}, + "tag": "li", + "end": 13235, + "start": 13231, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 13307, + "start": 13235, + "tag_type": 1 + }, + { + "start": 13307, + "end": 13321 + }, + { + "attributes": {}, + "tag": "a", + "end": 13325, + "start": 13321, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13330, + "start": 13325, + "tag_type": 2 + }, + { + "start": 13330, + "end": 13374 + }, + { + "attributes": {}, + "tag": "li", + "end": 13378, + "start": 13374, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/570/755/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13451, + "start": 13378, + "tag_type": 1 + }, + { + "start": 13451, + "end": 13464 + }, + { + "attributes": {}, + "tag": "a", + "end": 13468, + "start": 13464, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13473, + "start": 13468, + "tag_type": 2 + }, + { + "start": 13473, + "end": 13517 + }, + { + "attributes": {}, + "tag": "li", + "end": 13521, + "start": 13517, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/184/241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 13590, + "start": 13521, + "tag_type": 1 + }, + { + "start": 13590, + "end": 13601 + }, + { + "attributes": {}, + "tag": "a", + "end": 13605, + "start": 13601, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13610, + "start": 13605, + "tag_type": 2 + }, + { + "start": 13610, + "end": 13654 + }, + { + "attributes": {}, + "tag": "li", + "end": 13658, + "start": 13654, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=cd" + }, + "tag": "a", + "end": 13730, + "start": 13658, + "tag_type": 1 + }, + { + "start": 13730, + "end": 13743 + }, + { + "attributes": {}, + "tag": "a", + "end": 13747, + "start": 13743, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 13752, + "start": 13747, + "tag_type": 2 + }, + { + "start": 13752, + "end": 13796 + }, + { + "attributes": {}, + "tag": "ul", + "end": 13801, + "start": 13796, + "tag_type": 2 + }, + { + "start": 13801, + "end": 13829 + }, + { + "attributes": {}, + "tag": "li", + "end": 13834, + "start": 13829, + "tag_type": 2 + }, + { + "start": 13834, + "end": 13846 + }, + { + "attributes": { + "id": "nav_tickets" + }, + "tag": "li", + "end": 13867, + "start": 13846, + "tag_type": 1 + }, + { + "start": 13867, + "end": 13879 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 13930, + "start": 13879, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 13936, + "start": 13930, + "tag_type": 1 + }, + { + "start": 13936, + "end": 13943 + }, + { + "attributes": {}, + "tag": "span", + "end": 13950, + "start": 13943, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 13954, + "start": 13950, + "tag_type": 2 + }, + { + "start": 13954, + "end": 13994 + }, + { + "attributes": {}, + "tag": "ul", + "end": 13998, + "start": 13994, + "tag_type": 1 + }, + { + "start": 13998, + "end": 14042 + }, + { + "attributes": {}, + "tag": "li", + "end": 14046, + "start": 14042, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 14097, + "start": 14046, + "tag_type": 1 + }, + { + "start": 14097, + "end": 14101 + }, + { + "attributes": {}, + "tag": "a", + "end": 14105, + "start": 14101, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14110, + "start": 14105, + "tag_type": 2 + }, + { + "start": 14110, + "end": 14154 + }, + { + "attributes": {}, + "tag": "li", + "end": 14158, + "start": 14154, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/959/1208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14237, + "start": 14158, + "tag_type": 1 + }, + { + "start": 14237, + "end": 14252 + }, + { + "attributes": {}, + "tag": "a", + "end": 14256, + "start": 14252, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14261, + "start": 14256, + "tag_type": 2 + }, + { + "start": 14261, + "end": 14305 + }, + { + "attributes": {}, + "tag": "li", + "end": 14309, + "start": 14305, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/968/1217/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14388, + "start": 14309, + "tag_type": 1 + }, + { + "start": 14388, + "end": 14402 + }, + { + "attributes": {}, + "tag": "a", + "end": 14406, + "start": 14402, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14411, + "start": 14406, + "tag_type": 2 + }, + { + "start": 14411, + "end": 14455 + }, + { + "attributes": {}, + "tag": "li", + "end": 14459, + "start": 14455, + "tag_type": 1 + }, + { + "attributes": { + "href": "/GenreBrowse.aspx?r=TICKETS_EVENT&p=969&g=1218" + }, + "tag": "a", + "end": 14516, + "start": 14459, + "tag_type": 1 + }, + { + "start": 14516, + "end": 14522 + }, + { + "attributes": {}, + "tag": "a", + "end": 14526, + "start": 14522, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14531, + "start": 14526, + "tag_type": 2 + }, + { + "start": 14531, + "end": 14575 + }, + { + "attributes": {}, + "tag": "li", + "end": 14579, + "start": 14575, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/975/1224/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14658, + "start": 14579, + "tag_type": 1 + }, + { + "start": 14658, + "end": 14664 + }, + { + "attributes": {}, + "tag": "a", + "end": 14668, + "start": 14664, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14673, + "start": 14668, + "tag_type": 2 + }, + { + "start": 14673, + "end": 14717 + }, + { + "attributes": {}, + "tag": "li", + "end": 14721, + "start": 14717, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/-/1079/1315/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 14801, + "start": 14721, + "tag_type": 1 + }, + { + "start": 14801, + "end": 14812 + }, + { + "attributes": {}, + "tag": "a", + "end": 14816, + "start": 14812, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14821, + "start": 14816, + "tag_type": 2 + }, + { + "start": 14821, + "end": 14865 + }, + { + "attributes": {}, + "tag": "li", + "end": 14869, + "start": 14865, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 14941, + "start": 14869, + "tag_type": 1 + }, + { + "start": 14941, + "end": 14955 + }, + { + "attributes": {}, + "tag": "a", + "end": 14959, + "start": 14955, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 14964, + "start": 14959, + "tag_type": 2 + }, + { + "start": 14964, + "end": 15008 + }, + { + "attributes": {}, + "tag": "li", + "end": 15012, + "start": 15008, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=ticket" + }, + "tag": "a", + "end": 15088, + "start": 15012, + "tag_type": 1 + }, + { + "start": 15088, + "end": 15105 + }, + { + "attributes": {}, + "tag": "a", + "end": 15109, + "start": 15105, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15114, + "start": 15109, + "tag_type": 2 + }, + { + "start": 15114, + "end": 15158 + }, + { + "attributes": {}, + "tag": "ul", + "end": 15163, + "start": 15158, + "tag_type": 2 + }, + { + "start": 15163, + "end": 15191 + }, + { + "attributes": {}, + "tag": "li", + "end": 15196, + "start": 15191, + "tag_type": 2 + }, + { + "start": 15196, + "end": 15208 + }, + { + "attributes": { + "id": "nav_game" + }, + "tag": "li", + "end": 15226, + "start": 15208, + "tag_type": 1 + }, + { + "start": 15226, + "end": 15238 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 15280, + "start": 15238, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 15286, + "start": 15280, + "tag_type": 1 + }, + { + "start": 15286, + "end": 15291 + }, + { + "attributes": {}, + "tag": "span", + "end": 15298, + "start": 15291, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 15302, + "start": 15298, + "tag_type": 2 + }, + { + "start": 15302, + "end": 15342 + }, + { + "attributes": {}, + "tag": "ul", + "end": 15346, + "start": 15342, + "tag_type": 1 + }, + { + "start": 15346, + "end": 15390 + }, + { + "attributes": {}, + "tag": "li", + "end": 15394, + "start": 15390, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 15436, + "start": 15394, + "tag_type": 1 + }, + { + "start": 15436, + "end": 15440 + }, + { + "attributes": {}, + "tag": "a", + "end": 15444, + "start": 15440, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15449, + "start": 15444, + "tag_type": 2 + }, + { + "start": 15449, + "end": 15493 + }, + { + "attributes": {}, + "tag": "li", + "end": 15497, + "start": 15493, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Games/6-/Campaign.html?campaign=5371&cid=2061705" + }, + "tag": "a", + "end": 15563, + "start": 15497, + "tag_type": 1 + }, + { + "start": 15563, + "end": 15577 + }, + { + "attributes": {}, + "tag": "a", + "end": 15581, + "start": 15577, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15586, + "start": 15581, + "tag_type": 2 + }, + { + "start": 15586, + "end": 15630 + }, + { + "attributes": {}, + "tag": "li", + "end": 15634, + "start": 15630, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation3/6-/RegionHome.html" + }, + "tag": "a", + "end": 15683, + "start": 15634, + "tag_type": 1 + }, + { + "start": 15683, + "end": 15691 + }, + { + "attributes": {}, + "tag": "a", + "end": 15695, + "start": 15691, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15700, + "start": 15695, + "tag_type": 2 + }, + { + "start": 15700, + "end": 15744 + }, + { + "attributes": {}, + "tag": "li", + "end": 15748, + "start": 15744, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/RegionHome.html" + }, + "tag": "a", + "end": 15797, + "start": 15748, + "tag_type": 1 + }, + { + "start": 15797, + "end": 15805 + }, + { + "attributes": {}, + "tag": "a", + "end": 15809, + "start": 15805, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15814, + "start": 15809, + "tag_type": 2 + }, + { + "start": 15814, + "end": 15858 + }, + { + "attributes": {}, + "tag": "li", + "end": 15862, + "start": 15858, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PSP/6-/RegionHome.html" + }, + "tag": "a", + "end": 15902, + "start": 15862, + "tag_type": 1 + }, + { + "start": 15902, + "end": 15910 + }, + { + "attributes": {}, + "tag": "a", + "end": 15914, + "start": 15910, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 15919, + "start": 15914, + "tag_type": 2 + }, + { + "start": 15919, + "end": 15963 + }, + { + "attributes": {}, + "tag": "li", + "end": 15967, + "start": 15963, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Wii/6-/RegionHome.html" + }, + "tag": "a", + "end": 16007, + "start": 15967, + "tag_type": 1 + }, + { + "start": 16007, + "end": 16019 + }, + { + "attributes": {}, + "tag": "a", + "end": 16023, + "start": 16019, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16028, + "start": 16023, + "tag_type": 2 + }, + { + "start": 16028, + "end": 16072 + }, + { + "attributes": {}, + "tag": "li", + "end": 16076, + "start": 16072, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/DS/6-/RegionHome.html" + }, + "tag": "a", + "end": 16115, + "start": 16076, + "tag_type": 1 + }, + { + "start": 16115, + "end": 16132 + }, + { + "attributes": {}, + "tag": "a", + "end": 16136, + "start": 16132, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16141, + "start": 16136, + "tag_type": 2 + }, + { + "start": 16141, + "end": 16185 + }, + { + "attributes": {}, + "tag": "li", + "end": 16189, + "start": 16185, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox360/6-/RegionHome.html" + }, + "tag": "a", + "end": 16233, + "start": 16189, + "tag_type": 1 + }, + { + "start": 16233, + "end": 16241 + }, + { + "attributes": {}, + "tag": "a", + "end": 16245, + "start": 16241, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16250, + "start": 16245, + "tag_type": 2 + }, + { + "start": 16250, + "end": 16294 + }, + { + "attributes": {}, + "tag": "li", + "end": 16298, + "start": 16294, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/6-/RegionHome.html" + }, + "tag": "a", + "end": 16337, + "start": 16298, + "tag_type": 1 + }, + { + "start": 16337, + "end": 16345 + }, + { + "attributes": {}, + "tag": "a", + "end": 16349, + "start": 16345, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16354, + "start": 16349, + "tag_type": 2 + }, + { + "start": 16354, + "end": 16398 + }, + { + "attributes": {}, + "tag": "li", + "end": 16402, + "start": 16398, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/3-/4047/2-/Promo.html?dpr=4047" + }, + "tag": "a", + "end": 16453, + "start": 16402, + "tag_type": 1 + }, + { + "start": 16453, + "end": 16462 + }, + { + "attributes": {}, + "tag": "a", + "end": 16466, + "start": 16462, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16471, + "start": 16466, + "tag_type": 2 + }, + { + "start": 16471, + "end": 16515 + }, + { + "attributes": {}, + "tag": "li", + "end": 16519, + "start": 16515, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/128/185/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16588, + "start": 16519, + "tag_type": 1 + }, + { + "start": 16588, + "end": 16600 + }, + { + "attributes": {}, + "tag": "a", + "end": 16604, + "start": 16600, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16609, + "start": 16604, + "tag_type": 2 + }, + { + "start": 16609, + "end": 16653 + }, + { + "attributes": {}, + "tag": "li", + "end": 16657, + "start": 16653, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/837/1053/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16733, + "start": 16657, + "tag_type": 1 + }, + { + "start": 16733, + "end": 16747 + }, + { + "attributes": {}, + "tag": "a", + "end": 16751, + "start": 16747, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16756, + "start": 16751, + "tag_type": 2 + }, + { + "start": 16756, + "end": 16800 + }, + { + "attributes": {}, + "tag": "li", + "end": 16804, + "start": 16800, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/835/1051/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 16878, + "start": 16804, + "tag_type": 1 + }, + { + "start": 16878, + "end": 16895 + }, + { + "attributes": {}, + "tag": "a", + "end": 16899, + "start": 16895, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 16904, + "start": 16899, + "tag_type": 2 + }, + { + "start": 16904, + "end": 16948 + }, + { + "attributes": {}, + "tag": "li", + "end": 16952, + "start": 16948, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=game" + }, + "tag": "a", + "end": 17026, + "start": 16952, + "tag_type": 1 + }, + { + "start": 17026, + "end": 17041 + }, + { + "attributes": {}, + "tag": "a", + "end": 17045, + "start": 17041, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17050, + "start": 17045, + "tag_type": 2 + }, + { + "start": 17050, + "end": 17094 + }, + { + "attributes": {}, + "tag": "ul", + "end": 17099, + "start": 17094, + "tag_type": 2 + }, + { + "start": 17099, + "end": 17127 + }, + { + "attributes": {}, + "tag": "li", + "end": 17132, + "start": 17127, + "tag_type": 2 + }, + { + "start": 17132, + "end": 17144 + }, + { + "attributes": { + "id": "nav_book" + }, + "tag": "li", + "end": 17162, + "start": 17144, + "tag_type": 1 + }, + { + "start": 17162, + "end": 17174 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 17216, + "start": 17174, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 17222, + "start": 17216, + "tag_type": 1 + }, + { + "start": 17222, + "end": 17227 + }, + { + "attributes": {}, + "tag": "span", + "end": 17234, + "start": 17227, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 17238, + "start": 17234, + "tag_type": 2 + }, + { + "start": 17238, + "end": 17278 + }, + { + "attributes": {}, + "tag": "ul", + "end": 17282, + "start": 17278, + "tag_type": 1 + }, + { + "start": 17282, + "end": 17326 + }, + { + "attributes": {}, + "tag": "li", + "end": 17330, + "start": 17326, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 17372, + "start": 17330, + "tag_type": 1 + }, + { + "start": 17372, + "end": 17376 + }, + { + "attributes": {}, + "tag": "a", + "end": 17380, + "start": 17376, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17385, + "start": 17380, + "tag_type": 2 + }, + { + "start": 17385, + "end": 17429 + }, + { + "attributes": {}, + "tag": "li", + "end": 17433, + "start": 17429, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/104/161/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17502, + "start": 17433, + "tag_type": 1 + }, + { + "start": 17502, + "end": 17512 + }, + { + "attributes": {}, + "tag": "a", + "end": 17516, + "start": 17512, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17521, + "start": 17516, + "tag_type": 2 + }, + { + "start": 17521, + "end": 17565 + }, + { + "attributes": {}, + "tag": "li", + "end": 17569, + "start": 17565, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/100/157/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17638, + "start": 17569, + "tag_type": 1 + }, + { + "start": 17638, + "end": 17647 + }, + { + "attributes": {}, + "tag": "a", + "end": 17651, + "start": 17647, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17656, + "start": 17651, + "tag_type": 2 + }, + { + "start": 17656, + "end": 17700 + }, + { + "attributes": {}, + "tag": "li", + "end": 17704, + "start": 17700, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/203/260/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17773, + "start": 17704, + "tag_type": 1 + }, + { + "start": 17773, + "end": 17787 + }, + { + "attributes": {}, + "tag": "a", + "end": 17791, + "start": 17787, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17796, + "start": 17791, + "tag_type": 2 + }, + { + "start": 17796, + "end": 17840 + }, + { + "attributes": {}, + "tag": "li", + "end": 17844, + "start": 17840, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/200/257/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 17913, + "start": 17844, + "tag_type": 1 + }, + { + "start": 17913, + "end": 17929 + }, + { + "attributes": {}, + "tag": "a", + "end": 17933, + "start": 17929, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 17938, + "start": 17933, + "tag_type": 2 + }, + { + "start": 17938, + "end": 17982 + }, + { + "attributes": {}, + "tag": "li", + "end": 17986, + "start": 17982, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/142/199/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18055, + "start": 17986, + "tag_type": 1 + }, + { + "start": 18055, + "end": 18069 + }, + { + "attributes": {}, + "tag": "a", + "end": 18073, + "start": 18069, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18078, + "start": 18073, + "tag_type": 2 + }, + { + "start": 18078, + "end": 18122 + }, + { + "attributes": {}, + "tag": "li", + "end": 18126, + "start": 18122, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/159/216/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18195, + "start": 18126, + "tag_type": 1 + }, + { + "start": 18195, + "end": 18207 + }, + { + "attributes": {}, + "tag": "a", + "end": 18211, + "start": 18207, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18216, + "start": 18211, + "tag_type": 2 + }, + { + "start": 18216, + "end": 18260 + }, + { + "attributes": {}, + "tag": "li", + "end": 18264, + "start": 18260, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/-/151/208/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 18333, + "start": 18264, + "tag_type": 1 + }, + { + "start": 18333, + "end": 18340 + }, + { + "attributes": {}, + "tag": "a", + "end": 18344, + "start": 18340, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18349, + "start": 18344, + "tag_type": 2 + }, + { + "start": 18349, + "end": 18393 + }, + { + "attributes": {}, + "tag": "li", + "end": 18397, + "start": 18393, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/RegionHome.html" + }, + "tag": "a", + "end": 18444, + "start": 18397, + "tag_type": 1 + }, + { + "start": 18444, + "end": 18454 + }, + { + "attributes": {}, + "tag": "a", + "end": 18458, + "start": 18454, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18463, + "start": 18458, + "tag_type": 2 + }, + { + "start": 18463, + "end": 18507 + }, + { + "attributes": {}, + "tag": "li", + "end": 18511, + "start": 18507, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=book" + }, + "tag": "a", + "end": 18585, + "start": 18511, + "tag_type": 1 + }, + { + "start": 18585, + "end": 18600 + }, + { + "attributes": {}, + "tag": "a", + "end": 18604, + "start": 18600, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18609, + "start": 18604, + "tag_type": 2 + }, + { + "start": 18609, + "end": 18653 + }, + { + "attributes": {}, + "tag": "ul", + "end": 18658, + "start": 18653, + "tag_type": 2 + }, + { + "start": 18658, + "end": 18686 + }, + { + "attributes": {}, + "tag": "li", + "end": 18691, + "start": 18686, + "tag_type": 2 + }, + { + "start": 18691, + "end": 18703 + }, + { + "attributes": { + "id": "nav_clth" + }, + "tag": "li", + "end": 18721, + "start": 18703, + "tag_type": 1 + }, + { + "start": 18721, + "end": 18733 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/ClothingHome.html" + }, + "tag": "a", + "end": 18783, + "start": 18733, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 18789, + "start": 18783, + "tag_type": 1 + }, + { + "start": 18789, + "end": 18797 + }, + { + "attributes": {}, + "tag": "span", + "end": 18804, + "start": 18797, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 18808, + "start": 18804, + "tag_type": 2 + }, + { + "start": 18808, + "end": 18848 + }, + { + "attributes": {}, + "tag": "ul", + "end": 18852, + "start": 18848, + "tag_type": 1 + }, + { + "start": 18852, + "end": 18896 + }, + { + "attributes": {}, + "tag": "li", + "end": 18900, + "start": 18896, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/ClothingHome.html" + }, + "tag": "a", + "end": 18950, + "start": 18900, + "tag_type": 1 + }, + { + "start": 18950, + "end": 18954 + }, + { + "attributes": {}, + "tag": "a", + "end": 18958, + "start": 18954, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 18963, + "start": 18958, + "tag_type": 2 + }, + { + "start": 18963, + "end": 19007 + }, + { + "attributes": {}, + "tag": "li", + "end": 19011, + "start": 19007, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/720/928/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19086, + "start": 19011, + "tag_type": 1 + }, + { + "start": 19086, + "end": 19099 + }, + { + "attributes": {}, + "tag": "a", + "end": 19103, + "start": 19099, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19108, + "start": 19103, + "tag_type": 2 + }, + { + "start": 19108, + "end": 19152 + }, + { + "attributes": {}, + "tag": "li", + "end": 19156, + "start": 19152, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/721/929/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19231, + "start": 19156, + "tag_type": 1 + }, + { + "start": 19231, + "end": 19246 + }, + { + "attributes": {}, + "tag": "a", + "end": 19250, + "start": 19246, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19255, + "start": 19250, + "tag_type": 2 + }, + { + "start": 19255, + "end": 19299 + }, + { + "attributes": {}, + "tag": "li", + "end": 19303, + "start": 19299, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2825&cid=1354516" + }, + "tag": "a", + "end": 19375, + "start": 19303, + "tag_type": 1 + }, + { + "start": 19375, + "end": 19388 + }, + { + "attributes": {}, + "tag": "a", + "end": 19392, + "start": 19388, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19397, + "start": 19392, + "tag_type": 2 + }, + { + "start": 19397, + "end": 19441 + }, + { + "attributes": {}, + "tag": "li", + "end": 19445, + "start": 19441, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/Campaign.html?campaign=2831&cid=6512018" + }, + "tag": "a", + "end": 19517, + "start": 19445, + "tag_type": 1 + }, + { + "start": 19517, + "end": 19531 + }, + { + "attributes": {}, + "tag": "a", + "end": 19535, + "start": 19531, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19540, + "start": 19535, + "tag_type": 2 + }, + { + "start": 19540, + "end": 19584 + }, + { + "attributes": {}, + "tag": "li", + "end": 19588, + "start": 19584, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/T-Shirts/-/723/931/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19663, + "start": 19588, + "tag_type": 1 + }, + { + "start": 19663, + "end": 19681 + }, + { + "attributes": {}, + "tag": "a", + "end": 19685, + "start": 19681, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19690, + "start": 19685, + "tag_type": 2 + }, + { + "start": 19690, + "end": 19734 + }, + { + "attributes": {}, + "tag": "li", + "end": 19738, + "start": 19734, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Accessories/6-/RegionHome.html" + }, + "tag": "a", + "end": 19789, + "start": 19738, + "tag_type": 1 + }, + { + "start": 19789, + "end": 19800 + }, + { + "attributes": {}, + "tag": "a", + "end": 19804, + "start": 19800, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19809, + "start": 19804, + "tag_type": 2 + }, + { + "start": 19809, + "end": 19853 + }, + { + "attributes": {}, + "tag": "li", + "end": 19857, + "start": 19853, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Clothing/Accessories/-/2026/1276/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 19937, + "start": 19857, + "tag_type": 1 + }, + { + "start": 19937, + "end": 19947 + }, + { + "attributes": {}, + "tag": "a", + "end": 19951, + "start": 19947, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 19956, + "start": 19951, + "tag_type": 2 + }, + { + "start": 19956, + "end": 20000 + }, + { + "attributes": {}, + "tag": "ul", + "end": 20005, + "start": 20000, + "tag_type": 2 + }, + { + "start": 20005, + "end": 20033 + }, + { + "attributes": {}, + "tag": "li", + "end": 20038, + "start": 20033, + "tag_type": 2 + }, + { + "start": 20038, + "end": 20050 + }, + { + "attributes": { + "id": "nav_elec" + }, + "tag": "li", + "end": 20068, + "start": 20050, + "tag_type": 1 + }, + { + "start": 20068, + "end": 20080 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html", + "class": "this" + }, + "tag": "a", + "end": 20147, + "start": 20080, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 20153, + "start": 20147, + "tag_type": 1 + }, + { + "start": 20153, + "end": 20164 + }, + { + "attributes": {}, + "tag": "span", + "end": 20171, + "start": 20164, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 20175, + "start": 20171, + "tag_type": 2 + }, + { + "start": 20175, + "end": 20215 + }, + { + "attributes": {}, + "tag": "ul", + "end": 20219, + "start": 20215, + "tag_type": 1 + }, + { + "start": 20219, + "end": 20263 + }, + { + "attributes": {}, + "tag": "li", + "end": 20267, + "start": 20263, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html" + }, + "tag": "a", + "end": 20321, + "start": 20267, + "tag_type": 1 + }, + { + "start": 20321, + "end": 20325 + }, + { + "attributes": {}, + "tag": "a", + "end": 20329, + "start": 20325, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 20334, + "start": 20329, + "tag_type": 2 + }, + { + "start": 20334, + "end": 20378 + }, + { + "attributes": {}, + "tag": "li", + "end": 20382, + "start": 20378, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20463, + "start": 20382, + "tag_type": 1 + }, + { + "start": 20463, + "end": 20474 + }, + { + "attributes": {}, + "tag": "a", + "end": 20478, + "start": 20474, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 20483, + "start": 20478, + "tag_type": 2 + }, + { + "start": 20483, + "end": 20527 + }, + { + "attributes": {}, + "tag": "li", + "end": 20531, + "start": 20527, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20612, + "start": 20531, + "tag_type": 1 + }, + { + "start": 20612, + "end": 20631 + }, + { + "attributes": {}, + "tag": "a", + "end": 20635, + "start": 20631, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 20640, + "start": 20635, + "tag_type": 2 + }, + { + "start": 20640, + "end": 20684 + }, + { + "attributes": {}, + "tag": "li", + "end": 20688, + "start": 20684, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 20771, + "start": 20688, + "tag_type": 1 + }, + { + "start": 20771, + "end": 20779 + }, + { + "attributes": {}, + "tag": "a", + "end": 20783, + "start": 20779, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 20788, + "start": 20783, + "tag_type": 2 + }, + { + "start": 20788, + "end": 20832 + }, + { + "attributes": {}, + "tag": "li", + "end": 20836, + "start": 20832, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Games/6-/Campaign.html?campaign=5371&cid=2061705" + }, + "tag": "a", + "end": 20902, + "start": 20836, + "tag_type": 1 + }, + { + "start": 20902, + "end": 20916 + }, + { + "attributes": {}, + "tag": "a", + "end": 20920, + "start": 20916, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 20925, + "start": 20920, + "tag_type": 2 + }, + { + "start": 20925, + "end": 20969 + }, + { + "attributes": {}, + "tag": "li", + "end": 20973, + "start": 20969, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 21010, + "start": 20973, + "tag_type": 1 + }, + { + "start": 21010, + "end": 21019 + }, + { + "attributes": {}, + "tag": "a", + "end": 21023, + "start": 21019, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21028, + "start": 21023, + "tag_type": 2 + }, + { + "start": 21028, + "end": 21072 + }, + { + "attributes": {}, + "tag": "li", + "end": 21076, + "start": 21072, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21157, + "start": 21076, + "tag_type": 1 + }, + { + "start": 21157, + "end": 21178 + }, + { + "attributes": {}, + "tag": "a", + "end": 21182, + "start": 21178, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21187, + "start": 21182, + "tag_type": 2 + }, + { + "start": 21187, + "end": 21231 + }, + { + "attributes": {}, + "tag": "li", + "end": 21235, + "start": 21231, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21316, + "start": 21235, + "tag_type": 1 + }, + { + "start": 21316, + "end": 21331 + }, + { + "attributes": {}, + "tag": "a", + "end": 21335, + "start": 21331, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21340, + "start": 21335, + "tag_type": 2 + }, + { + "start": 21340, + "end": 21384 + }, + { + "attributes": {}, + "tag": "li", + "end": 21388, + "start": 21384, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/253/333/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21469, + "start": 21388, + "tag_type": 1 + }, + { + "start": 21469, + "end": 21479 + }, + { + "attributes": {}, + "tag": "a", + "end": 21483, + "start": 21479, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21488, + "start": 21483, + "tag_type": 2 + }, + { + "start": 21488, + "end": 21532 + }, + { + "attributes": {}, + "tag": "li", + "end": 21536, + "start": 21532, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21617, + "start": 21536, + "tag_type": 1 + }, + { + "start": 21617, + "end": 21628 + }, + { + "attributes": {}, + "tag": "a", + "end": 21632, + "start": 21628, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21637, + "start": 21632, + "tag_type": 2 + }, + { + "start": 21637, + "end": 21681 + }, + { + "attributes": {}, + "tag": "li", + "end": 21685, + "start": 21681, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/275/355/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21766, + "start": 21685, + "tag_type": 1 + }, + { + "start": 21766, + "end": 21779 + }, + { + "attributes": {}, + "tag": "a", + "end": 21783, + "start": 21779, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21788, + "start": 21783, + "tag_type": 2 + }, + { + "start": 21788, + "end": 21832 + }, + { + "attributes": {}, + "tag": "li", + "end": 21836, + "start": 21832, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/316/402/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 21917, + "start": 21836, + "tag_type": 1 + }, + { + "start": 21917, + "end": 21924 + }, + { + "attributes": {}, + "tag": "a", + "end": 21928, + "start": 21924, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 21933, + "start": 21928, + "tag_type": 2 + }, + { + "start": 21933, + "end": 21977 + }, + { + "attributes": {}, + "tag": "li", + "end": 21981, + "start": 21977, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22062, + "start": 21981, + "tag_type": 1 + }, + { + "start": 22062, + "end": 22074 + }, + { + "attributes": {}, + "tag": "a", + "end": 22078, + "start": 22074, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22083, + "start": 22078, + "tag_type": 2 + }, + { + "start": 22083, + "end": 22127 + }, + { + "attributes": {}, + "tag": "li", + "end": 22131, + "start": 22127, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/996/1241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22213, + "start": 22131, + "tag_type": 1 + }, + { + "start": 22213, + "end": 22219 + }, + { + "attributes": {}, + "tag": "a", + "end": 22223, + "start": 22219, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22228, + "start": 22223, + "tag_type": 2 + }, + { + "start": 22228, + "end": 22272 + }, + { + "attributes": {}, + "tag": "li", + "end": 22276, + "start": 22272, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22357, + "start": 22276, + "tag_type": 1 + }, + { + "start": 22357, + "end": 22367 + }, + { + "attributes": {}, + "tag": "a", + "end": 22371, + "start": 22367, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22376, + "start": 22371, + "tag_type": 2 + }, + { + "start": 22376, + "end": 22420 + }, + { + "attributes": {}, + "tag": "li", + "end": 22424, + "start": 22420, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/988/1236/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22506, + "start": 22424, + "tag_type": 1 + }, + { + "start": 22506, + "end": 22526 + }, + { + "attributes": {}, + "tag": "a", + "end": 22530, + "start": 22526, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22535, + "start": 22530, + "tag_type": 2 + }, + { + "start": 22535, + "end": 22579 + }, + { + "attributes": {}, + "tag": "ul", + "end": 22584, + "start": 22579, + "tag_type": 2 + }, + { + "start": 22584, + "end": 22612 + }, + { + "attributes": {}, + "tag": "li", + "end": 22617, + "start": 22612, + "tag_type": 2 + }, + { + "start": 22617, + "end": 22629 + }, + { + "attributes": { + "id": "nav_pcsh" + }, + "tag": "li", + "end": 22647, + "start": 22629, + "tag_type": 1 + }, + { + "start": 22647, + "end": 22659 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 22696, + "start": 22659, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 22702, + "start": 22696, + "tag_type": 1 + }, + { + "start": 22702, + "end": 22711 + }, + { + "attributes": {}, + "tag": "span", + "end": 22718, + "start": 22711, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 22722, + "start": 22718, + "tag_type": 2 + }, + { + "start": 22722, + "end": 22762 + }, + { + "attributes": {}, + "tag": "ul", + "end": 22766, + "start": 22762, + "tag_type": 1 + }, + { + "start": 22766, + "end": 22810 + }, + { + "attributes": {}, + "tag": "li", + "end": 22814, + "start": 22810, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 22851, + "start": 22814, + "tag_type": 1 + }, + { + "start": 22851, + "end": 22855 + }, + { + "attributes": {}, + "tag": "a", + "end": 22859, + "start": 22855, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22864, + "start": 22859, + "tag_type": 2 + }, + { + "start": 22864, + "end": 22908 + }, + { + "attributes": {}, + "tag": "li", + "end": 22912, + "start": 22908, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/653/860/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 22976, + "start": 22912, + "tag_type": 1 + }, + { + "start": 22976, + "end": 22985 + }, + { + "attributes": {}, + "tag": "a", + "end": 22989, + "start": 22985, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 22994, + "start": 22989, + "tag_type": 2 + }, + { + "start": 22994, + "end": 23038 + }, + { + "attributes": {}, + "tag": "li", + "end": 23042, + "start": 23038, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/654/861/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23106, + "start": 23042, + "tag_type": 1 + }, + { + "start": 23106, + "end": 23113 + }, + { + "attributes": {}, + "tag": "a", + "end": 23117, + "start": 23113, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23122, + "start": 23117, + "tag_type": 2 + }, + { + "start": 23122, + "end": 23166 + }, + { + "attributes": {}, + "tag": "li", + "end": 23170, + "start": 23166, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/707/915/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23234, + "start": 23170, + "tag_type": 1 + }, + { + "start": 23234, + "end": 23237 + }, + { + "attributes": {}, + "tag": "a", + "end": 23241, + "start": 23237, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23246, + "start": 23241, + "tag_type": 2 + }, + { + "start": 23246, + "end": 23290 + }, + { + "attributes": {}, + "tag": "li", + "end": 23294, + "start": 23290, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/684/891/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23358, + "start": 23294, + "tag_type": 1 + }, + { + "start": 23358, + "end": 23366 + }, + { + "attributes": {}, + "tag": "a", + "end": 23370, + "start": 23366, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23375, + "start": 23370, + "tag_type": 2 + }, + { + "start": 23375, + "end": 23419 + }, + { + "attributes": {}, + "tag": "li", + "end": 23423, + "start": 23419, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/713/921/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23487, + "start": 23423, + "tag_type": 1 + }, + { + "start": 23487, + "end": 23498 + }, + { + "attributes": {}, + "tag": "a", + "end": 23502, + "start": 23498, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23507, + "start": 23502, + "tag_type": 2 + }, + { + "start": 23507, + "end": 23551 + }, + { + "attributes": {}, + "tag": "li", + "end": 23555, + "start": 23551, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/667/874/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23619, + "start": 23555, + "tag_type": 1 + }, + { + "start": 23619, + "end": 23629 + }, + { + "attributes": {}, + "tag": "a", + "end": 23633, + "start": 23629, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23638, + "start": 23633, + "tag_type": 2 + }, + { + "start": 23638, + "end": 23682 + }, + { + "attributes": {}, + "tag": "li", + "end": 23686, + "start": 23682, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/2144/1411/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23752, + "start": 23686, + "tag_type": 1 + }, + { + "start": 23752, + "end": 23773 + }, + { + "attributes": {}, + "tag": "a", + "end": 23777, + "start": 23773, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23782, + "start": 23777, + "tag_type": 2 + }, + { + "start": 23782, + "end": 23826 + }, + { + "attributes": {}, + "tag": "li", + "end": 23830, + "start": 23826, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/660/867/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 23894, + "start": 23830, + "tag_type": 1 + }, + { + "start": 23894, + "end": 23904 + }, + { + "attributes": {}, + "tag": "a", + "end": 23908, + "start": 23904, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 23913, + "start": 23908, + "tag_type": 2 + }, + { + "start": 23913, + "end": 23957 + }, + { + "attributes": {}, + "tag": "li", + "end": 23961, + "start": 23957, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/2159/1426/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24027, + "start": 23961, + "tag_type": 1 + }, + { + "start": 24027, + "end": 24033 + }, + { + "attributes": {}, + "tag": "a", + "end": 24037, + "start": 24033, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24042, + "start": 24037, + "tag_type": 2 + }, + { + "start": 24042, + "end": 24086 + }, + { + "attributes": {}, + "tag": "li", + "end": 24090, + "start": 24086, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/677/884/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24154, + "start": 24090, + "tag_type": 1 + }, + { + "start": 24154, + "end": 24162 + }, + { + "attributes": {}, + "tag": "a", + "end": 24166, + "start": 24162, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24171, + "start": 24166, + "tag_type": 2 + }, + { + "start": 24171, + "end": 24215 + }, + { + "attributes": {}, + "tag": "li", + "end": 24219, + "start": 24215, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/6-/Campaign.html?campaign=4661&cid=4083104" + }, + "tag": "a", + "end": 24280, + "start": 24219, + "tag_type": 1 + }, + { + "start": 24280, + "end": 24298 + }, + { + "attributes": {}, + "tag": "a", + "end": 24302, + "start": 24298, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24307, + "start": 24302, + "tag_type": 2 + }, + { + "start": 24307, + "end": 24351 + }, + { + "attributes": {}, + "tag": "li", + "end": 24355, + "start": 24351, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/989/1237/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24420, + "start": 24355, + "tag_type": 1 + }, + { + "start": 24420, + "end": 24431 + }, + { + "attributes": {}, + "tag": "a", + "end": 24435, + "start": 24431, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24440, + "start": 24435, + "tag_type": 2 + }, + { + "start": 24440, + "end": 24484 + }, + { + "attributes": {}, + "tag": "li", + "end": 24488, + "start": 24484, + "tag_type": 1 + }, + { + "attributes": { + "href": "/PC/PCs/-/694/901/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 24552, + "start": 24488, + "tag_type": 1 + }, + { + "start": 24552, + "end": 24563 + }, + { + "attributes": {}, + "tag": "a", + "end": 24567, + "start": 24563, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24572, + "start": 24567, + "tag_type": 2 + }, + { + "start": 24572, + "end": 24616 + }, + { + "attributes": {}, + "tag": "ul", + "end": 24621, + "start": 24616, + "tag_type": 2 + }, + { + "start": 24621, + "end": 24649 + }, + { + "attributes": {}, + "tag": "li", + "end": 24654, + "start": 24649, + "tag_type": 2 + }, + { + "start": 24654, + "end": 24666 + }, + { + "attributes": { + "id": "nav_gadg" + }, + "tag": "li", + "end": 24684, + "start": 24666, + "tag_type": 1 + }, + { + "start": 24684, + "end": 24696 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 24742, + "start": 24696, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 24748, + "start": 24742, + "tag_type": 1 + }, + { + "start": 24748, + "end": 24755 + }, + { + "attributes": {}, + "tag": "span", + "end": 24762, + "start": 24755, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 24766, + "start": 24762, + "tag_type": 2 + }, + { + "start": 24766, + "end": 24806 + }, + { + "attributes": {}, + "tag": "ul", + "end": 24810, + "start": 24806, + "tag_type": 1 + }, + { + "start": 24810, + "end": 24854 + }, + { + "attributes": {}, + "tag": "li", + "end": 24858, + "start": 24854, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 24904, + "start": 24858, + "tag_type": 1 + }, + { + "start": 24904, + "end": 24908 + }, + { + "attributes": {}, + "tag": "a", + "end": 24912, + "start": 24908, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 24917, + "start": 24912, + "tag_type": 2 + }, + { + "start": 24917, + "end": 24961 + }, + { + "attributes": {}, + "tag": "li", + "end": 24965, + "start": 24961, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/392/492/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25038, + "start": 24965, + "tag_type": 1 + }, + { + "start": 25038, + "end": 25054 + }, + { + "attributes": {}, + "tag": "a", + "end": 25058, + "start": 25054, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25063, + "start": 25058, + "tag_type": 2 + }, + { + "start": 25063, + "end": 25107 + }, + { + "attributes": {}, + "tag": "li", + "end": 25111, + "start": 25107, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/558/743/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25184, + "start": 25111, + "tag_type": 1 + }, + { + "start": 25184, + "end": 25191 + }, + { + "attributes": {}, + "tag": "a", + "end": 25195, + "start": 25191, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25200, + "start": 25195, + "tag_type": 2 + }, + { + "start": 25200, + "end": 25244 + }, + { + "attributes": {}, + "tag": "li", + "end": 25248, + "start": 25244, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/434/534/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25321, + "start": 25248, + "tag_type": 1 + }, + { + "start": 25321, + "end": 25342 + }, + { + "attributes": {}, + "tag": "a", + "end": 25346, + "start": 25342, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25351, + "start": 25346, + "tag_type": 2 + }, + { + "start": 25351, + "end": 25395 + }, + { + "attributes": {}, + "tag": "li", + "end": 25399, + "start": 25395, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/382/482/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25472, + "start": 25399, + "tag_type": 1 + }, + { + "start": 25472, + "end": 25482 + }, + { + "attributes": {}, + "tag": "a", + "end": 25486, + "start": 25482, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25491, + "start": 25486, + "tag_type": 2 + }, + { + "start": 25491, + "end": 25535 + }, + { + "attributes": {}, + "tag": "li", + "end": 25539, + "start": 25535, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/372/472/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25612, + "start": 25539, + "tag_type": 1 + }, + { + "start": 25612, + "end": 25625 + }, + { + "attributes": {}, + "tag": "a", + "end": 25629, + "start": 25625, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25634, + "start": 25629, + "tag_type": 2 + }, + { + "start": 25634, + "end": 25678 + }, + { + "attributes": {}, + "tag": "li", + "end": 25682, + "start": 25678, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/440/540/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25755, + "start": 25682, + "tag_type": 1 + }, + { + "start": 25755, + "end": 25766 + }, + { + "attributes": {}, + "tag": "a", + "end": 25770, + "start": 25766, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25775, + "start": 25770, + "tag_type": 2 + }, + { + "start": 25775, + "end": 25819 + }, + { + "attributes": {}, + "tag": "li", + "end": 25823, + "start": 25819, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/415/515/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 25896, + "start": 25823, + "tag_type": 1 + }, + { + "start": 25896, + "end": 25909 + }, + { + "attributes": {}, + "tag": "a", + "end": 25913, + "start": 25909, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 25918, + "start": 25913, + "tag_type": 2 + }, + { + "start": 25918, + "end": 25962 + }, + { + "attributes": {}, + "tag": "li", + "end": 25966, + "start": 25962, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/411/511/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26039, + "start": 25966, + "tag_type": 1 + }, + { + "start": 26039, + "end": 26055 + }, + { + "attributes": {}, + "tag": "a", + "end": 26059, + "start": 26055, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26064, + "start": 26059, + "tag_type": 2 + }, + { + "start": 26064, + "end": 26108 + }, + { + "attributes": {}, + "tag": "li", + "end": 26112, + "start": 26108, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/401/501/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26185, + "start": 26112, + "tag_type": 1 + }, + { + "start": 26185, + "end": 26190 + }, + { + "attributes": {}, + "tag": "a", + "end": 26194, + "start": 26190, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26199, + "start": 26194, + "tag_type": 2 + }, + { + "start": 26199, + "end": 26243 + }, + { + "attributes": {}, + "tag": "li", + "end": 26247, + "start": 26243, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/-/426/526/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26320, + "start": 26247, + "tag_type": 1 + }, + { + "start": 26320, + "end": 26324 + }, + { + "attributes": {}, + "tag": "a", + "end": 26328, + "start": 26324, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26333, + "start": 26328, + "tag_type": 2 + }, + { + "start": 26333, + "end": 26377 + }, + { + "attributes": {}, + "tag": "ul", + "end": 26382, + "start": 26377, + "tag_type": 2 + }, + { + "start": 26382, + "end": 26410 + }, + { + "attributes": {}, + "tag": "li", + "end": 26415, + "start": 26410, + "tag_type": 2 + }, + { + "start": 26415, + "end": 26427 + }, + { + "attributes": { + "id": "nav_mbls" + }, + "tag": "li", + "end": 26445, + "start": 26427, + "tag_type": 1 + }, + { + "start": 26445, + "end": 26457 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 26502, + "start": 26457, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 26508, + "start": 26502, + "tag_type": 1 + }, + { + "start": 26508, + "end": 26514 + }, + { + "attributes": {}, + "tag": "span", + "end": 26521, + "start": 26514, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 26525, + "start": 26521, + "tag_type": 2 + }, + { + "start": 26525, + "end": 26565 + }, + { + "attributes": {}, + "tag": "ul", + "end": 26569, + "start": 26565, + "tag_type": 1 + }, + { + "start": 26569, + "end": 26613 + }, + { + "attributes": {}, + "tag": "li", + "end": 26617, + "start": 26613, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 26662, + "start": 26617, + "tag_type": 1 + }, + { + "start": 26662, + "end": 26666 + }, + { + "attributes": {}, + "tag": "a", + "end": 26670, + "start": 26666, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26675, + "start": 26670, + "tag_type": 2 + }, + { + "start": 26675, + "end": 26719 + }, + { + "attributes": {}, + "tag": "li", + "end": 26723, + "start": 26719, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/529/686/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26797, + "start": 26723, + "tag_type": 1 + }, + { + "start": 26797, + "end": 26811 + }, + { + "attributes": {}, + "tag": "a", + "end": 26815, + "start": 26811, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26820, + "start": 26815, + "tag_type": 2 + }, + { + "start": 26820, + "end": 26864 + }, + { + "attributes": {}, + "tag": "li", + "end": 26868, + "start": 26864, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/530/687/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 26942, + "start": 26868, + "tag_type": 1 + }, + { + "start": 26942, + "end": 26957 + }, + { + "attributes": {}, + "tag": "a", + "end": 26961, + "start": 26957, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 26966, + "start": 26961, + "tag_type": 2 + }, + { + "start": 26966, + "end": 27010 + }, + { + "attributes": {}, + "tag": "li", + "end": 27014, + "start": 27010, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/1020/1265/3-/HardwareBrowse.html?searchtype=genre" + }, + "tag": "a", + "end": 27092, + "start": 27014, + "tag_type": 1 + }, + { + "start": 27092, + "end": 27102 + }, + { + "attributes": {}, + "tag": "a", + "end": 27106, + "start": 27102, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 27111, + "start": 27106, + "tag_type": 2 + }, + { + "start": 27111, + "end": 27155 + }, + { + "attributes": {}, + "tag": "li", + "end": 27159, + "start": 27155, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/531/688/3-/HardwareHome.html?searchtype=genre" + }, + "tag": "a", + "end": 27233, + "start": 27159, + "tag_type": 1 + }, + { + "start": 27233, + "end": 27244 + }, + { + "attributes": {}, + "tag": "a", + "end": 27248, + "start": 27244, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 27253, + "start": 27248, + "tag_type": 2 + }, + { + "start": 27253, + "end": 27297 + }, + { + "attributes": {}, + "tag": "li", + "end": 27301, + "start": 27297, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/-/526/683/3-/MobileContent.html?searchtype=genre" + }, + "tag": "a", + "end": 27376, + "start": 27301, + "tag_type": 1 + }, + { + "start": 27376, + "end": 27390 + }, + { + "attributes": {}, + "tag": "a", + "end": 27394, + "start": 27390, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 27399, + "start": 27394, + "tag_type": 2 + }, + { + "start": 27399, + "end": 27443 + }, + { + "attributes": {}, + "tag": "ul", + "end": 27448, + "start": 27443, + "tag_type": 2 + }, + { + "start": 27448, + "end": 27476 + }, + { + "attributes": {}, + "tag": "li", + "end": 27481, + "start": 27476, + "tag_type": 2 + }, + { + "start": 27481, + "end": 27493 + }, + { + "attributes": { + "id": "Li2" + }, + "tag": "li", + "end": 27506, + "start": 27493, + "tag_type": 1 + }, + { + "start": 27506, + "end": 27518 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/LandingPage.html?page=playtrade" + }, + "tag": "a", + "end": 27574, + "start": 27518, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 27580, + "start": 27574, + "tag_type": 1 + }, + { + "start": 27580, + "end": 27595 + }, + { + "attributes": {}, + "tag": "span", + "end": 27602, + "start": 27595, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 27606, + "start": 27602, + "tag_type": 2 + }, + { + "start": 27606, + "end": 27646 + }, + { + "attributes": {}, + "tag": "ul", + "end": 27650, + "start": 27646, + "tag_type": 1 + }, + { + "start": 27650, + "end": 27694 + }, + { + "attributes": {}, + "tag": "li", + "end": 27698, + "start": 27694, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=dvd" + }, + "tag": "a", + "end": 27771, + "start": 27698, + "tag_type": 1 + }, + { + "start": 27771, + "end": 27785 + }, + { + "attributes": {}, + "tag": "a", + "end": 27789, + "start": 27785, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 27794, + "start": 27789, + "tag_type": 2 + }, + { + "start": 27794, + "end": 27838 + }, + { + "attributes": {}, + "tag": "li", + "end": 27842, + "start": 27838, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=cd" + }, + "tag": "a", + "end": 27914, + "start": 27842, + "tag_type": 1 + }, + { + "start": 27914, + "end": 27927 + }, + { + "attributes": {}, + "tag": "a", + "end": 27931, + "start": 27927, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 27936, + "start": 27931, + "tag_type": 2 + }, + { + "start": 27936, + "end": 27980 + }, + { + "attributes": {}, + "tag": "li", + "end": 27984, + "start": 27980, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=game" + }, + "tag": "a", + "end": 28058, + "start": 27984, + "tag_type": 1 + }, + { + "start": 28058, + "end": 28073 + }, + { + "attributes": {}, + "tag": "a", + "end": 28077, + "start": 28073, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28082, + "start": 28077, + "tag_type": 2 + }, + { + "start": 28082, + "end": 28126 + }, + { + "attributes": {}, + "tag": "li", + "end": 28130, + "start": 28126, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=book" + }, + "tag": "a", + "end": 28204, + "start": 28130, + "tag_type": 1 + }, + { + "start": 28204, + "end": 28219 + }, + { + "attributes": {}, + "tag": "a", + "end": 28223, + "start": 28219, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28228, + "start": 28223, + "tag_type": 2 + }, + { + "start": 28228, + "end": 28272 + }, + { + "attributes": {}, + "tag": "li", + "end": 28276, + "start": 28272, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=ticket" + }, + "tag": "a", + "end": 28352, + "start": 28276, + "tag_type": 1 + }, + { + "start": 28352, + "end": 28369 + }, + { + "attributes": {}, + "tag": "a", + "end": 28373, + "start": 28369, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28378, + "start": 28373, + "tag_type": 2 + }, + { + "start": 28378, + "end": 28422 + }, + { + "attributes": {}, + "tag": "li", + "end": 28426, + "start": 28422, + "tag_type": 1 + }, + { + "attributes": { + "href": "/landingpage.aspx?page=playtrade&dpr=0&dpr=0&dpr=0&product=console" + }, + "tag": "a", + "end": 28503, + "start": 28426, + "tag_type": 1 + }, + { + "start": 28503, + "end": 28521 + }, + { + "attributes": {}, + "tag": "a", + "end": 28525, + "start": 28521, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28530, + "start": 28525, + "tag_type": 2 + }, + { + "start": 28530, + "end": 28574 + }, + { + "attributes": {}, + "tag": "ul", + "end": 28579, + "start": 28574, + "tag_type": 2 + }, + { + "start": 28579, + "end": 28607 + }, + { + "attributes": {}, + "tag": "li", + "end": 28612, + "start": 28607, + "tag_type": 2 + }, + { + "start": 28612, + "end": 28628 + }, + { + "attributes": {}, + "tag": "ul", + "end": 28633, + "start": 28628, + "tag_type": 2 + }, + { + "start": 28633, + "end": 28642 + }, + { + "attributes": {}, + "tag": "div", + "end": 28648, + "start": 28642, + "tag_type": 2 + }, + { + "start": 28648, + "end": 28652 + }, + { + "attributes": { + "id": "nav_submenu_contain" + }, + "tag": "div", + "end": 28682, + "start": 28652, + "tag_type": 1 + }, + { + "start": 28682, + "end": 28698 + }, + { + "attributes": { + "id": "nav_submenu" + }, + "tag": "ul", + "end": 28719, + "start": 28698, + "tag_type": 1 + }, + { + "start": 28719, + "end": 28739 + }, + { + "attributes": {}, + "tag": "li", + "end": 28743, + "start": 28739, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RegionHome.html" + }, + "tag": "a", + "end": 28797, + "start": 28743, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 28803, + "start": 28797, + "tag_type": 1 + }, + { + "start": 28803, + "end": 28807 + }, + { + "attributes": {}, + "tag": "span", + "end": 28814, + "start": 28807, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 28818, + "start": 28814, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28823, + "start": 28818, + "tag_type": 2 + }, + { + "start": 28823, + "end": 28843 + }, + { + "attributes": {}, + "tag": "li", + "end": 28847, + "start": 28843, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre", + "class": "this" + }, + "tag": "a", + "end": 28941, + "start": 28847, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 28947, + "start": 28941, + "tag_type": 1 + }, + { + "start": 28947, + "end": 28958 + }, + { + "attributes": {}, + "tag": "span", + "end": 28965, + "start": 28958, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 28969, + "start": 28965, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 28974, + "start": 28969, + "tag_type": 2 + }, + { + "start": 28974, + "end": 28994 + }, + { + "attributes": {}, + "tag": "li", + "end": 28998, + "start": 28994, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29079, + "start": 28998, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29085, + "start": 29079, + "tag_type": 1 + }, + { + "start": 29085, + "end": 29104 + }, + { + "attributes": {}, + "tag": "span", + "end": 29111, + "start": 29104, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29115, + "start": 29111, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29120, + "start": 29115, + "tag_type": 2 + }, + { + "start": 29120, + "end": 29140 + }, + { + "attributes": {}, + "tag": "li", + "end": 29144, + "start": 29140, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29227, + "start": 29144, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29233, + "start": 29227, + "tag_type": 1 + }, + { + "start": 29233, + "end": 29241 + }, + { + "attributes": {}, + "tag": "span", + "end": 29248, + "start": 29241, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29252, + "start": 29248, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29257, + "start": 29252, + "tag_type": 2 + }, + { + "start": 29257, + "end": 29277 + }, + { + "attributes": {}, + "tag": "li", + "end": 29281, + "start": 29277, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29362, + "start": 29281, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29368, + "start": 29362, + "tag_type": 1 + }, + { + "start": 29368, + "end": 29389 + }, + { + "attributes": {}, + "tag": "span", + "end": 29396, + "start": 29389, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29400, + "start": 29396, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29405, + "start": 29400, + "tag_type": 2 + }, + { + "start": 29405, + "end": 29425 + }, + { + "attributes": {}, + "tag": "li", + "end": 29429, + "start": 29425, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29510, + "start": 29429, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29516, + "start": 29510, + "tag_type": 1 + }, + { + "start": 29516, + "end": 29531 + }, + { + "attributes": {}, + "tag": "span", + "end": 29538, + "start": 29531, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29542, + "start": 29538, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29547, + "start": 29542, + "tag_type": 2 + }, + { + "start": 29547, + "end": 29567 + }, + { + "attributes": {}, + "tag": "li", + "end": 29571, + "start": 29567, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29652, + "start": 29571, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29658, + "start": 29652, + "tag_type": 1 + }, + { + "start": 29658, + "end": 29669 + }, + { + "attributes": {}, + "tag": "span", + "end": 29676, + "start": 29669, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29680, + "start": 29676, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29685, + "start": 29680, + "tag_type": 2 + }, + { + "start": 29685, + "end": 29705 + }, + { + "attributes": {}, + "tag": "li", + "end": 29709, + "start": 29705, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29790, + "start": 29709, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29796, + "start": 29790, + "tag_type": 1 + }, + { + "start": 29796, + "end": 29808 + }, + { + "attributes": {}, + "tag": "span", + "end": 29815, + "start": 29808, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29819, + "start": 29815, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29824, + "start": 29819, + "tag_type": 2 + }, + { + "start": 29824, + "end": 29844 + }, + { + "attributes": { + "class": "endlink" + }, + "tag": "li", + "end": 29864, + "start": 29844, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 29945, + "start": 29864, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 29951, + "start": 29945, + "tag_type": 1 + }, + { + "start": 29951, + "end": 29961 + }, + { + "attributes": {}, + "tag": "span", + "end": 29968, + "start": 29961, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 29972, + "start": 29968, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 29977, + "start": 29972, + "tag_type": 2 + }, + { + "start": 29977, + "end": 29997 + }, + { + "attributes": {}, + "tag": "ul", + "end": 30002, + "start": 29997, + "tag_type": 2 + }, + { + "start": 30002, + "end": 30010 + }, + { + "attributes": {}, + "tag": "div", + "end": 30016, + "start": 30010, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "cite", + "end": 30022, + "start": 30016, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "cite", + "end": 30029, + "start": 30022, + "tag_type": 2 + }, + { + "start": 30029, + "end": 30033 + }, + { + "attributes": {}, + "tag": "div", + "end": 30039, + "start": 30033, + "tag_type": 2 + }, + { + "start": 30039, + "end": 30043 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 30096, + "start": 30043, + "tag_type": 1 + }, + { + "start": 30096, + "end": 30606 + }, + { + "attributes": {}, + "tag": "script", + "end": 30615, + "start": 30606, + "tag_type": 2 + }, + { + "start": 30615, + "end": 30619 + }, + { + "attributes": { + "id": "contentContainer" + }, + "tag": "div", + "end": 30646, + "start": 30619, + "tag_type": 1 + }, + { + "start": 30646, + "end": 30654 + }, + { + "attributes": { + "class": "outer" + }, + "tag": "div", + "end": 30673, + "start": 30654, + "tag_type": 1 + }, + { + "start": 30673, + "end": 30685 + }, + { + "attributes": { + "class": "inner" + }, + "tag": "div", + "end": 30704, + "start": 30685, + "tag_type": 1 + }, + { + "start": 30704, + "end": 30720 + }, + { + "attributes": { + "class": "floatWrap" + }, + "tag": "div", + "end": 30743, + "start": 30720, + "tag_type": 1 + }, + { + "start": 30743, + "end": 30763 + }, + { + "attributes": { + "id": "middleCol" + }, + "tag": "div", + "end": 30783, + "start": 30763, + "tag_type": 1 + }, + { + "start": 30783, + "end": 30831 + }, + { + "attributes": { + "class": "content" + }, + "tag": "div", + "end": 30852, + "start": 30831, + "tag_type": 1 + }, + { + "start": 30852, + "end": 30884 + }, + { + "attributes": { + "class": "electronics wrap" + }, + "tag": "div", + "end": 30914, + "start": 30884, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 30935, + "start": 30914, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 30940, + "start": 30935, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 30945, + "start": 30940, + "tag_type": 1 + }, + { + "attributes": { + "class": "pagehead" + }, + "tag": "h2", + "end": 30966, + "start": 30945, + "tag_type": 1 + }, + { + "start": 30966, + "end": 30977 + }, + { + "attributes": {}, + "tag": "h2", + "end": 30982, + "start": 30977, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 30988, + "start": 30982, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 30994, + "start": 30988, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 31000, + "start": 30994, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 31017, + "start": 31000, + "tag_type": 1 + }, + { + "attributes": { + "class": "product-2 slice top" + }, + "tag": "div", + "end": 31050, + "start": 31017, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 31073, + "start": 31050, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 31077, + "start": 31073, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 31081, + "start": 31077, + "tag_type": 1 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 31100, + "start": 31081, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 31103, + "start": 31100, + "tag_type": 1 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8986420m.jpg", + "alt": "Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)", + "style": "border-width:0px;height:170px;width:170px;" + }, + "tag": "img", + "end": 31369, + "start": 31103, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 31373, + "start": 31369, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 31379, + "start": 31373, + "tag_type": 2 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 31399, + "start": 31379, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 31405, + "start": 31399, + "tag_type": 2 + }, + { + "attributes": { + "class": "action" + }, + "tag": "div", + "end": 31425, + "start": 31405, + "tag_type": 1 + }, + { + "start": 31425, + "end": 31429 + }, + { + "attributes": { + "href": "#", + "onclick": "javascript:window.open('/Electronics/Electronics/4-/8986420/-/EnlargedImage.html','8986420','width=520,height=520')" + }, + "tag": "a", + "end": 31567, + "start": 31429, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/button/enlargeimage.gif", + "alt": "Enlarge Image", + "style": "border-width:0px;height:17px;width:99px;" + }, + "tag": "img", + "end": 31719, + "start": 31567, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 31723, + "start": 31719, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 31729, + "start": 31723, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 31734, + "start": 31729, + "tag_type": 2 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 31751, + "start": 31734, + "tag_type": 1 + }, + { + "attributes": { + "class": "info" + }, + "tag": "div", + "end": 31769, + "start": 31751, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 31774, + "start": 31769, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h1", + "end": 31778, + "start": 31774, + "tag_type": 1 + }, + { + "start": 31778, + "end": 31850 + }, + { + "attributes": {}, + "tag": "h1", + "end": 31855, + "start": 31850, + "tag_type": 2 + }, + { + "attributes": { + "class": "artist" + }, + "tag": "p", + "end": 31873, + "start": 31855, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 31877, + "start": 31873, + "tag_type": 2 + }, + { + "attributes": { + "class": "rating" + }, + "tag": "p", + "end": 31893, + "start": 31877, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50.gif", + "alt": "Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars", + "style": "height:14px;width:71px;border-width:0px;" + }, + "tag": "img", + "end": 32141, + "start": 31893, + "tag_type": 3 + }, + { + "start": 32141, + "end": 32144 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 32370, + "start": 32144, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32378, + "start": 32370, + "tag_type": 1 + }, + { + "start": 32378, + "end": 32379 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32388, + "start": 32379, + "tag_type": 2 + }, + { + "start": 32388, + "end": 32404 + }, + { + "attributes": {}, + "tag": "a", + "end": 32408, + "start": 32404, + "tag_type": 2 + }, + { + "start": 32408, + "end": 32411 + }, + { + "attributes": {}, + "tag": "p", + "end": 32415, + "start": 32411, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 32421, + "start": 32415, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 32426, + "start": 32421, + "tag_type": 1 + }, + { + "attributes": { + "id": "_pageTemplate__product_ctl00__overview_ctl00__dataControl__price__headerSix" + }, + "tag": "h6", + "end": 32511, + "start": 32426, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 32517, + "start": 32511, + "tag_type": 1 + }, + { + "start": 32517, + "end": 32529 + }, + { + "attributes": {}, + "tag": "span", + "end": 32536, + "start": 32529, + "tag_type": 2 + }, + { + "start": 32536, + "end": 32550 + }, + { + "attributes": {}, + "tag": "h6", + "end": 32555, + "start": 32550, + "tag_type": 2 + }, + { + "attributes": { + "class": "saving" + }, + "tag": "p", + "end": 32573, + "start": 32555, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 32579, + "start": 32573, + "tag_type": 1 + }, + { + "start": 32579, + "end": 32584 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32592, + "start": 32584, + "tag_type": 1 + }, + { + "start": 32592, + "end": 32604 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32613, + "start": 32604, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "span", + "end": 32620, + "start": 32613, + "tag_type": 2 + }, + { + "start": 32620, + "end": 32623 + }, + { + "attributes": {}, + "tag": "span", + "end": 32629, + "start": 32623, + "tag_type": 1 + }, + { + "start": 32629, + "end": 32639 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32647, + "start": 32639, + "tag_type": 1 + }, + { + "start": 32647, + "end": 32665 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32674, + "start": 32665, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "span", + "end": 32681, + "start": 32674, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 32685, + "start": 32681, + "tag_type": 2 + }, + { + "attributes": { + "class": "stock" + }, + "tag": "p", + "end": 32702, + "start": 32685, + "tag_type": 1 + }, + { + "start": 32702, + "end": 32706 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32714, + "start": 32706, + "tag_type": 1 + }, + { + "start": 32714, + "end": 32722 + }, + { + "attributes": {}, + "tag": "strong", + "end": 32731, + "start": 32722, + "tag_type": 2 + }, + { + "start": 32731, + "end": 32735 + }, + { + "attributes": {}, + "tag": "span", + "end": 32741, + "start": 32735, + "tag_type": 1 + }, + { + "start": 32741, + "end": 32778 + }, + { + "attributes": {}, + "tag": "span", + "end": 32785, + "start": 32778, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 32789, + "start": 32785, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 32795, + "start": 32789, + "tag_type": 2 + }, + { + "attributes": { + "class": "buy" + }, + "tag": "div", + "end": 32812, + "start": 32795, + "tag_type": 1 + }, + { + "start": 32812, + "end": 32833 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre&add=8986420&pid=275282&dpr=275282", + "class": "buy_button" + }, + "tag": "a", + "end": 33037, + "start": 32833, + "tag_type": 1 + }, + { + "start": 33037, + "end": 33040 + }, + { + "attributes": {}, + "tag": "a", + "end": 33044, + "start": 33040, + "tag_type": 2 + }, + { + "start": 33044, + "end": 33064 + }, + { + "attributes": {}, + "tag": "div", + "end": 33070, + "start": 33064, + "tag_type": 2 + }, + { + "attributes": { + "class": "badges" + }, + "tag": "div", + "end": 33090, + "start": 33070, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33095, + "start": 33090, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33101, + "start": 33095, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33107, + "start": 33101, + "tag_type": 2 + }, + { + "attributes": { + "class": "note-alt" + }, + "tag": "p", + "end": 33127, + "start": 33107, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 33131, + "start": 33127, + "tag_type": 2 + }, + { + "attributes": { + "class": "bogof" + }, + "tag": "div", + "end": 33150, + "start": 33131, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33156, + "start": 33150, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33162, + "start": 33156, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 33167, + "start": 33162, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33172, + "start": 33167, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 33180, + "start": 33172, + "tag_type": 2 + }, + { + "attributes": { + "class": "trade-link-wrap" + }, + "tag": "div", + "end": 33209, + "start": 33180, + "tag_type": 1 + }, + { + "attributes": { + "class": "trade-link" + }, + "tag": "div", + "end": 33233, + "start": 33209, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33238, + "start": 33233, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "table", + "end": 33245, + "start": 33238, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33249, + "start": 33245, + "tag_type": 1 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 33266, + "start": 33249, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 33269, + "start": 33266, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?ptsl=1&ob=Price&fb=0" + }, + "tag": "a", + "end": 33407, + "start": 33269, + "tag_type": 1 + }, + { + "start": 33407, + "end": 33431 + }, + { + "attributes": {}, + "tag": "span", + "end": 33437, + "start": 33431, + "tag_type": 1 + }, + { + "start": 33437, + "end": 33451 + }, + { + "attributes": {}, + "tag": "span", + "end": 33458, + "start": 33451, + "tag_type": 2 + }, + { + "start": 33458, + "end": 33464 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33472, + "start": 33464, + "tag_type": 1 + }, + { + "start": 33472, + "end": 33484 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33493, + "start": 33484, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 33497, + "start": 33493, + "tag_type": 2 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=TradeGeneralq", + "class": "huh" + }, + "tag": "a", + "end": 33562, + "start": 33497, + "tag_type": 1 + }, + { + "start": 33562, + "end": 33583 + }, + { + "attributes": {}, + "tag": "a", + "end": 33587, + "start": 33583, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 33591, + "start": 33587, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 33595, + "start": 33591, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 33599, + "start": 33595, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?ptsl=1&ob=Price&fb=1" + }, + "tag": "a", + "end": 33737, + "start": 33599, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 33743, + "start": 33737, + "tag_type": 1 + }, + { + "start": 33743, + "end": 33748 + }, + { + "attributes": {}, + "tag": "span", + "end": 33755, + "start": 33748, + "tag_type": 2 + }, + { + "start": 33755, + "end": 33761 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33769, + "start": 33761, + "tag_type": 1 + }, + { + "start": 33769, + "end": 33778 + }, + { + "attributes": {}, + "tag": "strong", + "end": 33787, + "start": 33778, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 33791, + "start": 33787, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 33796, + "start": 33791, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 33801, + "start": 33796, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "div", + "end": 33819, + "start": 33801, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33825, + "start": 33819, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 33830, + "start": 33825, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33835, + "start": 33830, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 33843, + "start": 33835, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33849, + "start": 33843, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33855, + "start": 33849, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33861, + "start": 33855, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 33867, + "start": 33861, + "tag_type": 2 + }, + { + "attributes": { + "class": "linksave" + }, + "tag": "div", + "end": 33889, + "start": 33867, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33894, + "start": 33889, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33899, + "start": 33894, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33904, + "start": 33899, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "div", + "end": 33923, + "start": 33904, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 33946, + "start": 33923, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 33950, + "start": 33946, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 33954, + "start": 33950, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 33959, + "start": 33954, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/promo_plus.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 34065, + "start": 33959, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "div", + "end": 34071, + "start": 34065, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 34076, + "start": 34071, + "tag_type": 2 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 34093, + "start": 34076, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h1", + "end": 34097, + "start": 34093, + "tag_type": 1 + }, + { + "start": 34097, + "end": 34116 + }, + { + "attributes": {}, + "tag": "h1", + "end": 34121, + "start": 34116, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 34124, + "start": 34121, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34132, + "start": 34124, + "tag_type": 1 + }, + { + "start": 34132, + "end": 34185 + }, + { + "attributes": {}, + "tag": "strong", + "end": 34194, + "start": 34185, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 34198, + "start": 34194, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 34203, + "start": 34198, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 34207, + "start": 34203, + "tag_type": 1 + }, + { + "attributes": { + "class": "button" + }, + "tag": "div", + "end": 34227, + "start": 34207, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 34232, + "start": 34227, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 34237, + "start": 34232, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 34240, + "start": 34237, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/Product.html?sp=1&dpr=275282", + "title": "Save 50% On This TV Stand When Purchased With This TV" + }, + "tag": "a", + "end": 34383, + "start": 34240, + "tag_type": 1 + }, + { + "start": 34383, + "end": 34393 + }, + { + "attributes": {}, + "tag": "a", + "end": 34397, + "start": 34393, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 34401, + "start": 34397, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34407, + "start": 34401, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34413, + "start": 34407, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34419, + "start": 34413, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 34424, + "start": 34419, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 34429, + "start": 34424, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 34437, + "start": 34429, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34443, + "start": 34437, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34449, + "start": 34443, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34455, + "start": 34449, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34461, + "start": 34455, + "tag_type": 2 + }, + { + "attributes": { + "class": "linknote" + }, + "tag": "p", + "end": 34481, + "start": 34461, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 34485, + "start": 34481, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34491, + "start": 34485, + "tag_type": 2 + }, + { + "start": 34491, + "end": 34495 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 34516, + "start": 34495, + "tag_type": 1 + }, + { + "start": 34516, + "end": 34524 + }, + { + "attributes": {}, + "tag": "h3", + "end": 34529, + "start": 34524, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 34568, + "start": 34529, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 34575, + "start": 34568, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 34579, + "start": 34575, + "tag_type": 1 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 34596, + "start": 34579, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 34602, + "start": 34596, + "tag_type": 1 + }, + { + "start": 34602, + "end": 34620 + }, + { + "attributes": {}, + "tag": "span", + "end": 34627, + "start": 34620, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 34632, + "start": 34627, + "tag_type": 2 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 34653, + "start": 34632, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "tr", + "end": 34658, + "start": 34653, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 34666, + "start": 34658, + "tag_type": 2 + }, + { + "start": 34666, + "end": 34678 + }, + { + "attributes": {}, + "tag": "table", + "end": 34686, + "start": 34678, + "tag_type": 2 + }, + { + "start": 34686, + "end": 34694 + }, + { + "attributes": {}, + "tag": "h3", + "end": 34699, + "start": 34694, + "tag_type": 2 + }, + { + "start": 34699, + "end": 34715 + }, + { + "attributes": {}, + "tag": "p", + "end": 34718, + "start": 34715, + "tag_type": 1 + }, + { + "start": 34718, + "end": 34730 + }, + { + "attributes": { + "href": "#" + }, + "tag": "a", + "end": 34742, + "start": 34730, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 34746, + "start": 34742, + "tag_type": 2 + }, + { + "start": 34746, + "end": 34760 + }, + { + "attributes": {}, + "tag": "p", + "end": 34764, + "start": 34760, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34770, + "start": 34764, + "tag_type": 2 + }, + { + "attributes": { + "class": "relatedpromos slice" + }, + "tag": "div", + "end": 34803, + "start": 34770, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ul", + "end": 34807, + "start": 34803, + "tag_type": 1 + }, + { + "attributes": { + "class": "textbig" + }, + "tag": "li", + "end": 34827, + "start": 34807, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/275282/2-/Promo.html" + }, + "tag": "a", + "end": 34886, + "start": 34827, + "tag_type": 1 + }, + { + "start": 34886, + "end": 34905 + }, + { + "attributes": {}, + "tag": "a", + "end": 34909, + "start": 34905, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 34914, + "start": 34909, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 34919, + "start": 34914, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 34925, + "start": 34919, + "tag_type": 2 + }, + { + "start": 34925, + "end": 34929 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 34950, + "start": 34929, + "tag_type": 1 + }, + { + "start": 34950, + "end": 34958 + }, + { + "attributes": { + "id": "jump-features", + "name": "jump-features" + }, + "tag": "h3", + "end": 34998, + "start": 34958, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 35037, + "start": 34998, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35044, + "start": 35037, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35048, + "start": 35044, + "tag_type": 1 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 35065, + "start": 35048, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 35071, + "start": 35065, + "tag_type": 1 + }, + { + "start": 35071, + "end": 35085 + }, + { + "attributes": {}, + "tag": "span", + "end": 35092, + "start": 35085, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 35097, + "start": 35092, + "tag_type": 2 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 35118, + "start": 35097, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "tr", + "end": 35123, + "start": 35118, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 35131, + "start": 35123, + "tag_type": 2 + }, + { + "start": 35131, + "end": 35143 + }, + { + "attributes": {}, + "tag": "table", + "end": 35151, + "start": 35143, + "tag_type": 2 + }, + { + "start": 35151, + "end": 35159 + }, + { + "attributes": {}, + "tag": "h3", + "end": 35164, + "start": 35159, + "tag_type": 2 + }, + { + "start": 35164, + "end": 35180 + }, + { + "attributes": {}, + "tag": "p", + "end": 35183, + "start": 35180, + "tag_type": 1 + }, + { + "start": 35183, + "end": 35195 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 35215, + "start": 35195, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 35219, + "start": 35215, + "tag_type": 2 + }, + { + "start": 35219, + "end": 35233 + }, + { + "attributes": {}, + "tag": "p", + "end": 35237, + "start": 35233, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 35243, + "start": 35237, + "tag_type": 2 + }, + { + "attributes": { + "class": "special slice" + }, + "tag": "div", + "end": 35270, + "start": 35243, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ul", + "end": 35274, + "start": 35270, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 35278, + "start": 35274, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "center", + "end": 35286, + "start": 35278, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550ban.jpg", + "alt": "diagram" + }, + "tag": "img", + "end": 35358, + "start": 35286, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "center", + "end": 35367, + "start": 35358, + "tag_type": 2 + }, + { + "start": 35367, + "end": 35368 + }, + { + "attributes": {}, + "tag": "li", + "end": 35373, + "start": 35368, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35377, + "start": 35373, + "tag_type": 1 + }, + { + "start": 35377, + "end": 35378 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35386, + "start": 35378, + "tag_type": 1 + }, + { + "start": 35386, + "end": 35546 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35555, + "start": 35546, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35560, + "start": 35555, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35564, + "start": 35560, + "tag_type": 1 + }, + { + "start": 35564, + "end": 35581 + }, + { + "attributes": {}, + "tag": "li", + "end": 35586, + "start": 35581, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35590, + "start": 35586, + "tag_type": 1 + }, + { + "start": 35590, + "end": 35614 + }, + { + "attributes": {}, + "tag": "li", + "end": 35619, + "start": 35614, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35623, + "start": 35619, + "tag_type": 1 + }, + { + "start": 35623, + "end": 35640 + }, + { + "attributes": {}, + "tag": "li", + "end": 35645, + "start": 35640, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35649, + "start": 35645, + "tag_type": 1 + }, + { + "start": 35649, + "end": 35671 + }, + { + "attributes": {}, + "tag": "li", + "end": 35676, + "start": 35671, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35680, + "start": 35676, + "tag_type": 1 + }, + { + "start": 35680, + "end": 35718 + }, + { + "attributes": {}, + "tag": "li", + "end": 35723, + "start": 35718, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35727, + "start": 35723, + "tag_type": 1 + }, + { + "start": 35727, + "end": 35754 + }, + { + "attributes": {}, + "tag": "li", + "end": 35759, + "start": 35754, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35763, + "start": 35759, + "tag_type": 1 + }, + { + "start": 35763, + "end": 35783 + }, + { + "attributes": {}, + "tag": "li", + "end": 35788, + "start": 35783, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35792, + "start": 35788, + "tag_type": 1 + }, + { + "start": 35792, + "end": 35793 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35801, + "start": 35793, + "tag_type": 1 + }, + { + "start": 35801, + "end": 35806 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35815, + "start": 35806, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35820, + "start": 35815, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35824, + "start": 35820, + "tag_type": 1 + }, + { + "start": 35824, + "end": 35885 + }, + { + "attributes": {}, + "tag": "li", + "end": 35890, + "start": 35885, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35894, + "start": 35890, + "tag_type": 1 + }, + { + "start": 35894, + "end": 35920 + }, + { + "attributes": {}, + "tag": "li", + "end": 35925, + "start": 35920, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35929, + "start": 35925, + "tag_type": 1 + }, + { + "start": 35929, + "end": 35956 + }, + { + "attributes": {}, + "tag": "li", + "end": 35961, + "start": 35956, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35965, + "start": 35961, + "tag_type": 1 + }, + { + "start": 35965, + "end": 35966 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35974, + "start": 35966, + "tag_type": 1 + }, + { + "start": 35974, + "end": 35982 + }, + { + "attributes": {}, + "tag": "strong", + "end": 35991, + "start": 35982, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 35996, + "start": 35991, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36000, + "start": 35996, + "tag_type": 1 + }, + { + "start": 36000, + "end": 36008 + }, + { + "attributes": {}, + "tag": "li", + "end": 36013, + "start": 36008, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36017, + "start": 36013, + "tag_type": 1 + }, + { + "start": 36017, + "end": 36032 + }, + { + "attributes": {}, + "tag": "li", + "end": 36037, + "start": 36032, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36041, + "start": 36037, + "tag_type": 1 + }, + { + "start": 36041, + "end": 36060 + }, + { + "attributes": {}, + "tag": "li", + "end": 36065, + "start": 36060, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36069, + "start": 36065, + "tag_type": 1 + }, + { + "start": 36069, + "end": 36079 + }, + { + "attributes": {}, + "tag": "li", + "end": 36084, + "start": 36079, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36088, + "start": 36084, + "tag_type": 1 + }, + { + "start": 36088, + "end": 36103 + }, + { + "attributes": {}, + "tag": "li", + "end": 36108, + "start": 36103, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36112, + "start": 36108, + "tag_type": 1 + }, + { + "start": 36112, + "end": 36125 + }, + { + "attributes": {}, + "tag": "li", + "end": 36130, + "start": 36125, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36134, + "start": 36130, + "tag_type": 1 + }, + { + "start": 36134, + "end": 36146 + }, + { + "attributes": {}, + "tag": "li", + "end": 36151, + "start": 36146, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36155, + "start": 36151, + "tag_type": 1 + }, + { + "start": 36155, + "end": 36176 + }, + { + "attributes": {}, + "tag": "li", + "end": 36181, + "start": 36176, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36185, + "start": 36181, + "tag_type": 1 + }, + { + "start": 36185, + "end": 36205 + }, + { + "attributes": {}, + "tag": "li", + "end": 36210, + "start": 36205, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36214, + "start": 36210, + "tag_type": 1 + }, + { + "start": 36214, + "end": 36229 + }, + { + "attributes": {}, + "tag": "li", + "end": 36234, + "start": 36229, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36238, + "start": 36234, + "tag_type": 1 + }, + { + "start": 36238, + "end": 36242 + }, + { + "attributes": {}, + "tag": "li", + "end": 36247, + "start": 36242, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36251, + "start": 36247, + "tag_type": 1 + }, + { + "start": 36251, + "end": 36272 + }, + { + "attributes": {}, + "tag": "li", + "end": 36277, + "start": 36272, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36281, + "start": 36277, + "tag_type": 1 + }, + { + "start": 36281, + "end": 36297 + }, + { + "attributes": {}, + "tag": "li", + "end": 36302, + "start": 36297, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36306, + "start": 36302, + "tag_type": 1 + }, + { + "start": 36306, + "end": 36307 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36315, + "start": 36307, + "tag_type": 1 + }, + { + "start": 36315, + "end": 36321 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36330, + "start": 36321, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36335, + "start": 36330, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36339, + "start": 36335, + "tag_type": 1 + }, + { + "start": 36339, + "end": 36348 + }, + { + "attributes": {}, + "tag": "li", + "end": 36353, + "start": 36348, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36357, + "start": 36353, + "tag_type": 1 + }, + { + "start": 36357, + "end": 36376 + }, + { + "attributes": {}, + "tag": "li", + "end": 36381, + "start": 36376, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36385, + "start": 36381, + "tag_type": 1 + }, + { + "start": 36385, + "end": 36386 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36394, + "start": 36386, + "tag_type": 1 + }, + { + "start": 36394, + "end": 36410 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36419, + "start": 36410, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36424, + "start": 36419, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36428, + "start": 36424, + "tag_type": 1 + }, + { + "start": 36428, + "end": 36446 + }, + { + "attributes": {}, + "tag": "li", + "end": 36451, + "start": 36446, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36455, + "start": 36451, + "tag_type": 1 + }, + { + "start": 36455, + "end": 36465 + }, + { + "attributes": {}, + "tag": "li", + "end": 36470, + "start": 36465, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36474, + "start": 36470, + "tag_type": 1 + }, + { + "start": 36474, + "end": 36488 + }, + { + "attributes": {}, + "tag": "li", + "end": 36493, + "start": 36488, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36497, + "start": 36493, + "tag_type": 1 + }, + { + "start": 36497, + "end": 36517 + }, + { + "attributes": {}, + "tag": "li", + "end": 36522, + "start": 36517, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36526, + "start": 36522, + "tag_type": 1 + }, + { + "start": 36526, + "end": 36540 + }, + { + "attributes": {}, + "tag": "li", + "end": 36545, + "start": 36540, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36549, + "start": 36545, + "tag_type": 1 + }, + { + "start": 36549, + "end": 36572 + }, + { + "attributes": {}, + "tag": "li", + "end": 36577, + "start": 36572, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36581, + "start": 36577, + "tag_type": 1 + }, + { + "start": 36581, + "end": 36614 + }, + { + "attributes": {}, + "tag": "li", + "end": 36619, + "start": 36614, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36623, + "start": 36619, + "tag_type": 1 + }, + { + "start": 36623, + "end": 36657 + }, + { + "attributes": {}, + "tag": "li", + "end": 36662, + "start": 36657, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36666, + "start": 36662, + "tag_type": 1 + }, + { + "start": 36666, + "end": 36691 + }, + { + "attributes": {}, + "tag": "li", + "end": 36696, + "start": 36691, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36700, + "start": 36696, + "tag_type": 1 + }, + { + "start": 36700, + "end": 36730 + }, + { + "attributes": {}, + "tag": "li", + "end": 36735, + "start": 36730, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36739, + "start": 36735, + "tag_type": 1 + }, + { + "start": 36739, + "end": 36755 + }, + { + "attributes": {}, + "tag": "li", + "end": 36760, + "start": 36755, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36764, + "start": 36760, + "tag_type": 1 + }, + { + "start": 36764, + "end": 36779 + }, + { + "attributes": {}, + "tag": "li", + "end": 36784, + "start": 36779, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36788, + "start": 36784, + "tag_type": 1 + }, + { + "start": 36788, + "end": 36809 + }, + { + "attributes": {}, + "tag": "li", + "end": 36814, + "start": 36809, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36818, + "start": 36814, + "tag_type": 1 + }, + { + "start": 36818, + "end": 36831 + }, + { + "attributes": {}, + "tag": "li", + "end": 36836, + "start": 36831, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36840, + "start": 36836, + "tag_type": 1 + }, + { + "start": 36840, + "end": 36852 + }, + { + "attributes": {}, + "tag": "li", + "end": 36857, + "start": 36852, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36861, + "start": 36857, + "tag_type": 1 + }, + { + "start": 36861, + "end": 36862 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36870, + "start": 36862, + "tag_type": 1 + }, + { + "start": 36870, + "end": 36876 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36885, + "start": 36876, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36890, + "start": 36885, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36894, + "start": 36890, + "tag_type": 1 + }, + { + "start": 36894, + "end": 36919 + }, + { + "attributes": {}, + "tag": "li", + "end": 36924, + "start": 36919, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36928, + "start": 36924, + "tag_type": 1 + }, + { + "start": 36928, + "end": 36951 + }, + { + "attributes": {}, + "tag": "li", + "end": 36956, + "start": 36951, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36960, + "start": 36956, + "tag_type": 1 + }, + { + "start": 36960, + "end": 36980 + }, + { + "attributes": {}, + "tag": "li", + "end": 36985, + "start": 36980, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 36989, + "start": 36985, + "tag_type": 1 + }, + { + "start": 36989, + "end": 36990 + }, + { + "attributes": {}, + "tag": "strong", + "end": 36998, + "start": 36990, + "tag_type": 1 + }, + { + "start": 36998, + "end": 37009 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37018, + "start": 37009, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37023, + "start": 37018, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37027, + "start": 37023, + "tag_type": 1 + }, + { + "start": 37027, + "end": 37073 + }, + { + "attributes": {}, + "tag": "li", + "end": 37078, + "start": 37073, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37082, + "start": 37078, + "tag_type": 1 + }, + { + "start": 37082, + "end": 37130 + }, + { + "attributes": {}, + "tag": "li", + "end": 37135, + "start": 37130, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37139, + "start": 37135, + "tag_type": 1 + }, + { + "start": 37139, + "end": 37140 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37148, + "start": 37140, + "tag_type": 1 + }, + { + "start": 37148, + "end": 37154 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37163, + "start": 37154, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37168, + "start": 37163, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37172, + "start": 37168, + "tag_type": 1 + }, + { + "start": 37172, + "end": 37200 + }, + { + "attributes": {}, + "tag": "li", + "end": 37205, + "start": 37200, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37209, + "start": 37205, + "tag_type": 1 + }, + { + "start": 37209, + "end": 37240 + }, + { + "attributes": {}, + "tag": "li", + "end": 37245, + "start": 37240, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37249, + "start": 37245, + "tag_type": 1 + }, + { + "start": 37249, + "end": 37250 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37258, + "start": 37250, + "tag_type": 1 + }, + { + "start": 37258, + "end": 37267 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37276, + "start": 37267, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37281, + "start": 37276, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37285, + "start": 37281, + "tag_type": 1 + }, + { + "start": 37285, + "end": 37329 + }, + { + "attributes": {}, + "tag": "li", + "end": 37334, + "start": 37329, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37338, + "start": 37334, + "tag_type": 1 + }, + { + "start": 37338, + "end": 37356 + }, + { + "attributes": {}, + "tag": "li", + "end": 37361, + "start": 37356, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37365, + "start": 37361, + "tag_type": 1 + }, + { + "start": 37365, + "end": 37375 + }, + { + "attributes": {}, + "tag": "li", + "end": 37380, + "start": 37375, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 37384, + "start": 37380, + "tag_type": 1 + }, + { + "start": 37384, + "end": 37396 + }, + { + "attributes": {}, + "tag": "li", + "end": 37401, + "start": 37396, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 37406, + "start": 37401, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 37412, + "start": 37406, + "tag_type": 2 + }, + { + "start": 37412, + "end": 37416 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 37437, + "start": 37416, + "tag_type": 1 + }, + { + "start": 37437, + "end": 37445 + }, + { + "attributes": { + "id": "jump-review", + "name": "jump-review" + }, + "tag": "h3", + "end": 37481, + "start": 37445, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 37520, + "start": 37481, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 37527, + "start": 37520, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 37531, + "start": 37527, + "tag_type": 1 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 37548, + "start": 37531, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 37554, + "start": 37548, + "tag_type": 1 + }, + { + "start": 37554, + "end": 37565 + }, + { + "attributes": {}, + "tag": "span", + "end": 37572, + "start": 37565, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 37577, + "start": 37572, + "tag_type": 2 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 37598, + "start": 37577, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "tr", + "end": 37603, + "start": 37598, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 37611, + "start": 37603, + "tag_type": 2 + }, + { + "start": 37611, + "end": 37623 + }, + { + "attributes": {}, + "tag": "table", + "end": 37631, + "start": 37623, + "tag_type": 2 + }, + { + "start": 37631, + "end": 37639 + }, + { + "attributes": {}, + "tag": "h3", + "end": 37644, + "start": 37639, + "tag_type": 2 + }, + { + "start": 37644, + "end": 37660 + }, + { + "attributes": {}, + "tag": "p", + "end": 37663, + "start": 37660, + "tag_type": 1 + }, + { + "start": 37663, + "end": 37675 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 37695, + "start": 37675, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 37699, + "start": 37695, + "tag_type": 2 + }, + { + "start": 37699, + "end": 37713 + }, + { + "attributes": {}, + "tag": "p", + "end": 37717, + "start": 37713, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 37723, + "start": 37717, + "tag_type": 2 + }, + { + "attributes": { + "class": "review slice" + }, + "tag": "div", + "end": 37749, + "start": 37723, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 37752, + "start": 37749, + "tag_type": 1 + }, + { + "start": 37752, + "end": 37889 + }, + { + "attributes": {}, + "tag": "br", + "end": 37894, + "start": 37889, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "br", + "end": 37899, + "start": 37894, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550a.jpg", + "align": "left", + "hspace": "5", + "/": null + }, + "tag": "img", + "end": 37977, + "start": 37899, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 37982, + "start": 37977, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "strong", + "end": 37990, + "start": 37982, + "tag_type": 1 + }, + { + "start": 37990, + "end": 37998 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38007, + "start": 37998, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "br", + "end": 38012, + "start": 38007, + "tag_type": 3 + }, + { + "start": 38012, + "end": 38283 + }, + { + "attributes": {}, + "tag": "br", + "end": 38288, + "start": 38283, + "tag_type": 3 + }, + { + "attributes": { + "clear": "ALL" + }, + "tag": "br", + "end": 38304, + "start": 38288, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 38309, + "start": 38304, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550b.jpg", + "align": "left", + "hspace": "5", + "/": null + }, + "tag": "img", + "end": 38387, + "start": 38309, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 38392, + "start": 38387, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38400, + "start": 38392, + "tag_type": 1 + }, + { + "start": 38400, + "end": 38420 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38429, + "start": 38420, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "br", + "end": 38434, + "start": 38429, + "tag_type": 3 + }, + { + "start": 38434, + "end": 38575 + }, + { + "attributes": {}, + "tag": "br", + "end": 38580, + "start": 38575, + "tag_type": 3 + }, + { + "attributes": { + "clear": "ALL" + }, + "tag": "br", + "end": 38596, + "start": 38580, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 38601, + "start": 38596, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550c.jpg", + "align": "left", + "hspace": "5", + "/": null + }, + "tag": "img", + "end": 38679, + "start": 38601, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 38684, + "start": 38679, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38692, + "start": 38684, + "tag_type": 1 + }, + { + "start": 38692, + "end": 38710 + }, + { + "attributes": {}, + "tag": "strong", + "end": 38719, + "start": 38710, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "br", + "end": 38724, + "start": 38719, + "tag_type": 3 + }, + { + "start": 38724, + "end": 38909 + }, + { + "attributes": {}, + "tag": "br", + "end": 38914, + "start": 38909, + "tag_type": 3 + }, + { + "attributes": { + "clear": "ALL" + }, + "tag": "br", + "end": 38930, + "start": 38914, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 38935, + "start": 38930, + "tag_type": 3 + }, + { + "attributes": { + "src": "http://images.play.com/banners/SAM550d.jpg", + "align": "left", + "hspace": "5", + "/": null + }, + "tag": "img", + "end": 39013, + "start": 38935, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "br", + "end": 39018, + "start": 39013, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39026, + "start": 39018, + "tag_type": 1 + }, + { + "start": 39026, + "end": 39033 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39042, + "start": 39033, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "br", + "end": 39047, + "start": 39042, + "tag_type": 3 + }, + { + "start": 39047, + "end": 39147 + }, + { + "attributes": {}, + "tag": "br", + "end": 39152, + "start": 39147, + "tag_type": 3 + }, + { + "attributes": { + "clear": "ALL" + }, + "tag": "br", + "end": 39168, + "start": 39152, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 39172, + "start": 39168, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 39178, + "start": 39172, + "tag_type": 2 + }, + { + "start": 39178, + "end": 39182 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 39203, + "start": 39182, + "tag_type": 1 + }, + { + "start": 39203, + "end": 39211 + }, + { + "attributes": { + "id": "jump-customer-review", + "name": "jump-customer-review" + }, + "tag": "h3", + "end": 39265, + "start": 39211, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 39304, + "start": 39265, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 39311, + "start": 39304, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 39315, + "start": 39311, + "tag_type": 1 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 39332, + "start": 39315, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 39338, + "start": 39332, + "tag_type": 1 + }, + { + "start": 39338, + "end": 39354 + }, + { + "attributes": {}, + "tag": "span", + "end": 39361, + "start": 39354, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 39366, + "start": 39361, + "tag_type": 2 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 39387, + "start": 39366, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "tr", + "end": 39392, + "start": 39387, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 39400, + "start": 39392, + "tag_type": 2 + }, + { + "start": 39400, + "end": 39412 + }, + { + "attributes": {}, + "tag": "table", + "end": 39420, + "start": 39412, + "tag_type": 2 + }, + { + "start": 39420, + "end": 39428 + }, + { + "attributes": {}, + "tag": "h3", + "end": 39433, + "start": 39428, + "tag_type": 2 + }, + { + "start": 39433, + "end": 39449 + }, + { + "attributes": {}, + "tag": "p", + "end": 39452, + "start": 39449, + "tag_type": 1 + }, + { + "start": 39452, + "end": 39464 + }, + { + "attributes": { + "href": null + }, + "tag": "a", + "end": 39475, + "start": 39464, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 39479, + "start": 39475, + "tag_type": 2 + }, + { + "start": 39479, + "end": 39493 + }, + { + "attributes": {}, + "tag": "p", + "end": 39497, + "start": 39493, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 39503, + "start": 39497, + "tag_type": 2 + }, + { + "attributes": { + "class": "rnr slice" + }, + "tag": "div", + "end": 39526, + "start": 39503, + "tag_type": 1 + }, + { + "attributes": { + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_avarageRating__divAverage", + "class": "rnr-average" + }, + "tag": "div", + "end": 39645, + "start": 39526, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 39650, + "start": 39645, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50_x.gif", + "alt": "Customer rating on Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black): 5 out of 5 stars", + "style": "height:21px;width:106px;border-width:0px;" + }, + "tag": "img", + "end": 39901, + "start": 39650, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "div", + "end": 39907, + "start": 39901, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 39910, + "start": 39907, + "tag_type": 1 + }, + { + "start": 39910, + "end": 39926 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39934, + "start": 39926, + "tag_type": 1 + }, + { + "start": 39934, + "end": 39935 + }, + { + "attributes": {}, + "tag": "strong", + "end": 39944, + "start": 39935, + "tag_type": 2 + }, + { + "start": 39944, + "end": 39952 + }, + { + "attributes": {}, + "tag": "p", + "end": 39956, + "start": 39952, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 39962, + "start": 39956, + "tag_type": 2 + }, + { + "attributes": { + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_divHeaderLinks", + "class": "rnr-links" + }, + "tag": "div", + "end": 40068, + "start": 39962, + "tag_type": 1 + }, + { + "start": 40068, + "end": 40080 + }, + { + "attributes": {}, + "tag": "p", + "end": 40083, + "start": 40080, + "tag_type": 1 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV¤cy=257&source=0&action=addreview&subaction=productreviewadd&_productid=8986420&_region=ELEC&_producttitle=Samsung+Series+5+550+37%22+LE37B550+%2f+HD+1080p+%2f+Freeview+%2f+LCD+TV+(Black)&_smallimageavailable=1", + "title": "Write a review of Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)" + }, + "tag": "a", + "end": 40616, + "start": 40083, + "tag_type": 1 + }, + { + "start": 40616, + "end": 40630 + }, + { + "attributes": {}, + "tag": "a", + "end": 40634, + "start": 40630, + "tag_type": 2 + }, + { + "start": 40634, + "end": 40637 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 40863, + "start": 40637, + "tag_type": 1 + }, + { + "start": 40863, + "end": 40889 + }, + { + "attributes": {}, + "tag": "a", + "end": 40893, + "start": 40889, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 40897, + "start": 40893, + "tag_type": 2 + }, + { + "start": 40897, + "end": 40905 + }, + { + "attributes": {}, + "tag": "div", + "end": 40911, + "start": 40905, + "tag_type": 2 + }, + { + "start": 40911, + "end": 40927 + }, + { + "attributes": { + "class": "rnr-review" + }, + "tag": "div", + "end": 40951, + "start": 40927, + "tag_type": 1 + }, + { + "attributes": { + "class": "rnr-header" + }, + "tag": "div", + "end": 40975, + "start": 40951, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h4", + "end": 40979, + "start": 40975, + "tag_type": 1 + }, + { + "attributes": { + "name": "346537" + }, + "tag": "a", + "end": 40996, + "start": 40979, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 41000, + "start": 40996, + "tag_type": 2 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/spaces/stars50.gif", + "alt": "Customer rating: 5 out of 5 stars", + "style": "height:14px;width:71px;border-width:0px;" + }, + "tag": "img", + "end": 41167, + "start": 41000, + "tag_type": 3 + }, + { + "start": 41167, + "end": 41185 + }, + { + "attributes": {}, + "tag": "h4", + "end": 41190, + "start": 41185, + "tag_type": 2 + }, + { + "attributes": { + "class": "rnr-info" + }, + "tag": "p", + "end": 41210, + "start": 41190, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "strong", + "end": 41218, + "start": 41210, + "tag_type": 1 + }, + { + "start": 41218, + "end": 41225 + }, + { + "attributes": {}, + "tag": "strong", + "end": 41234, + "start": 41225, + "tag_type": 2 + }, + { + "start": 41234, + "end": 41247 + }, + { + "attributes": {}, + "tag": "span", + "end": 41253, + "start": 41247, + "tag_type": 1 + }, + { + "start": 41253, + "end": 41263 + }, + { + "attributes": {}, + "tag": "span", + "end": 41270, + "start": 41263, + "tag_type": 2 + }, + { + "start": 41270, + "end": 41283 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/UserReviews.html?rn=124580&edtm=0" + }, + "tag": "a", + "end": 41341, + "start": 41283, + "tag_type": 1 + }, + { + "start": 41341, + "end": 41377 + }, + { + "attributes": {}, + "tag": "a", + "end": 41381, + "start": 41377, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 41385, + "start": 41381, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 41391, + "start": 41385, + "tag_type": 2 + }, + { + "attributes": { + "class": "rnr-content" + }, + "tag": "div", + "end": 41416, + "start": 41391, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 41419, + "start": 41416, + "tag_type": 1 + }, + { + "start": 41419, + "end": 41562 + }, + { + "attributes": {}, + "tag": "p", + "end": 41566, + "start": 41562, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 41572, + "start": 41566, + "tag_type": 2 + }, + { + "attributes": { + "class": "rnr-footer" + }, + "tag": "div", + "end": 41596, + "start": 41572, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "p", + "end": 41599, + "start": 41596, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 41605, + "start": 41599, + "tag_type": 1 + }, + { + "start": 41605, + "end": 41638 + }, + { + "attributes": {}, + "tag": "span", + "end": 41645, + "start": 41638, + "tag_type": 2 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=REVIEW_VOTE&_reviewId=346537&_helpful=y", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__linkYes" + }, + "tag": "a", + "end": 42101, + "start": 41645, + "tag_type": 1 + }, + { + "start": 42101, + "end": 42104 + }, + { + "attributes": {}, + "tag": "a", + "end": 42108, + "start": 42104, + "tag_type": 2 + }, + { + "start": 42108, + "end": 42121 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=REVIEW_VOTE&_reviewId=346537&_helpful=n", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__linkNo" + }, + "tag": "a", + "end": 42576, + "start": 42121, + "tag_type": 1 + }, + { + "start": 42576, + "end": 42578 + }, + { + "attributes": {}, + "tag": "a", + "end": 42582, + "start": 42578, + "tag_type": 2 + }, + { + "start": 42582, + "end": 42595 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV&currency=257&source=0&action=addreview&subaction=report_review&_reviewId=346537", + "id": "_pageTemplate__product_ctl00__cacheable__customerReviews_ctl00_listReviews_ctl00_reviewItem__ReportReviewLink_lnkReportReview" + }, + "tag": "a", + "end": 43063, + "start": 42595, + "tag_type": 1 + }, + { + "start": 43063, + "end": 43075 + }, + { + "attributes": {}, + "tag": "a", + "end": 43079, + "start": 43075, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 43083, + "start": 43079, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 43089, + "start": 43083, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 43095, + "start": 43089, + "tag_type": 2 + }, + { + "start": 43095, + "end": 43115 + }, + { + "attributes": { + "class": "rnr-links" + }, + "tag": "div", + "end": 43138, + "start": 43115, + "tag_type": 1 + }, + { + "start": 43138, + "end": 43150 + }, + { + "attributes": {}, + "tag": "p", + "end": 43153, + "start": 43150, + "tag_type": 1 + }, + { + "attributes": { + "href": "https://www.play.com/OrdersPost.aspx?&returnURL=http://www.play.com/Product.aspx?searchtype=genre&r=ELEC&p=318&g=404&title=8986420&PRODUCT_TITLE=Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV¤cy=257&source=0&action=addreview&subaction=productreviewadd&_productid=8986420&_region=ELEC&_producttitle=Samsung+Series+5+550+37%22+LE37B550+%2f+HD+1080p+%2f+Freeview+%2f+LCD+TV+(Black)&_smallimageavailable=1", + "title": "Write a review of Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black)" + }, + "tag": "a", + "end": 43686, + "start": 43153, + "tag_type": 1 + }, + { + "start": 43686, + "end": 43700 + }, + { + "attributes": {}, + "tag": "a", + "end": 43704, + "start": 43700, + "tag_type": 2 + }, + { + "start": 43704, + "end": 43707 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/ProductReviews.html", + "title": "See all Samsung Series 5 550 37" LE37B550 / HD 1080p / Freeview / LCD TV (Black) reviews" + }, + "tag": "a", + "end": 43933, + "start": 43707, + "tag_type": 1 + }, + { + "start": 43933, + "end": 43959 + }, + { + "attributes": {}, + "tag": "a", + "end": 43963, + "start": 43959, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 43967, + "start": 43963, + "tag_type": 2 + }, + { + "start": 43967, + "end": 43975 + }, + { + "attributes": {}, + "tag": "div", + "end": 43981, + "start": 43975, + "tag_type": 2 + }, + { + "start": 43981, + "end": 43985 + }, + { + "attributes": {}, + "tag": "div", + "end": 43991, + "start": 43985, + "tag_type": 2 + }, + { + "start": 43991, + "end": 43995 + }, + { + "attributes": { + "class": "subhead" + }, + "tag": "div", + "end": 44016, + "start": 43995, + "tag_type": 1 + }, + { + "start": 44016, + "end": 44024 + }, + { + "attributes": {}, + "tag": "h3", + "end": 44029, + "start": 44024, + "tag_type": 1 + }, + { + "attributes": { + "cellpadding": "0", + "cellspacing": "0" + }, + "tag": "table", + "end": 44068, + "start": 44029, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 44075, + "start": 44068, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 44079, + "start": 44075, + "tag_type": 1 + }, + { + "attributes": { + "class": "text" + }, + "tag": "td", + "end": 44096, + "start": 44079, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "span", + "end": 44102, + "start": 44096, + "tag_type": 1 + }, + { + "start": 44102, + "end": 44129 + }, + { + "attributes": {}, + "tag": "span", + "end": 44136, + "start": 44129, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 44141, + "start": 44136, + "tag_type": 2 + }, + { + "attributes": { + "class": "tabend" + }, + "tag": "td", + "end": 44162, + "start": 44141, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "tr", + "end": 44167, + "start": 44162, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 44175, + "start": 44167, + "tag_type": 2 + }, + { + "start": 44175, + "end": 44187 + }, + { + "attributes": {}, + "tag": "table", + "end": 44195, + "start": 44187, + "tag_type": 2 + }, + { + "start": 44195, + "end": 44203 + }, + { + "attributes": {}, + "tag": "h3", + "end": 44208, + "start": 44203, + "tag_type": 2 + }, + { + "start": 44208, + "end": 44224 + }, + { + "attributes": {}, + "tag": "p", + "end": 44227, + "start": 44224, + "tag_type": 1 + }, + { + "start": 44227, + "end": 44239 + }, + { + "attributes": { + "href": null + }, + "tag": "a", + "end": 44250, + "start": 44239, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 44254, + "start": 44250, + "tag_type": 2 + }, + { + "start": 44254, + "end": 44268 + }, + { + "attributes": {}, + "tag": "p", + "end": 44272, + "start": 44268, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 44278, + "start": 44272, + "tag_type": 2 + }, + { + "attributes": { + "class": "related slice" + }, + "tag": "div", + "end": 44305, + "start": 44278, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 44329, + "start": 44305, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 44333, + "start": 44329, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 44337, + "start": 44333, + "tag_type": 1 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 44356, + "start": 44337, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986409/Samsung-Series-5-550-32-LE32B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 44473, + "start": 44356, + "tag_type": 1 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8986409s.jpg", + "alt": "Samsung Series 5 550 32" LE32B550 / HD 1080p / Freeview / LCD TV (Black)", + "style": "height:85px;width:85px;border-width:0px;" + }, + "tag": "img", + "end": 44737, + "start": 44473, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 44741, + "start": 44737, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 44747, + "start": 44741, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 44752, + "start": 44747, + "tag_type": 2 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 44769, + "start": 44752, + "tag_type": 1 + }, + { + "attributes": { + "class": "info" + }, + "tag": "div", + "end": 44787, + "start": 44769, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ul", + "end": 44791, + "start": 44787, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 44795, + "start": 44791, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986409/Samsung-Series-5-550-32-LE32B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 44912, + "start": 44795, + "tag_type": 1 + }, + { + "start": 44912, + "end": 45015 + }, + { + "attributes": {}, + "tag": "a", + "end": 45019, + "start": 45015, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 45024, + "start": 45019, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 45029, + "start": 45024, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45035, + "start": 45029, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 45040, + "start": 45035, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 45045, + "start": 45040, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 45053, + "start": 45045, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45059, + "start": 45053, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45065, + "start": 45059, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45071, + "start": 45065, + "tag_type": 2 + }, + { + "attributes": { + "class": "footnote wrap" + }, + "tag": "div", + "end": 45098, + "start": 45071, + "tag_type": 1 + }, + { + "attributes": { + "class": "email" + }, + "tag": "p", + "end": 45115, + "start": 45098, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/EmailAFriend.html" + }, + "tag": "a", + "end": 45181, + "start": 45115, + "tag_type": 1 + }, + { + "start": 45181, + "end": 45215 + }, + { + "attributes": {}, + "tag": "a", + "end": 45219, + "start": 45215, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 45223, + "start": 45219, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 45226, + "start": 45223, + "tag_type": 1 + }, + { + "start": 45226, + "end": 45255 + }, + { + "attributes": { + "style": "cursor:hand", + "href": "javascript:flagcorrections ('http://www.play.com/Correction.aspx','8986420','')" + }, + "tag": "a", + "end": 45365, + "start": 45255, + "tag_type": 1 + }, + { + "start": 45365, + "end": 45382 + }, + { + "attributes": {}, + "tag": "a", + "end": 45386, + "start": 45382, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 45390, + "start": 45386, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 45393, + "start": 45390, + "tag_type": 1 + }, + { + "attributes": { + "href": "#goto-top" + }, + "tag": "a", + "end": 45413, + "start": 45393, + "tag_type": 1 + }, + { + "start": 45413, + "end": 45424 + }, + { + "attributes": {}, + "tag": "a", + "end": 45428, + "start": 45424, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 45432, + "start": 45428, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45438, + "start": 45432, + "tag_type": 2 + }, + { + "start": 45438, + "end": 45462 + }, + { + "attributes": {}, + "tag": "div", + "end": 45468, + "start": 45462, + "tag_type": 2 + }, + { + "start": 45468, + "end": 45488 + }, + { + "attributes": {}, + "tag": "div", + "end": 45494, + "start": 45488, + "tag_type": 2 + }, + { + "start": 45494, + "end": 45514 + }, + { + "attributes": { + "id": "leftCol" + }, + "tag": "div", + "end": 45532, + "start": 45514, + "tag_type": 1 + }, + { + "start": 45532, + "end": 45556 + }, + { + "attributes": { + "class": "column" + }, + "tag": "div", + "end": 45576, + "start": 45556, + "tag_type": 1 + }, + { + "start": 45576, + "end": 45600 + }, + { + "attributes": { + "class": "browse wrap" + }, + "tag": "div", + "end": 45626, + "start": 45600, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 45647, + "start": 45626, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 45652, + "start": 45647, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 45657, + "start": 45652, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 45661, + "start": 45657, + "tag_type": 1 + }, + { + "start": 45661, + "end": 45679 + }, + { + "attributes": {}, + "tag": "h2", + "end": 45684, + "start": 45679, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45690, + "start": 45684, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45696, + "start": 45690, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 45702, + "start": 45696, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 45719, + "start": 45702, + "tag_type": 1 + }, + { + "start": 45719, + "end": 45727 + }, + { + "attributes": { + "class": "top" + }, + "tag": "ul", + "end": 45743, + "start": 45727, + "tag_type": 1 + }, + { + "start": 45743, + "end": 45755 + }, + { + "attributes": {}, + "tag": "li", + "end": 45759, + "start": 45755, + "tag_type": 1 + }, + { + "start": 45759, + "end": 45767 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/NewReleases.html" + }, + "tag": "a", + "end": 45822, + "start": 45767, + "tag_type": 1 + }, + { + "start": 45822, + "end": 45834 + }, + { + "attributes": {}, + "tag": "a", + "end": 45838, + "start": 45834, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 45843, + "start": 45838, + "tag_type": 2 + }, + { + "start": 45843, + "end": 45855 + }, + { + "attributes": {}, + "tag": "li", + "end": 45859, + "start": 45855, + "tag_type": 1 + }, + { + "start": 45859, + "end": 45867 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 45948, + "start": 45867, + "tag_type": 1 + }, + { + "start": 45948, + "end": 45959 + }, + { + "attributes": {}, + "tag": "a", + "end": 45963, + "start": 45959, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 45968, + "start": 45963, + "tag_type": 2 + }, + { + "start": 45968, + "end": 45980 + }, + { + "attributes": {}, + "tag": "li", + "end": 45984, + "start": 45980, + "tag_type": 1 + }, + { + "start": 45984, + "end": 45992 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 46073, + "start": 45992, + "tag_type": 1 + }, + { + "start": 46073, + "end": 46084 + }, + { + "attributes": {}, + "tag": "a", + "end": 46088, + "start": 46084, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46093, + "start": 46088, + "tag_type": 2 + }, + { + "start": 46093, + "end": 46105 + }, + { + "attributes": { + "class": "bottom" + }, + "tag": "li", + "end": 46124, + "start": 46105, + "tag_type": 1 + }, + { + "start": 46124, + "end": 46132 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RecentReleases.html?searchtype=genre" + }, + "tag": "a", + "end": 46217, + "start": 46132, + "tag_type": 1 + }, + { + "start": 46217, + "end": 46232 + }, + { + "attributes": {}, + "tag": "a", + "end": 46236, + "start": 46232, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46241, + "start": 46236, + "tag_type": 2 + }, + { + "start": 46241, + "end": 46253 + }, + { + "attributes": {}, + "tag": "ul", + "end": 46258, + "start": 46253, + "tag_type": 2 + }, + { + "start": 46258, + "end": 46270 + }, + { + "attributes": {}, + "tag": "ul", + "end": 46274, + "start": 46270, + "tag_type": 1 + }, + { + "start": 46274, + "end": 46286 + }, + { + "attributes": {}, + "tag": "li", + "end": 46291, + "start": 46286, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/996/1241/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46373, + "start": 46291, + "tag_type": 1 + }, + { + "start": 46373, + "end": 46379 + }, + { + "attributes": {}, + "tag": "a", + "end": 46383, + "start": 46379, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46388, + "start": 46383, + "tag_type": 2 + }, + { + "start": 46388, + "end": 46400 + }, + { + "attributes": {}, + "tag": "li", + "end": 46405, + "start": 46400, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/253/333/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46486, + "start": 46405, + "tag_type": 1 + }, + { + "start": 46486, + "end": 46496 + }, + { + "attributes": {}, + "tag": "a", + "end": 46500, + "start": 46496, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46505, + "start": 46500, + "tag_type": 2 + }, + { + "start": 46505, + "end": 46517 + }, + { + "attributes": {}, + "tag": "li", + "end": 46522, + "start": 46517, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/248/328/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46603, + "start": 46522, + "tag_type": 1 + }, + { + "start": 46603, + "end": 46627 + }, + { + "attributes": {}, + "tag": "a", + "end": 46631, + "start": 46627, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46636, + "start": 46631, + "tag_type": 2 + }, + { + "start": 46636, + "end": 46648 + }, + { + "attributes": {}, + "tag": "li", + "end": 46653, + "start": 46648, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/256/336/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46734, + "start": 46653, + "tag_type": 1 + }, + { + "start": 46734, + "end": 46749 + }, + { + "attributes": {}, + "tag": "a", + "end": 46753, + "start": 46749, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46758, + "start": 46753, + "tag_type": 2 + }, + { + "start": 46758, + "end": 46770 + }, + { + "attributes": {}, + "tag": "li", + "end": 46775, + "start": 46770, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/261/341/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46856, + "start": 46775, + "tag_type": 1 + }, + { + "start": 46856, + "end": 46859 + }, + { + "attributes": {}, + "tag": "a", + "end": 46863, + "start": 46859, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46868, + "start": 46863, + "tag_type": 2 + }, + { + "start": 46868, + "end": 46880 + }, + { + "attributes": {}, + "tag": "li", + "end": 46885, + "start": 46880, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/267/347/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 46966, + "start": 46885, + "tag_type": 1 + }, + { + "start": 46966, + "end": 46978 + }, + { + "attributes": {}, + "tag": "a", + "end": 46982, + "start": 46978, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 46987, + "start": 46982, + "tag_type": 2 + }, + { + "start": 46987, + "end": 46999 + }, + { + "attributes": {}, + "tag": "li", + "end": 47004, + "start": 46999, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/271/351/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47085, + "start": 47004, + "tag_type": 1 + }, + { + "start": 47085, + "end": 47095 + }, + { + "attributes": {}, + "tag": "a", + "end": 47099, + "start": 47095, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47104, + "start": 47099, + "tag_type": 2 + }, + { + "start": 47104, + "end": 47116 + }, + { + "attributes": {}, + "tag": "li", + "end": 47121, + "start": 47116, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/275/355/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47202, + "start": 47121, + "tag_type": 1 + }, + { + "start": 47202, + "end": 47215 + }, + { + "attributes": {}, + "tag": "a", + "end": 47219, + "start": 47215, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47224, + "start": 47219, + "tag_type": 2 + }, + { + "start": 47224, + "end": 47236 + }, + { + "attributes": {}, + "tag": "li", + "end": 47241, + "start": 47236, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/281/363/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47322, + "start": 47241, + "tag_type": 1 + }, + { + "start": 47322, + "end": 47333 + }, + { + "attributes": {}, + "tag": "a", + "end": 47337, + "start": 47333, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47342, + "start": 47337, + "tag_type": 2 + }, + { + "start": 47342, + "end": 47354 + }, + { + "attributes": {}, + "tag": "li", + "end": 47359, + "start": 47354, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/291/375/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47440, + "start": 47359, + "tag_type": 1 + }, + { + "start": 47440, + "end": 47448 + }, + { + "attributes": {}, + "tag": "a", + "end": 47452, + "start": 47448, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47457, + "start": 47452, + "tag_type": 2 + }, + { + "start": 47457, + "end": 47469 + }, + { + "attributes": {}, + "tag": "li", + "end": 47474, + "start": 47469, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/295/379/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47555, + "start": 47474, + "tag_type": 1 + }, + { + "start": 47555, + "end": 47569 + }, + { + "attributes": {}, + "tag": "a", + "end": 47573, + "start": 47569, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47578, + "start": 47573, + "tag_type": 2 + }, + { + "start": 47578, + "end": 47590 + }, + { + "attributes": {}, + "tag": "li", + "end": 47595, + "start": 47590, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/316/402/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47676, + "start": 47595, + "tag_type": 1 + }, + { + "start": 47676, + "end": 47683 + }, + { + "attributes": {}, + "tag": "a", + "end": 47687, + "start": 47683, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47692, + "start": 47687, + "tag_type": 2 + }, + { + "start": 47692, + "end": 47704 + }, + { + "attributes": { + "class": "selected" + }, + "tag": "li", + "end": 47725, + "start": 47704, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/RegionHome.html?searchtype=genre", + "class": "this" + }, + "tag": "a", + "end": 47819, + "start": 47725, + "tag_type": 1 + }, + { + "start": 47819, + "end": 47829 + }, + { + "attributes": {}, + "tag": "a", + "end": 47833, + "start": 47829, + "tag_type": 2 + }, + { + "start": 47833, + "end": 47841 + }, + { + "attributes": {}, + "tag": "ul", + "end": 47845, + "start": 47841, + "tag_type": 1 + }, + { + "start": 47845, + "end": 47857 + }, + { + "attributes": {}, + "tag": "li", + "end": 47862, + "start": 47857, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/319/405/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 47943, + "start": 47862, + "tag_type": 1 + }, + { + "start": 47943, + "end": 47967 + }, + { + "attributes": {}, + "tag": "a", + "end": 47971, + "start": 47967, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 47976, + "start": 47971, + "tag_type": 2 + }, + { + "start": 47976, + "end": 47988 + }, + { + "attributes": {}, + "tag": "li", + "end": 47993, + "start": 47988, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/320/406/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48074, + "start": 47993, + "tag_type": 1 + }, + { + "start": 48074, + "end": 48089 + }, + { + "attributes": {}, + "tag": "a", + "end": 48093, + "start": 48089, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48098, + "start": 48093, + "tag_type": 2 + }, + { + "start": 48098, + "end": 48110 + }, + { + "attributes": {}, + "tag": "li", + "end": 48115, + "start": 48110, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/949/1189/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48197, + "start": 48115, + "tag_type": 1 + }, + { + "start": 48197, + "end": 48217 + }, + { + "attributes": {}, + "tag": "a", + "end": 48221, + "start": 48217, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48226, + "start": 48221, + "tag_type": 2 + }, + { + "start": 48226, + "end": 48238 + }, + { + "attributes": { + "class": "bottom" + }, + "tag": "li", + "end": 48257, + "start": 48238, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/995/407/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48338, + "start": 48257, + "tag_type": 1 + }, + { + "start": 48338, + "end": 48349 + }, + { + "attributes": {}, + "tag": "a", + "end": 48353, + "start": 48349, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48358, + "start": 48353, + "tag_type": 2 + }, + { + "start": 48358, + "end": 48370 + }, + { + "attributes": {}, + "tag": "ul", + "end": 48375, + "start": 48370, + "tag_type": 2 + }, + { + "start": 48375, + "end": 48379 + }, + { + "attributes": {}, + "tag": "li", + "end": 48384, + "start": 48379, + "tag_type": 2 + }, + { + "start": 48384, + "end": 48396 + }, + { + "attributes": {}, + "tag": "li", + "end": 48401, + "start": 48396, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/2168/1435/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48484, + "start": 48401, + "tag_type": 1 + }, + { + "start": 48484, + "end": 48492 + }, + { + "attributes": {}, + "tag": "a", + "end": 48496, + "start": 48492, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48501, + "start": 48496, + "tag_type": 2 + }, + { + "start": 48501, + "end": 48513 + }, + { + "attributes": {}, + "tag": "li", + "end": 48518, + "start": 48513, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/988/1236/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48600, + "start": 48518, + "tag_type": 1 + }, + { + "start": 48600, + "end": 48620 + }, + { + "attributes": {}, + "tag": "a", + "end": 48624, + "start": 48620, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48629, + "start": 48624, + "tag_type": 2 + }, + { + "start": 48629, + "end": 48641 + }, + { + "attributes": {}, + "tag": "li", + "end": 48646, + "start": 48641, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/371/471/3-/RegionHome.html?searchtype=genre" + }, + "tag": "a", + "end": 48727, + "start": 48646, + "tag_type": 1 + }, + { + "start": 48727, + "end": 48735 + }, + { + "attributes": {}, + "tag": "a", + "end": 48739, + "start": 48735, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 48744, + "start": 48739, + "tag_type": 2 + }, + { + "start": 48744, + "end": 48756 + }, + { + "attributes": {}, + "tag": "ul", + "end": 48761, + "start": 48756, + "tag_type": 2 + }, + { + "start": 48761, + "end": 48765 + }, + { + "attributes": {}, + "tag": "ul", + "end": 48769, + "start": 48765, + "tag_type": 1 + }, + { + "start": 48769, + "end": 48773 + }, + { + "attributes": {}, + "tag": "li", + "end": 48777, + "start": 48773, + "tag_type": 1 + }, + { + "start": 48777, + "end": 48785 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/GenreCategories.html", + "class": "viewcats" + }, + "tag": "a", + "end": 48861, + "start": 48785, + "tag_type": 1 + }, + { + "start": 48861, + "end": 48888 + }, + { + "attributes": {}, + "tag": "a", + "end": 48892, + "start": 48888, + "tag_type": 2 + }, + { + "start": 48892, + "end": 48896 + }, + { + "attributes": {}, + "tag": "li", + "end": 48901, + "start": 48896, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 48906, + "start": 48901, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 48912, + "start": 48906, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 48918, + "start": 48912, + "tag_type": 2 + }, + { + "attributes": { + "class": "wrap" + }, + "tag": "div", + "end": 48936, + "start": 48918, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 48959, + "start": 48936, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 48963, + "start": 48959, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 48967, + "start": 48963, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 48972, + "start": 48967, + "tag_type": 1 + }, + { + "attributes": { + "href": "/campaign.aspx?campaign=4894&cid=4089054&dpr=0", + "manual_cm_sp": "digibrick.jpg-_-LeftLandingPageBanner1-_-ELEC", + "manual_cm_re": "Left-_-LandingPageBanner1-_-digibrick.jpg" + }, + "tag": "a", + "end": 49151, + "start": 48972, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/LANDING_BANNERS/164402.jpg", + "alt": "Digital Camera Store brick", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 49292, + "start": 49151, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 49296, + "start": 49292, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 49302, + "start": 49296, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 49307, + "start": 49302, + "tag_type": 2 + }, + { + "start": 49307, + "end": 49327 + }, + { + "attributes": {}, + "tag": "td", + "end": 49331, + "start": 49327, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 49336, + "start": 49331, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/240913/2-/Promo.html?dpr=240913", + "manual_cm_sp": "High-Def_35per.jpg-_-LeftLandingPageBanner2-_-ELEC", + "manual_cm_re": "Left-_-LandingPageBanner2-_-High-Def_35per.jpg" + }, + "tag": "a", + "end": 49534, + "start": 49336, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/LANDING_BANNERS/31800.jpg", + "alt": "New Hi Def Technology", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 49669, + "start": 49534, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 49673, + "start": 49669, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 49679, + "start": 49673, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 49684, + "start": 49679, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 49689, + "start": 49684, + "tag_type": 2 + }, + { + "start": 49689, + "end": 49697 + }, + { + "attributes": {}, + "tag": "table", + "end": 49705, + "start": 49697, + "tag_type": 2 + }, + { + "start": 49705, + "end": 49709 + }, + { + "attributes": {}, + "tag": "div", + "end": 49715, + "start": 49709, + "tag_type": 2 + }, + { + "attributes": { + "class": "hotpick wrap" + }, + "tag": "div", + "end": 49742, + "start": 49715, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 49763, + "start": 49742, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 49768, + "start": 49763, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 49773, + "start": 49768, + "tag_type": 1 + }, + { + "start": 49773, + "end": 49777 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/HotPicksList.html?searchtype=genre" + }, + "tag": "a", + "end": 49860, + "start": 49777, + "tag_type": 1 + }, + { + "start": 49860, + "end": 49868 + }, + { + "attributes": {}, + "tag": "h2", + "end": 49872, + "start": 49868, + "tag_type": 1 + }, + { + "start": 49872, + "end": 49894 + }, + { + "attributes": {}, + "tag": "h2", + "end": 49899, + "start": 49894, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 49903, + "start": 49899, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 49909, + "start": 49903, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 49915, + "start": 49909, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 49921, + "start": 49915, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 49938, + "start": 49921, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h5", + "end": 49942, + "start": 49938, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 50059, + "start": 49942, + "tag_type": 1 + }, + { + "start": 50059, + "end": 50136 + }, + { + "attributes": {}, + "tag": "a", + "end": 50140, + "start": 50136, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h5", + "end": 50145, + "start": 50140, + "tag_type": 2 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 50168, + "start": 50145, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 50172, + "start": 50168, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 50176, + "start": 50172, + "tag_type": 1 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 50195, + "start": 50176, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html", + "cssclass": "sideimagelink" + }, + "tag": "a", + "end": 50337, + "start": 50195, + "tag_type": 1 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8986397s.jpg", + "alt": "Samsung Series 4 450 32" LE32B450 / HD Ready / Freeview / LCD TV (Black)", + "style": "height:60px;width:60px;border-width:0px;", + "class": "sideimageline" + }, + "tag": "img", + "end": 50624, + "start": 50337, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 50628, + "start": 50624, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 50634, + "start": 50628, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 50639, + "start": 50634, + "tag_type": 2 + }, + { + "attributes": { + "class": "wide" + }, + "tag": "td", + "end": 50656, + "start": 50639, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h6", + "end": 50660, + "start": 50656, + "tag_type": 1 + }, + { + "start": 50660, + "end": 50672 + }, + { + "attributes": {}, + "tag": "span", + "end": 50678, + "start": 50672, + "tag_type": 1 + }, + { + "start": 50678, + "end": 50692 + }, + { + "attributes": {}, + "tag": "span", + "end": 50699, + "start": 50692, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h6", + "end": 50704, + "start": 50699, + "tag_type": 2 + }, + { + "attributes": { + "class": "saving" + }, + "tag": "p", + "end": 50722, + "start": 50704, + "tag_type": 1 + }, + { + "start": 50722, + "end": 50726 + }, + { + "attributes": {}, + "tag": "br", + "end": 50732, + "start": 50726, + "tag_type": 3 + }, + { + "attributes": { + "class": "rrp" + }, + "tag": "span", + "end": 50750, + "start": 50732, + "tag_type": 1 + }, + { + "start": 50750, + "end": 50762 + }, + { + "attributes": {}, + "tag": "span", + "end": 50769, + "start": 50762, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "br", + "end": 50775, + "start": 50769, + "tag_type": 3 + }, + { + "start": 50775, + "end": 50784 + }, + { + "attributes": {}, + "tag": "br", + "end": 50790, + "start": 50784, + "tag_type": 3 + }, + { + "attributes": { + "class": "drop" + }, + "tag": "span", + "end": 50809, + "start": 50790, + "tag_type": 1 + }, + { + "start": 50809, + "end": 50821 + }, + { + "attributes": {}, + "tag": "span", + "end": 50828, + "start": 50821, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 50832, + "start": 50828, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 50837, + "start": 50832, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 50842, + "start": 50837, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 50850, + "start": 50842, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 50866, + "start": 50850, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/HotPicksList.html?searchtype=genre" + }, + "tag": "a", + "end": 50949, + "start": 50866, + "tag_type": 1 + }, + { + "start": 50949, + "end": 50958 + }, + { + "attributes": {}, + "tag": "span", + "end": 50964, + "start": 50958, + "tag_type": 1 + }, + { + "start": 50964, + "end": 50965 + }, + { + "attributes": {}, + "tag": "span", + "end": 50972, + "start": 50965, + "tag_type": 2 + }, + { + "start": 50972, + "end": 50973 + }, + { + "attributes": {}, + "tag": "a", + "end": 50977, + "start": 50973, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 50981, + "start": 50977, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 50987, + "start": 50981, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 50993, + "start": 50987, + "tag_type": 2 + }, + { + "attributes": { + "class": "recentlyviewed wrap" + }, + "tag": "div", + "end": 51027, + "start": 50993, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 51048, + "start": 51027, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 51053, + "start": 51048, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 51058, + "start": 51053, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51062, + "start": 51058, + "tag_type": 1 + }, + { + "start": 51062, + "end": 51083 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51088, + "start": 51083, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51094, + "start": 51088, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51100, + "start": 51094, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51106, + "start": 51100, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 51123, + "start": 51106, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51127, + "start": 51123, + "tag_type": 1 + }, + { + "start": 51127, + "end": 51146 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51151, + "start": 51146, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51155, + "start": 51151, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 51159, + "start": 51155, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html" + }, + "tag": "a", + "end": 51276, + "start": 51159, + "tag_type": 1 + }, + { + "start": 51276, + "end": 51353 + }, + { + "attributes": {}, + "tag": "a", + "end": 51357, + "start": 51353, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51362, + "start": 51357, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51367, + "start": 51362, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 51383, + "start": 51367, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986420/-/Product.html" + }, + "tag": "a", + "end": 51444, + "start": 51383, + "tag_type": 1 + }, + { + "start": 51444, + "end": 51460 + }, + { + "attributes": { + "class": "orangepanel" + }, + "tag": "span", + "end": 51486, + "start": 51460, + "tag_type": 1 + }, + { + "start": 51486, + "end": 51487 + }, + { + "attributes": {}, + "tag": "span", + "end": 51494, + "start": 51487, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 51498, + "start": 51494, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 51502, + "start": 51498, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51508, + "start": 51502, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51514, + "start": 51508, + "tag_type": 2 + }, + { + "attributes": { + "class": "charts wrap", + "id": "charts" + }, + "tag": "div", + "end": 51551, + "start": 51514, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 51572, + "start": 51551, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 51577, + "start": 51572, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 51582, + "start": 51577, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51586, + "start": 51582, + "tag_type": 1 + }, + { + "start": 51586, + "end": 51592 + }, + { + "attributes": {}, + "tag": "h2", + "end": 51597, + "start": 51592, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51603, + "start": 51597, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51609, + "start": 51603, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 51615, + "start": 51609, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 51632, + "start": 51615, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51636, + "start": 51632, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 51640, + "start": 51636, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/TopSellers.html" + }, + "tag": "a", + "end": 51694, + "start": 51640, + "tag_type": 1 + }, + { + "start": 51694, + "end": 51705 + }, + { + "attributes": {}, + "tag": "a", + "end": 51709, + "start": 51705, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 51713, + "start": 51709, + "tag_type": 1 + }, + { + "attributes": { + "class": "charts-topsellers" + }, + "tag": "li", + "end": 51743, + "start": 51713, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51747, + "start": 51743, + "tag_type": 1 + }, + { + "start": 51747, + "end": 51758 + }, + { + "attributes": {}, + "tag": "h3", + "end": 51763, + "start": 51758, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51768, + "start": 51763, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51772, + "start": 51768, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/TopSellers.html" + }, + "tag": "a", + "end": 51810, + "start": 51772, + "tag_type": 1 + }, + { + "start": 51810, + "end": 51813 + }, + { + "attributes": {}, + "tag": "a", + "end": 51817, + "start": 51813, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51822, + "start": 51817, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51826, + "start": 51822, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/6-/TopSellers.html" + }, + "tag": "a", + "end": 51865, + "start": 51826, + "tag_type": 1 + }, + { + "start": 51865, + "end": 51870 + }, + { + "attributes": {}, + "tag": "a", + "end": 51874, + "start": 51870, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51879, + "start": 51874, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51883, + "start": 51879, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/6-/TopSellers.html" + }, + "tag": "a", + "end": 51925, + "start": 51883, + "tag_type": 1 + }, + { + "start": 51925, + "end": 51930 + }, + { + "attributes": {}, + "tag": "a", + "end": 51934, + "start": 51930, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51939, + "start": 51934, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 51943, + "start": 51939, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/TopSellers.html" + }, + "tag": "a", + "end": 51994, + "start": 51943, + "tag_type": 1 + }, + { + "start": 51994, + "end": 52001 + }, + { + "attributes": {}, + "tag": "a", + "end": 52005, + "start": 52001, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52010, + "start": 52005, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52014, + "start": 52010, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/TopSellers.html" + }, + "tag": "a", + "end": 52061, + "start": 52014, + "tag_type": 1 + }, + { + "start": 52061, + "end": 52071 + }, + { + "attributes": {}, + "tag": "a", + "end": 52075, + "start": 52071, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52080, + "start": 52075, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52084, + "start": 52080, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Calendars/6-/TopSellers.html" + }, + "tag": "a", + "end": 52130, + "start": 52084, + "tag_type": 1 + }, + { + "start": 52130, + "end": 52139 + }, + { + "attributes": {}, + "tag": "a", + "end": 52143, + "start": 52139, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52148, + "start": 52143, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52152, + "start": 52148, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/TopSellers.html" + }, + "tag": "a", + "end": 52193, + "start": 52152, + "tag_type": 1 + }, + { + "start": 52193, + "end": 52203 + }, + { + "attributes": {}, + "tag": "a", + "end": 52207, + "start": 52203, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52212, + "start": 52207, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52216, + "start": 52212, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/DS/6-/TopSellers.html" + }, + "tag": "a", + "end": 52255, + "start": 52216, + "tag_type": 1 + }, + { + "start": 52255, + "end": 52263 + }, + { + "attributes": {}, + "tag": "a", + "end": 52267, + "start": 52263, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52272, + "start": 52267, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52276, + "start": 52272, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/TopSellers.html" + }, + "tag": "a", + "end": 52325, + "start": 52276, + "tag_type": 1 + }, + { + "start": 52325, + "end": 52334 + }, + { + "attributes": {}, + "tag": "a", + "end": 52338, + "start": 52334, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52343, + "start": 52338, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52347, + "start": 52343, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/TopSellers.html" + }, + "tag": "a", + "end": 52399, + "start": 52347, + "tag_type": 1 + }, + { + "start": 52399, + "end": 52408 + }, + { + "attributes": {}, + "tag": "a", + "end": 52412, + "start": 52408, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52417, + "start": 52412, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52421, + "start": 52417, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/TopSellers.html" + }, + "tag": "a", + "end": 52466, + "start": 52421, + "tag_type": 1 + }, + { + "start": 52466, + "end": 52480 + }, + { + "attributes": {}, + "tag": "a", + "end": 52484, + "start": 52480, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52489, + "start": 52484, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52493, + "start": 52489, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/6-/TopSellers.html" + }, + "tag": "a", + "end": 52532, + "start": 52493, + "tag_type": 1 + }, + { + "start": 52532, + "end": 52540 + }, + { + "attributes": {}, + "tag": "a", + "end": 52544, + "start": 52540, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52549, + "start": 52544, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 52554, + "start": 52549, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52559, + "start": 52554, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52563, + "start": 52559, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 52620, + "start": 52563, + "tag_type": 1 + }, + { + "start": 52620, + "end": 52631 + }, + { + "attributes": {}, + "tag": "a", + "end": 52635, + "start": 52631, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 52639, + "start": 52635, + "tag_type": 1 + }, + { + "attributes": { + "class": "charts-comingsoon" + }, + "tag": "li", + "end": 52669, + "start": 52639, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 52673, + "start": 52669, + "tag_type": 1 + }, + { + "start": 52673, + "end": 52684 + }, + { + "attributes": {}, + "tag": "h3", + "end": 52689, + "start": 52684, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52694, + "start": 52689, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52698, + "start": 52694, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 52739, + "start": 52698, + "tag_type": 1 + }, + { + "start": 52739, + "end": 52742 + }, + { + "attributes": {}, + "tag": "a", + "end": 52746, + "start": 52742, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52751, + "start": 52746, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52755, + "start": 52751, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 52797, + "start": 52755, + "tag_type": 1 + }, + { + "start": 52797, + "end": 52802 + }, + { + "attributes": {}, + "tag": "a", + "end": 52806, + "start": 52802, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52811, + "start": 52806, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52815, + "start": 52811, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MP3-Download/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 52867, + "start": 52815, + "tag_type": 1 + }, + { + "start": 52867, + "end": 52884 + }, + { + "attributes": {}, + "tag": "a", + "end": 52888, + "start": 52884, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52893, + "start": 52888, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52897, + "start": 52893, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MP3-Download-Album/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 52955, + "start": 52897, + "tag_type": 1 + }, + { + "start": 52955, + "end": 52974 + }, + { + "attributes": {}, + "tag": "a", + "end": 52978, + "start": 52974, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52983, + "start": 52978, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 52987, + "start": 52983, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/MP3-Download-Track/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53045, + "start": 52987, + "tag_type": 1 + }, + { + "start": 53045, + "end": 53064 + }, + { + "attributes": {}, + "tag": "a", + "end": 53068, + "start": 53064, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53073, + "start": 53068, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53077, + "start": 53073, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53122, + "start": 53077, + "tag_type": 1 + }, + { + "start": 53122, + "end": 53127 + }, + { + "attributes": {}, + "tag": "a", + "end": 53131, + "start": 53127, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53136, + "start": 53131, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53140, + "start": 53136, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53190, + "start": 53140, + "tag_type": 1 + }, + { + "start": 53190, + "end": 53200 + }, + { + "attributes": {}, + "tag": "a", + "end": 53204, + "start": 53200, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53209, + "start": 53204, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53213, + "start": 53209, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Calendars/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53262, + "start": 53213, + "tag_type": 1 + }, + { + "start": 53262, + "end": 53271 + }, + { + "attributes": {}, + "tag": "a", + "end": 53275, + "start": 53271, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53280, + "start": 53275, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53284, + "start": 53280, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53328, + "start": 53284, + "tag_type": 1 + }, + { + "start": 53328, + "end": 53338 + }, + { + "attributes": {}, + "tag": "a", + "end": 53342, + "start": 53338, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53347, + "start": 53342, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53351, + "start": 53347, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox360/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53398, + "start": 53351, + "tag_type": 1 + }, + { + "start": 53398, + "end": 53412 + }, + { + "attributes": {}, + "tag": "a", + "end": 53416, + "start": 53412, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53421, + "start": 53416, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53425, + "start": 53421, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53477, + "start": 53425, + "tag_type": 1 + }, + { + "start": 53477, + "end": 53486 + }, + { + "attributes": {}, + "tag": "a", + "end": 53490, + "start": 53486, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53495, + "start": 53490, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53499, + "start": 53495, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PSP/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53542, + "start": 53499, + "tag_type": 1 + }, + { + "start": 53542, + "end": 53551 + }, + { + "attributes": {}, + "tag": "a", + "end": 53555, + "start": 53551, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53560, + "start": 53555, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53564, + "start": 53560, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/DS/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53606, + "start": 53564, + "tag_type": 1 + }, + { + "start": 53606, + "end": 53614 + }, + { + "attributes": {}, + "tag": "a", + "end": 53618, + "start": 53614, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53623, + "start": 53618, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53627, + "start": 53623, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53682, + "start": 53627, + "tag_type": 1 + }, + { + "start": 53682, + "end": 53691 + }, + { + "attributes": {}, + "tag": "a", + "end": 53695, + "start": 53691, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53700, + "start": 53695, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53704, + "start": 53700, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53752, + "start": 53704, + "tag_type": 1 + }, + { + "start": 53752, + "end": 53766 + }, + { + "attributes": {}, + "tag": "a", + "end": 53770, + "start": 53766, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53775, + "start": 53770, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53779, + "start": 53775, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53821, + "start": 53779, + "tag_type": 1 + }, + { + "start": 53821, + "end": 53829 + }, + { + "attributes": {}, + "tag": "a", + "end": 53833, + "start": 53829, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53838, + "start": 53833, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53842, + "start": 53838, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/PreOrderChart.html" + }, + "tag": "a", + "end": 53891, + "start": 53842, + "tag_type": 1 + }, + { + "start": 53891, + "end": 53898 + }, + { + "attributes": {}, + "tag": "a", + "end": 53902, + "start": 53898, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53907, + "start": 53902, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 53912, + "start": 53907, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53917, + "start": 53912, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 53921, + "start": 53917, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/RecentReleases.html" + }, + "tag": "a", + "end": 53979, + "start": 53921, + "tag_type": 1 + }, + { + "start": 53979, + "end": 53994 + }, + { + "attributes": {}, + "tag": "a", + "end": 53998, + "start": 53994, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 54002, + "start": 53998, + "tag_type": 1 + }, + { + "attributes": { + "class": "charts-newreleases" + }, + "tag": "li", + "end": 54033, + "start": 54002, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54037, + "start": 54033, + "tag_type": 1 + }, + { + "start": 54037, + "end": 54049 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54054, + "start": 54049, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54059, + "start": 54054, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54063, + "start": 54059, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54105, + "start": 54063, + "tag_type": 1 + }, + { + "start": 54105, + "end": 54108 + }, + { + "attributes": {}, + "tag": "a", + "end": 54112, + "start": 54108, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54117, + "start": 54112, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54121, + "start": 54117, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54164, + "start": 54121, + "tag_type": 1 + }, + { + "start": 54164, + "end": 54169 + }, + { + "attributes": {}, + "tag": "a", + "end": 54173, + "start": 54169, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54178, + "start": 54173, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54182, + "start": 54178, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/Books/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54228, + "start": 54182, + "tag_type": 1 + }, + { + "start": 54228, + "end": 54233 + }, + { + "attributes": {}, + "tag": "a", + "end": 54237, + "start": 54233, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54242, + "start": 54237, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54246, + "start": 54242, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Books/AudioBooks/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54297, + "start": 54246, + "tag_type": 1 + }, + { + "start": 54297, + "end": 54307 + }, + { + "attributes": {}, + "tag": "a", + "end": 54311, + "start": 54307, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54316, + "start": 54311, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54320, + "start": 54316, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54365, + "start": 54320, + "tag_type": 1 + }, + { + "start": 54365, + "end": 54375 + }, + { + "attributes": {}, + "tag": "a", + "end": 54379, + "start": 54375, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54384, + "start": 54379, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54388, + "start": 54384, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54441, + "start": 54388, + "tag_type": 1 + }, + { + "start": 54441, + "end": 54450 + }, + { + "attributes": {}, + "tag": "a", + "end": 54454, + "start": 54450, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54459, + "start": 54454, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54463, + "start": 54459, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54519, + "start": 54463, + "tag_type": 1 + }, + { + "start": 54519, + "end": 54528 + }, + { + "attributes": {}, + "tag": "a", + "end": 54532, + "start": 54528, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54537, + "start": 54532, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54541, + "start": 54537, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54590, + "start": 54541, + "tag_type": 1 + }, + { + "start": 54590, + "end": 54604 + }, + { + "attributes": {}, + "tag": "a", + "end": 54608, + "start": 54604, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54613, + "start": 54608, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54617, + "start": 54613, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54660, + "start": 54617, + "tag_type": 1 + }, + { + "start": 54660, + "end": 54668 + }, + { + "attributes": {}, + "tag": "a", + "end": 54672, + "start": 54668, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54677, + "start": 54672, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54681, + "start": 54677, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RecentReleases.html" + }, + "tag": "a", + "end": 54731, + "start": 54681, + "tag_type": 1 + }, + { + "start": 54731, + "end": 54738 + }, + { + "attributes": {}, + "tag": "a", + "end": 54742, + "start": 54738, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54747, + "start": 54742, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 54752, + "start": 54747, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54757, + "start": 54752, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54761, + "start": 54757, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8986420/Samsung-Series-5-550-37-LE37B550-HD-1080p-Freeview-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 54904, + "start": 54761, + "tag_type": 1 + }, + { + "start": 54904, + "end": 54911 + }, + { + "attributes": {}, + "tag": "a", + "end": 54915, + "start": 54911, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 54919, + "start": 54915, + "tag_type": 1 + }, + { + "attributes": { + "class": "charts-top100" + }, + "tag": "li", + "end": 54945, + "start": 54919, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54949, + "start": 54945, + "tag_type": 1 + }, + { + "start": 54949, + "end": 54956 + }, + { + "attributes": {}, + "tag": "h3", + "end": 54961, + "start": 54956, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54966, + "start": 54961, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 54970, + "start": 54966, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/Top100.html" + }, + "tag": "a", + "end": 55004, + "start": 54970, + "tag_type": 1 + }, + { + "start": 55004, + "end": 55007 + }, + { + "attributes": {}, + "tag": "a", + "end": 55011, + "start": 55007, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55016, + "start": 55011, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55020, + "start": 55016, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Music/CD/6-/Top100.html" + }, + "tag": "a", + "end": 55055, + "start": 55020, + "tag_type": 1 + }, + { + "start": 55055, + "end": 55060 + }, + { + "attributes": {}, + "tag": "a", + "end": 55064, + "start": 55060, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55069, + "start": 55064, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55073, + "start": 55069, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/Xbox/6-/Top100.html" + }, + "tag": "a", + "end": 55110, + "start": 55073, + "tag_type": 1 + }, + { + "start": 55110, + "end": 55120 + }, + { + "attributes": {}, + "tag": "a", + "end": 55124, + "start": 55120, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55129, + "start": 55124, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55133, + "start": 55129, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PlayStation2/6-/Top100.html" + }, + "tag": "a", + "end": 55178, + "start": 55133, + "tag_type": 1 + }, + { + "start": 55178, + "end": 55187 + }, + { + "attributes": {}, + "tag": "a", + "end": 55191, + "start": 55187, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55196, + "start": 55191, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55200, + "start": 55196, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameBoyAdvanced/6-/Top100.html" + }, + "tag": "a", + "end": 55248, + "start": 55200, + "tag_type": 1 + }, + { + "start": 55248, + "end": 55257 + }, + { + "attributes": {}, + "tag": "a", + "end": 55261, + "start": 55257, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55266, + "start": 55261, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55270, + "start": 55266, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/GameCube/6-/Top100.html" + }, + "tag": "a", + "end": 55311, + "start": 55270, + "tag_type": 1 + }, + { + "start": 55311, + "end": 55325 + }, + { + "attributes": {}, + "tag": "a", + "end": 55329, + "start": 55325, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55334, + "start": 55329, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55338, + "start": 55334, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Games/PC/6-/Top100.html" + }, + "tag": "a", + "end": 55373, + "start": 55338, + "tag_type": 1 + }, + { + "start": 55373, + "end": 55381 + }, + { + "attributes": {}, + "tag": "a", + "end": 55385, + "start": 55381, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55390, + "start": 55385, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55395, + "start": 55390, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 55400, + "start": 55395, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 55405, + "start": 55400, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55411, + "start": 55405, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55417, + "start": 55411, + "tag_type": 2 + }, + { + "attributes": { + "class": "help wrap" + }, + "tag": "div", + "end": 55441, + "start": 55417, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 55462, + "start": 55441, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 55467, + "start": 55462, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 55472, + "start": 55467, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 55476, + "start": 55472, + "tag_type": 1 + }, + { + "start": 55476, + "end": 55489 + }, + { + "attributes": {}, + "tag": "h2", + "end": 55494, + "start": 55489, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55500, + "start": 55494, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55506, + "start": 55500, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55512, + "start": 55506, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 55529, + "start": 55512, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk", + "title": "Play.com Helpdesk" + }, + "tag": "a", + "end": 55603, + "start": 55529, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/helpdesk.gif", + "style": "border-style:None;height:56px;width:163px;border-width:0px;", + "title": "Play.com Helpdesk" + }, + "tag": "img", + "end": 55775, + "start": 55603, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 55779, + "start": 55775, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55785, + "start": 55779, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 55791, + "start": 55785, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 55820, + "start": 55791, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 55825, + "start": 55820, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8821116/-/Product.html?page=title&dpr=0", + "manual_cm_re": "Left-_-SideBanner1-_-ELEC_freeAlbumDownload_double.jpg" + }, + "tag": "a", + "end": 55977, + "start": 55825, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/253462.jpg", + "alt": "Free album download - Double", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 56117, + "start": 55977, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 56121, + "start": 56117, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56127, + "start": 56121, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56133, + "start": 56127, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 56162, + "start": 56133, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 56167, + "start": 56162, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Campaign.html?campaign=6453&cid=2839989&dpr=0", + "manual_cm_sp": "ELEC_SonyHeadphones.jpg-_-LeftSideBanner3-_-ELEC", + "manual_cm_re": "Left-_-SideBanner3-_-ELEC_SonyHeadphones.jpg" + }, + "tag": "a", + "end": 56352, + "start": 56167, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/208001.jpg", + "alt": "Sony Headphones", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 56479, + "start": 56352, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 56483, + "start": 56479, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56489, + "start": 56483, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56495, + "start": 56489, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 56524, + "start": 56495, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 56529, + "start": 56524, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/255882/2-/Promo.html?dpr=255882", + "manual_cm_sp": "ELEC_ToshibaDVD_GBP.jpg_GBP-_-LeftSideBanner4-_-ELEC", + "manual_cm_re": "Left-_-SideBanner4-_-ELEC_ToshibaDVD_GBP.jpg_GBP" + }, + "tag": "a", + "end": 56731, + "start": 56529, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/181202_GBP.jpg", + "alt": "Toshiba DVD Players", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 56866, + "start": 56731, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 56870, + "start": 56866, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56876, + "start": 56870, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 56882, + "start": 56876, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 56911, + "start": 56882, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 56916, + "start": 56911, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/166828/2-/Promo.html?dpr=166828", + "manual_cm_sp": "ELEC_LogitechRemotes.gif-_-LeftSideBanner5-_-ELEC", + "manual_cm_re": "Left-_-SideBanner5-_-ELEC_LogitechRemotes.gif" + }, + "tag": "a", + "end": 57112, + "start": 56916, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/218403.gif", + "alt": "Logitech Remotes", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 57240, + "start": 57112, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 57244, + "start": 57240, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57250, + "start": 57244, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57256, + "start": 57250, + "tag_type": 2 + }, + { + "attributes": { + "class": "playstores wrap" + }, + "tag": "div", + "end": 57286, + "start": 57256, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 57307, + "start": 57286, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 57312, + "start": 57307, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 57317, + "start": 57312, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 57321, + "start": 57317, + "tag_type": 1 + }, + { + "start": 57321, + "end": 57332 + }, + { + "attributes": {}, + "tag": "h2", + "end": 57337, + "start": 57332, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57343, + "start": 57337, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57349, + "start": 57343, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57355, + "start": 57349, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 57372, + "start": 57355, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 57377, + "start": 57372, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6383&cid=5044118" + }, + "tag": "a", + "end": 57441, + "start": 57377, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_disney.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 57530, + "start": 57441, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 57534, + "start": 57530, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57540, + "start": 57534, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57545, + "start": 57540, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/6-/Campaign.html?campaign=2450&cid=9602708" + }, + "tag": "a", + "end": 57623, + "start": 57545, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_sony.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 57710, + "start": 57623, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 57714, + "start": 57710, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57720, + "start": 57714, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57725, + "start": 57720, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=621&cid=6096431" + }, + "tag": "a", + "end": 57788, + "start": 57725, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_dummies.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 57878, + "start": 57788, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 57882, + "start": 57878, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57888, + "start": 57882, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 57893, + "start": 57888, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6001&cid=3425819" + }, + "tag": "a", + "end": 57957, + "start": 57893, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_nintendo.jpg", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 58048, + "start": 57957, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 58052, + "start": 58048, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58058, + "start": 58052, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58063, + "start": 58058, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=2030&cid=6256562" + }, + "tag": "a", + "end": 58127, + "start": 58063, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/ea_store.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 58212, + "start": 58127, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 58216, + "start": 58212, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58222, + "start": 58216, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58227, + "start": 58222, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=2720&cid=6896143" + }, + "tag": "a", + "end": 58291, + "start": 58227, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/newimages/store_hbo.gif", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 58377, + "start": 58291, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 58381, + "start": 58377, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58387, + "start": 58381, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58393, + "start": 58387, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58399, + "start": 58393, + "tag_type": 2 + }, + { + "start": 58399, + "end": 58407 + }, + { + "attributes": {}, + "tag": "div", + "end": 58413, + "start": 58407, + "tag_type": 2 + }, + { + "start": 58413, + "end": 58417 + }, + { + "attributes": {}, + "tag": "div", + "end": 58423, + "start": 58417, + "tag_type": 2 + }, + { + "start": 58423, + "end": 58427 + }, + { + "attributes": { + "class": "clear" + }, + "tag": "div", + "end": 58446, + "start": 58427, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 58452, + "start": 58446, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58458, + "start": 58452, + "tag_type": 2 + }, + { + "start": 58458, + "end": 58478 + }, + { + "attributes": { + "id": "rightCol" + }, + "tag": "div", + "end": 58497, + "start": 58478, + "tag_type": 1 + }, + { + "start": 58497, + "end": 58521 + }, + { + "attributes": { + "class": "column" + }, + "tag": "div", + "end": 58541, + "start": 58521, + "tag_type": 1 + }, + { + "start": 58541, + "end": 58561 + }, + { + "attributes": { + "class": "shortbanner wrap" + }, + "tag": "div", + "end": 58591, + "start": 58561, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 58596, + "start": 58591, + "tag_type": 1 + }, + { + "attributes": { + "href": "/campaign.aspx?campaign=6688&cid=5685422&dpr=0", + "manual_cm_sp": "ELEC_valpak.jpg-_-RightShortBanner1-_-ELEC", + "manual_cm_re": "Right-_-ShortBanner1-_-ELEC_valpak.jpg" + }, + "tag": "a", + "end": 58769, + "start": 58596, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SHORT_BANNERS/220656.jpg", + "alt": "Valpak - short banner", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 58903, + "start": 58769, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 58907, + "start": 58903, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58913, + "start": 58907, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 58919, + "start": 58913, + "tag_type": 2 + }, + { + "attributes": { + "class": "shortbanner wrap" + }, + "tag": "div", + "end": 58949, + "start": 58919, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 58954, + "start": 58949, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/2074/2-/Promo.html?dpr=2074", + "manual_cm_sp": "ELEC_I-Pod-Speakers.jpg-_-RightShortBanner2-_-ELEC", + "manual_cm_re": "Right-_-ShortBanner2-_-ELEC_I-Pod-Speakers.jpg" + }, + "tag": "a", + "end": 59148, + "start": 58954, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SHORT_BANNERS/10287.jpg", + "alt": "iPod speakers Save Up To 50%", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 59288, + "start": 59148, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 59292, + "start": 59288, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 59298, + "start": 59292, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 59304, + "start": 59298, + "tag_type": 2 + }, + { + "attributes": { + "class": "countdown wrap" + }, + "tag": "div", + "end": 59333, + "start": 59304, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 59354, + "start": 59333, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 59359, + "start": 59354, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 59364, + "start": 59359, + "tag_type": 1 + }, + { + "start": 59364, + "end": 59368 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/CountDownList.html?searchtype=genre" + }, + "tag": "a", + "end": 59452, + "start": 59368, + "tag_type": 1 + }, + { + "start": 59452, + "end": 59460 + }, + { + "attributes": {}, + "tag": "h2", + "end": 59464, + "start": 59460, + "tag_type": 1 + }, + { + "start": 59464, + "end": 59473 + }, + { + "attributes": {}, + "tag": "h2", + "end": 59478, + "start": 59473, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 59482, + "start": 59478, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 59488, + "start": 59482, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 59494, + "start": 59488, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 59500, + "start": 59494, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 59517, + "start": 59500, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 59540, + "start": 59517, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 59544, + "start": 59540, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 59548, + "start": 59544, + "tag_type": 1 + }, + { + "attributes": { + "class": "image" + }, + "tag": "div", + "end": 59567, + "start": 59548, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 59720, + "start": 59567, + "tag_type": 1 + }, + { + "attributes": { + "onerror": null, + "src": "http://images.play.com/covers/8839534s.jpg", + "alt": "Sony Bravia S Series 26" 26S5500 HD Ready Freeview Widescreen LCD TV", + "style": "height:60px;width:60px;border-width:0px;", + "class": "sideimageline" + }, + "tag": "img", + "end": 60003, + "start": 59720, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 60007, + "start": 60003, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60013, + "start": 60007, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 60018, + "start": 60013, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 60022, + "start": 60018, + "tag_type": 1 + }, + { + "attributes": { + "class": "days" + }, + "tag": "div", + "end": 60040, + "start": 60022, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/countdown/28.gif", + "style": "border-width:0px;", + "border": "0" + }, + "tag": "img", + "end": 60153, + "start": 60040, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "div", + "end": 60159, + "start": 60153, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 60164, + "start": 60159, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60169, + "start": 60164, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60173, + "start": 60169, + "tag_type": 1 + }, + { + "attributes": { + "colspan": "2" + }, + "tag": "td", + "end": 60187, + "start": 60173, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h5", + "end": 60191, + "start": 60187, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html?searchtype=genre" + }, + "tag": "a", + "end": 60344, + "start": 60191, + "tag_type": 1 + }, + { + "start": 60344, + "end": 60417 + }, + { + "attributes": {}, + "tag": "a", + "end": 60421, + "start": 60417, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h5", + "end": 60426, + "start": 60421, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 60431, + "start": 60426, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60436, + "start": 60431, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60440, + "start": 60436, + "tag_type": 1 + }, + { + "attributes": { + "colspan": "2" + }, + "tag": "td", + "end": 60454, + "start": 60440, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h6", + "end": 60458, + "start": 60454, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h6", + "end": 60462, + "start": 60458, + "tag_type": 1 + }, + { + "start": 60462, + "end": 60474 + }, + { + "attributes": {}, + "tag": "span", + "end": 60480, + "start": 60474, + "tag_type": 1 + }, + { + "start": 60480, + "end": 60494 + }, + { + "attributes": {}, + "tag": "span", + "end": 60501, + "start": 60494, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h6", + "end": 60506, + "start": 60501, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "h6", + "end": 60511, + "start": 60506, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 60516, + "start": 60511, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 60521, + "start": 60516, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 60529, + "start": 60521, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 60545, + "start": 60529, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/CountDownList.html?searchtype=genre" + }, + "tag": "a", + "end": 60629, + "start": 60545, + "tag_type": 1 + }, + { + "start": 60629, + "end": 60638 + }, + { + "attributes": {}, + "tag": "span", + "end": 60644, + "start": 60638, + "tag_type": 1 + }, + { + "start": 60644, + "end": 60645 + }, + { + "attributes": {}, + "tag": "span", + "end": 60652, + "start": 60645, + "tag_type": 2 + }, + { + "start": 60652, + "end": 60653 + }, + { + "attributes": {}, + "tag": "a", + "end": 60657, + "start": 60653, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 60661, + "start": 60657, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60667, + "start": 60661, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60673, + "start": 60667, + "tag_type": 2 + }, + { + "attributes": { + "class": "topsellers wrap" + }, + "tag": "div", + "end": 60703, + "start": 60673, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 60724, + "start": 60703, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 60729, + "start": 60724, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 60734, + "start": 60729, + "tag_type": 1 + }, + { + "start": 60734, + "end": 60738 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 60819, + "start": 60738, + "tag_type": 1 + }, + { + "start": 60819, + "end": 60827 + }, + { + "attributes": {}, + "tag": "h2", + "end": 60831, + "start": 60827, + "tag_type": 1 + }, + { + "start": 60831, + "end": 60854 + }, + { + "attributes": {}, + "tag": "h2", + "end": 60859, + "start": 60854, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 60863, + "start": 60859, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60869, + "start": 60863, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60875, + "start": 60869, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 60881, + "start": 60875, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 60898, + "start": 60881, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ol", + "end": 60902, + "start": 60898, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 60906, + "start": 60902, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839538/Sony-Bravia-S-Series-32-32S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart01", + "title": "Price: \u00a3379.99 Free Delivery" + }, + "tag": "a", + "end": 61086, + "start": 60906, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61106, + "start": 61086, + "tag_type": 1 + }, + { + "start": 61106, + "end": 61212 + }, + { + "attributes": {}, + "tag": "span", + "end": 61219, + "start": 61212, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 61223, + "start": 61219, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61228, + "start": 61223, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61232, + "start": 61228, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8986397/Samsung-Series-4-450-32-LE32B450-HD-Ready-Freeview-LCD-TV/Product.html", + "class": "chart02", + "title": "Price: \u00a3334.99 Free Delivery" + }, + "tag": "a", + "end": 61402, + "start": 61232, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61422, + "start": 61402, + "tag_type": 1 + }, + { + "start": 61422, + "end": 61499 + }, + { + "attributes": {}, + "tag": "span", + "end": 61506, + "start": 61499, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 61510, + "start": 61506, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61515, + "start": 61510, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61519, + "start": 61515, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9159265/Humax-FoxSat-HDR-Freesat-320GB-HDD-DTR-HD-Recorder/Product.html", + "class": "chart03", + "title": "Price: \u00a3249.99 Free Delivery" + }, + "tag": "a", + "end": 61682, + "start": 61519, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61702, + "start": 61682, + "tag_type": 1 + }, + { + "start": 61702, + "end": 61752 + }, + { + "attributes": {}, + "tag": "span", + "end": 61759, + "start": 61752, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 61763, + "start": 61759, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61768, + "start": 61763, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 61772, + "start": 61768, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/6904657/Vivanco-Universal-Sky-Remote-Control-Sky-Sky+/Product.html", + "class": "chart04", + "title": "Price: \u00a34.99 Free Delivery" + }, + "tag": "a", + "end": 61928, + "start": 61772, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 61948, + "start": 61928, + "tag_type": 1 + }, + { + "start": 61948, + "end": 61995 + }, + { + "attributes": {}, + "tag": "span", + "end": 62002, + "start": 61995, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 62006, + "start": 62002, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62011, + "start": 62006, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62015, + "start": 62011, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/5985149/Synn-LTS4201-B-Glass-Stand-for-TVs-Up-To-42-/Product.html", + "class": "chart05", + "title": "Price: \u00a399.99 Free Delivery" + }, + "tag": "a", + "end": 62171, + "start": 62015, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62191, + "start": 62171, + "tag_type": 1 + }, + { + "start": 62191, + "end": 62257 + }, + { + "attributes": {}, + "tag": "span", + "end": 62264, + "start": 62257, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 62268, + "start": 62264, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62273, + "start": 62268, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62277, + "start": 62273, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9404087/LG-22-M227WD-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart06", + "title": "Price: \u00a3199.99 Free Delivery" + }, + "tag": "a", + "end": 62438, + "start": 62277, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62458, + "start": 62438, + "tag_type": 1 + }, + { + "start": 62458, + "end": 62512 + }, + { + "attributes": {}, + "tag": "span", + "end": 62519, + "start": 62512, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 62523, + "start": 62519, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62528, + "start": 62523, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62532, + "start": 62528, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/1112311/Linx-1-2m-Luxury-24k-Gold-Plated-HDMI-Cable/Product.html", + "class": "chart07", + "title": "Price: \u00a38.99 Free Delivery" + }, + "tag": "a", + "end": 62686, + "start": 62532, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62706, + "start": 62686, + "tag_type": 1 + }, + { + "start": 62706, + "end": 62750 + }, + { + "attributes": {}, + "tag": "span", + "end": 62757, + "start": 62750, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 62761, + "start": 62757, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62766, + "start": 62761, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 62770, + "start": 62766, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/5447796/Samsung-20-T200-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "chart08", + "title": "Price: \u00a3169.99 Free Delivery" + }, + "tag": "a", + "end": 62934, + "start": 62770, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 62954, + "start": 62934, + "tag_type": 1 + }, + { + "start": 62954, + "end": 63031 + }, + { + "attributes": {}, + "tag": "span", + "end": 63038, + "start": 63031, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 63042, + "start": 63038, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 63047, + "start": 63042, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 63051, + "start": 63047, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/3271416/Linx-TVM021-TV-Stand-Up-To-37-/Product.html", + "class": "chart09", + "title": "Price: \u00a329.99 Free Delivery" + }, + "tag": "a", + "end": 63193, + "start": 63051, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63213, + "start": 63193, + "tag_type": 1 + }, + { + "start": 63213, + "end": 63248 + }, + { + "attributes": {}, + "tag": "span", + "end": 63255, + "start": 63248, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 63259, + "start": 63255, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 63264, + "start": 63259, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 63268, + "start": 63264, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9481062/Toshiba-Regza-AV-Series-32-32AV615DB-HD-Ready-Freeview-LCD-TV/Product.html", + "class": "chart10", + "title": "Price: \u00a3339.99 Free Delivery" + }, + "tag": "a", + "end": 63442, + "start": 63268, + "tag_type": 1 + }, + { + "attributes": { + "class": "title" + }, + "tag": "span", + "end": 63462, + "start": 63442, + "tag_type": 1 + }, + { + "start": 63462, + "end": 63581 + }, + { + "attributes": {}, + "tag": "span", + "end": 63588, + "start": 63581, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 63592, + "start": 63588, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 63597, + "start": 63592, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ol", + "end": 63602, + "start": 63597, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 63618, + "start": 63602, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/TopSellers.html?searchtype=genre" + }, + "tag": "a", + "end": 63699, + "start": 63618, + "tag_type": 1 + }, + { + "start": 63699, + "end": 63716 + }, + { + "attributes": {}, + "tag": "span", + "end": 63722, + "start": 63716, + "tag_type": 1 + }, + { + "start": 63722, + "end": 63728 + }, + { + "attributes": {}, + "tag": "span", + "end": 63735, + "start": 63728, + "tag_type": 2 + }, + { + "start": 63735, + "end": 63736 + }, + { + "attributes": {}, + "tag": "a", + "end": 63740, + "start": 63736, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 63744, + "start": 63740, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 63750, + "start": 63744, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 63756, + "start": 63750, + "tag_type": 2 + }, + { + "attributes": { + "class": "comingsoon wrap" + }, + "tag": "div", + "end": 63786, + "start": 63756, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 63807, + "start": 63786, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 63812, + "start": 63807, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 63817, + "start": 63812, + "tag_type": 1 + }, + { + "start": 63817, + "end": 63821 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 63902, + "start": 63821, + "tag_type": 1 + }, + { + "start": 63902, + "end": 63910 + }, + { + "attributes": {}, + "tag": "h2", + "end": 63914, + "start": 63910, + "tag_type": 1 + }, + { + "start": 63914, + "end": 63925 + }, + { + "attributes": {}, + "tag": "h2", + "end": 63930, + "start": 63925, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 63934, + "start": 63930, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 63940, + "start": 63934, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 63946, + "start": 63940, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 63952, + "start": 63946, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 63969, + "start": 63952, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "ul", + "end": 63973, + "start": 63969, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "li", + "end": 63977, + "start": 63973, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10502045/Accessory-Agents-10-37-Low-Profile-Wall-Bracket/Product.html", + "class": "arrow", + "title": "Price: \u00a314.99 Free Delivery" + }, + "tag": "a", + "end": 64135, + "start": 63977, + "tag_type": 1 + }, + { + "start": 64135, + "end": 64196 + }, + { + "attributes": {}, + "tag": "a", + "end": 64200, + "start": 64196, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64205, + "start": 64200, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64209, + "start": 64205, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839704/Sony-Bravia-Z-Series-40-40Z5500-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a31399.99 Free Delivery" + }, + "tag": "a", + "end": 64388, + "start": 64209, + "tag_type": 1 + }, + { + "start": 64388, + "end": 64494 + }, + { + "attributes": {}, + "tag": "a", + "end": 64498, + "start": 64494, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64503, + "start": 64498, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64507, + "start": 64503, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839534/Sony-Bravia-S-Series-26-26S5500-HD-Ready-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3399.99 Free Delivery" + }, + "tag": "a", + "end": 64685, + "start": 64507, + "tag_type": 1 + }, + { + "start": 64685, + "end": 64758 + }, + { + "attributes": {}, + "tag": "a", + "end": 64762, + "start": 64758, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64767, + "start": 64762, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64771, + "start": 64767, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10772232/Samsung-22-LE22B350-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3199.99 Free Delivery" + }, + "tag": "a", + "end": 64920, + "start": 64771, + "tag_type": 1 + }, + { + "start": 64920, + "end": 64963 + }, + { + "attributes": {}, + "tag": "a", + "end": 64967, + "start": 64963, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64972, + "start": 64967, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 64976, + "start": 64972, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/8839719/Sony-Bravia-Z-Series-52-52Z5500-HD-1080p-Freeview-Widescreen-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a32199.99 Free Delivery" + }, + "tag": "a", + "end": 65155, + "start": 64976, + "tag_type": 1 + }, + { + "start": 65155, + "end": 65261 + }, + { + "attributes": {}, + "tag": "a", + "end": 65265, + "start": 65261, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65270, + "start": 65265, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65274, + "start": 65270, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9223463/Panasonic-Viera-NeoPDP-G15-Series-46-TX-P46G15-HD-1080p-Freesat-Freeview-Plasma-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a31299.99 Free Delivery" + }, + "tag": "a", + "end": 65468, + "start": 65274, + "tag_type": 1 + }, + { + "start": 65468, + "end": 65562 + }, + { + "attributes": {}, + "tag": "a", + "end": 65566, + "start": 65562, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65571, + "start": 65566, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65575, + "start": 65571, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10333427/Samsung-Series-7-7020-32-UE32B7020-HD-1080p-Freeview-Ultra-Slim-LED-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3999.99 Free Delivery" + }, + "tag": "a", + "end": 65757, + "start": 65575, + "tag_type": 1 + }, + { + "start": 65757, + "end": 65856 + }, + { + "attributes": {}, + "tag": "a", + "end": 65860, + "start": 65856, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65865, + "start": 65860, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 65869, + "start": 65865, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9924416/Toshiba-DV-Series-19-DV616DB-HD-Ready-Freeview-Integrated-DVD-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3269.99 Free Delivery" + }, + "tag": "a", + "end": 66048, + "start": 65869, + "tag_type": 1 + }, + { + "start": 66048, + "end": 66136 + }, + { + "attributes": {}, + "tag": "a", + "end": 66140, + "start": 66136, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 66145, + "start": 66140, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 66149, + "start": 66145, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/9769759/Toshiba-Regza-ZV-Series-42-42ZV635-HD-1080p-Freeview-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3899.99 Free Delivery" + }, + "tag": "a", + "end": 66319, + "start": 66149, + "tag_type": 1 + }, + { + "start": 66319, + "end": 66388 + }, + { + "attributes": {}, + "tag": "a", + "end": 66392, + "start": 66388, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 66397, + "start": 66392, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 66401, + "start": 66397, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/4-/10772167/Samsung-Series-5-530-32-LE32B530-HD-1080p-Freeview-LCD-TV/Product.html", + "class": "arrow", + "title": "Price: \u00a3449.99 Free Delivery" + }, + "tag": "a", + "end": 66570, + "start": 66401, + "tag_type": 1 + }, + { + "start": 66570, + "end": 66637 + }, + { + "attributes": {}, + "tag": "a", + "end": 66641, + "start": 66637, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "li", + "end": 66646, + "start": 66641, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "ul", + "end": 66651, + "start": 66646, + "tag_type": 2 + }, + { + "attributes": { + "class": "more" + }, + "tag": "p", + "end": 66667, + "start": 66651, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/-/318/404/3-/ComingSoon.html?searchtype=genre" + }, + "tag": "a", + "end": 66748, + "start": 66667, + "tag_type": 1 + }, + { + "start": 66748, + "end": 66760 + }, + { + "attributes": { + "class": "orangepanel" + }, + "tag": "span", + "end": 66786, + "start": 66760, + "tag_type": 1 + }, + { + "start": 66786, + "end": 66787 + }, + { + "attributes": {}, + "tag": "span", + "end": 66794, + "start": 66787, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "a", + "end": 66798, + "start": 66794, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 66802, + "start": 66798, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 66808, + "start": 66802, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 66814, + "start": 66808, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 66843, + "start": 66814, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 66848, + "start": 66843, + "tag_type": 1 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/Campaign.html?campaign=7147&cid=1528342&dpr=0", + "manual_cm_sp": "BLU_blu-ray_month_from799_doubles_GBP.jpg_GBP-_-RightSideBanner1-_-ELEC", + "manual_cm_re": "Right-_-SideBanner1-_-BLU_blu-ray_month_from799_doubles_GBP.jpg_GBP" + }, + "tag": "a", + "end": 67094, + "start": 66848, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/249662_GBP.jpg", + "alt": "Blu-ray from \u00a37.99", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 67228, + "start": 67094, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 67232, + "start": 67228, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 67238, + "start": 67232, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 67244, + "start": 67238, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 67273, + "start": 67244, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 67278, + "start": 67273, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/301482/2-/Promo.html?dpr=301482", + "manual_cm_sp": "ELEC_SonyLCDTVs_GBP.gif_GBP-_-RightSideBanner2-_-ELEC", + "manual_cm_re": "Right-_-SideBanner2-_-ELEC_SonyLCDTVs_GBP.gif_GBP" + }, + "tag": "a", + "end": 67482, + "start": 67278, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/225463_GBP.gif", + "alt": "Sony LCD TV's - Double", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 67620, + "start": 67482, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 67624, + "start": 67620, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 67630, + "start": 67624, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 67636, + "start": 67630, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 67665, + "start": 67636, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 67670, + "start": 67665, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/255083/2-/Promo.html?dpr=255083", + "manual_cm_sp": "ELEC_Blu-ray-Players_GBP.jpg_GBP-_-RightSideBanner3-_-ELEC", + "manual_cm_re": "Right-_-SideBanner3-_-ELEC_Blu-ray-Players_GBP.jpg_GBP" + }, + "tag": "a", + "end": 67884, + "start": 67670, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/181200_GBP.jpg", + "alt": "Blu-ray players from \u00a3199.99", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 68028, + "start": 67884, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 68032, + "start": 68028, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68038, + "start": 68032, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68044, + "start": 68038, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 68073, + "start": 68044, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 68078, + "start": 68073, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Electronics/Electronics/3-/351362/2-/Promo.html?dpr=351362", + "manual_cm_sp": "ELEC_Flip_GBP.gif_GBP-_-RightSideBanner4-_-ELEC", + "manual_cm_re": "Right-_-SideBanner4-_-ELEC_Flip_GBP.gif_GBP" + }, + "tag": "a", + "end": 68270, + "start": 68078, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/250490_GBP.gif", + "alt": "Flip Camcorders - From Only \u00a379.99", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 68420, + "start": 68270, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 68424, + "start": 68420, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68430, + "start": 68424, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68436, + "start": 68430, + "tag_type": 2 + }, + { + "start": 68436, + "end": 68456 + }, + { + "attributes": { + "class": "secureshopping wrap" + }, + "tag": "div", + "end": 68490, + "start": 68456, + "tag_type": 1 + }, + { + "attributes": { + "class": "boxhead" + }, + "tag": "div", + "end": 68511, + "start": 68490, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 68516, + "start": 68511, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 68521, + "start": 68516, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "h2", + "end": 68525, + "start": 68521, + "tag_type": 1 + }, + { + "start": 68525, + "end": 68540 + }, + { + "attributes": {}, + "tag": "h2", + "end": 68545, + "start": 68540, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68551, + "start": 68545, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68557, + "start": 68551, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68563, + "start": 68557, + "tag_type": 2 + }, + { + "attributes": { + "class": "box" + }, + "tag": "div", + "end": 68580, + "start": 68563, + "tag_type": 1 + }, + { + "attributes": { + "href": "javascript:siteseal()", + "border": "0" + }, + "tag": "a", + "end": 68623, + "start": 68580, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/brand/verisign.gif", + "border": "0", + "width": "94", + "height": "52" + }, + "tag": "img", + "end": 68733, + "start": 68623, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "a", + "end": 68737, + "start": 68733, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68743, + "start": 68737, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 68749, + "start": 68743, + "tag_type": 2 + }, + { + "start": 68749, + "end": 68769 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 68798, + "start": 68769, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 68803, + "start": 68798, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/GiftVouchers.html?dpr=0", + "manual_cm_sp": "giftvoucher_sb.jpg-_-SideBanner1-_-ELEC", + "manual_cm_re": "-_-SideBanner1-_-giftvoucher_sb.jpg" + }, + "tag": "a", + "end": 68957, + "start": 68803, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/229863.jpg", + "alt": "Buy Gift Vouchers", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 69086, + "start": 68957, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 69090, + "start": 69086, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 69096, + "start": 69090, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 69102, + "start": 69096, + "tag_type": 2 + }, + { + "attributes": { + "class": "sidebanner wrap" + }, + "tag": "div", + "end": 69131, + "start": 69102, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 69136, + "start": 69131, + "tag_type": 1 + }, + { + "attributes": { + "href": "/Campaign.html?campaign=6748&cid=5106868&dpr=0", + "manual_cm_sp": "ccard_sb.jpg-_-SideBanner2-_-ELEC", + "manual_cm_re": "-_-SideBanner2-_-ccard_sb.jpg" + }, + "tag": "a", + "end": 69291, + "start": 69136, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/PROMOTIONAL_IMAGES/SIDE_BANNERS/238668.jpg", + "alt": "Play.com Credit Card", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 69423, + "start": 69291, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 69427, + "start": 69423, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 69433, + "start": 69427, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 69439, + "start": 69433, + "tag_type": 2 + }, + { + "start": 69439, + "end": 69463 + }, + { + "attributes": {}, + "tag": "div", + "end": 69469, + "start": 69463, + "tag_type": 2 + }, + { + "start": 69469, + "end": 69489 + }, + { + "attributes": {}, + "tag": "div", + "end": 69495, + "start": 69489, + "tag_type": 2 + }, + { + "start": 69495, + "end": 69515 + }, + { + "attributes": { + "class": "clear" + }, + "tag": "div", + "end": 69534, + "start": 69515, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "div", + "end": 69540, + "start": 69534, + "tag_type": 2 + }, + { + "start": 69540, + "end": 69560 + }, + { + "attributes": {}, + "tag": "div", + "end": 69566, + "start": 69560, + "tag_type": 2 + }, + { + "start": 69566, + "end": 69574 + }, + { + "attributes": {}, + "tag": "div", + "end": 69580, + "start": 69574, + "tag_type": 2 + }, + { + "start": 69580, + "end": 69584 + }, + { + "attributes": {}, + "tag": "div", + "end": 69590, + "start": 69584, + "tag_type": 2 + }, + { + "start": 69590, + "end": 69598 + }, + { + "attributes": { + "type": "text/javascript", + "language": "JavaScript" + }, + "tag": "script", + "end": 69651, + "start": 69598, + "tag_type": 1 + }, + { + "start": 69651, + "end": 69675 + }, + { + "attributes": {}, + "tag": "script", + "end": 69684, + "start": 69675, + "tag_type": 2 + }, + { + "start": 69684, + "end": 69692 + }, + { + "attributes": { + "class": "footer" + }, + "tag": "div", + "end": 69712, + "start": 69692, + "tag_type": 1 + }, + { + "start": 69712, + "end": 69720 + }, + { + "attributes": { + "class": "links" + }, + "tag": "p", + "end": 69737, + "start": 69720, + "tag_type": 1 + }, + { + "attributes": { + "href": "/" + }, + "tag": "a", + "end": 69749, + "start": 69737, + "tag_type": 1 + }, + { + "start": 69749, + "end": 69753 + }, + { + "attributes": {}, + "tag": "a", + "end": 69757, + "start": 69753, + "tag_type": 2 + }, + { + "start": 69757, + "end": 69770 + }, + { + "attributes": { + "href": "/DVD/DVD/6-/RegionHome.html" + }, + "tag": "a", + "end": 69808, + "start": 69770, + "tag_type": 1 + }, + { + "start": 69808, + "end": 69811 + }, + { + "attributes": {}, + "tag": "a", + "end": 69815, + "start": 69811, + "tag_type": 2 + }, + { + "start": 69815, + "end": 69828 + }, + { + "attributes": { + "href": "/DVD/Blu-ray/6-/RegionHome.html" + }, + "tag": "a", + "end": 69870, + "start": 69828, + "tag_type": 1 + }, + { + "start": 69870, + "end": 69877 + }, + { + "attributes": {}, + "tag": "a", + "end": 69881, + "start": 69877, + "tag_type": 2 + }, + { + "start": 69881, + "end": 69894 + }, + { + "attributes": { + "href": "/Music/CD/6-/RegionHome.html" + }, + "tag": "a", + "end": 69933, + "start": 69894, + "tag_type": 1 + }, + { + "start": 69933, + "end": 69938 + }, + { + "attributes": {}, + "tag": "a", + "end": 69942, + "start": 69938, + "tag_type": 2 + }, + { + "start": 69942, + "end": 69955 + }, + { + "attributes": { + "href": "/Tickets/TicketsEvent/6-/RegionHome.html" + }, + "tag": "a", + "end": 70006, + "start": 69955, + "tag_type": 1 + }, + { + "start": 70006, + "end": 70013 + }, + { + "attributes": {}, + "tag": "a", + "end": 70017, + "start": 70013, + "tag_type": 2 + }, + { + "start": 70017, + "end": 70030 + }, + { + "attributes": { + "href": "/Games/Games/6-/RegionHome.html" + }, + "tag": "a", + "end": 70072, + "start": 70030, + "tag_type": 1 + }, + { + "start": 70072, + "end": 70077 + }, + { + "attributes": {}, + "tag": "a", + "end": 70081, + "start": 70077, + "tag_type": 2 + }, + { + "start": 70081, + "end": 70094 + }, + { + "attributes": { + "href": "/Books/Books/6-/RegionHome.html" + }, + "tag": "a", + "end": 70136, + "start": 70094, + "tag_type": 1 + }, + { + "start": 70136, + "end": 70141 + }, + { + "attributes": {}, + "tag": "a", + "end": 70145, + "start": 70141, + "tag_type": 2 + }, + { + "start": 70145, + "end": 70158 + }, + { + "attributes": { + "href": "/Clothing/Clothing/6-/RegionHome.html" + }, + "tag": "a", + "end": 70206, + "start": 70158, + "tag_type": 1 + }, + { + "start": 70206, + "end": 70214 + }, + { + "attributes": {}, + "tag": "a", + "end": 70218, + "start": 70214, + "tag_type": 2 + }, + { + "start": 70218, + "end": 70231 + }, + { + "attributes": {}, + "tag": "strong", + "end": 70239, + "start": 70231, + "tag_type": 1 + }, + { + "start": 70239, + "end": 70250 + }, + { + "attributes": {}, + "tag": "strong", + "end": 70259, + "start": 70250, + "tag_type": 2 + }, + { + "start": 70259, + "end": 70272 + }, + { + "attributes": { + "href": "/PC/PCs/6-/RegionHome.html" + }, + "tag": "a", + "end": 70309, + "start": 70272, + "tag_type": 1 + }, + { + "start": 70309, + "end": 70318 + }, + { + "attributes": {}, + "tag": "a", + "end": 70322, + "start": 70318, + "tag_type": 2 + }, + { + "start": 70322, + "end": 70335 + }, + { + "attributes": { + "href": "/Gadgets/Gadgets/6-/RegionHome.html" + }, + "tag": "a", + "end": 70381, + "start": 70335, + "tag_type": 1 + }, + { + "start": 70381, + "end": 70388 + }, + { + "attributes": {}, + "tag": "a", + "end": 70392, + "start": 70388, + "tag_type": 2 + }, + { + "start": 70392, + "end": 70405 + }, + { + "attributes": { + "href": "/Mobiles/Mobile/6-/MobileHome.html" + }, + "tag": "a", + "end": 70450, + "start": 70405, + "tag_type": 1 + }, + { + "start": 70450, + "end": 70456 + }, + { + "attributes": {}, + "tag": "a", + "end": 70460, + "start": 70456, + "tag_type": 2 + }, + { + "start": 70460, + "end": 70473 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/LandingPage.html?page=playtrade" + }, + "tag": "a", + "end": 70529, + "start": 70473, + "tag_type": 1 + }, + { + "start": 70529, + "end": 70544 + }, + { + "attributes": {}, + "tag": "a", + "end": 70548, + "start": 70544, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 70552, + "start": 70548, + "tag_type": 2 + }, + { + "start": 70552, + "end": 70560 + }, + { + "attributes": { + "class": "cards" + }, + "tag": "div", + "end": 70579, + "start": 70560, + "tag_type": 1 + }, + { + "start": 70579, + "end": 70600 + }, + { + "attributes": { + "cellpadding": "0" + }, + "tag": "table", + "end": 70623, + "start": 70600, + "tag_type": 1 + }, + { + "start": 70623, + "end": 70635 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 70642, + "start": 70635, + "tag_type": 1 + }, + { + "start": 70642, + "end": 70658 + }, + { + "attributes": {}, + "tag": "tr", + "end": 70662, + "start": 70658, + "tag_type": 1 + }, + { + "start": 70662, + "end": 70682 + }, + { + "attributes": {}, + "tag": "td", + "end": 70686, + "start": 70682, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/cards.gif", + "alt": "We accept these cards: Delta, MasterCard, Solo, Switch, Maestro, Visa, Electron", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 70874, + "start": 70686, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "td", + "end": 70879, + "start": 70874, + "tag_type": 2 + }, + { + "start": 70879, + "end": 70899 + }, + { + "attributes": {}, + "tag": "td", + "end": 70903, + "start": 70899, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Campaign.html?campaign=6748&cid=5106868", + "title": "Play.com Credit Card" + }, + "tag": "a", + "end": 70996, + "start": 70903, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/play-credit-cards.gif", + "alt": "Play.com Credit Card", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 71137, + "start": 70996, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 71141, + "start": 71137, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 71146, + "start": 71141, + "tag_type": 2 + }, + { + "start": 71146, + "end": 71162 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71167, + "start": 71162, + "tag_type": 2 + }, + { + "start": 71167, + "end": 71179 + }, + { + "attributes": {}, + "tag": "tbody", + "end": 71187, + "start": 71179, + "tag_type": 2 + }, + { + "start": 71187, + "end": 71195 + }, + { + "attributes": {}, + "tag": "table", + "end": 71203, + "start": 71195, + "tag_type": 2 + }, + { + "start": 71203, + "end": 71207 + }, + { + "attributes": {}, + "tag": "div", + "end": 71213, + "start": 71207, + "tag_type": 2 + }, + { + "attributes": { + "class": "contact" + }, + "tag": "div", + "end": 71234, + "start": 71213, + "tag_type": 1 + }, + { + "attributes": { + "cellspacing": "0" + }, + "tag": "table", + "end": 71257, + "start": 71234, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71261, + "start": 71257, + "tag_type": 1 + }, + { + "attributes": {}, + "tag": "td", + "end": 71265, + "start": 71261, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=helpdesk", + "title": "Play.com Helpdesk" + }, + "tag": "a", + "end": 71339, + "start": 71265, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/helpdesk.gif", + "alt": "Play.com Helpdesk", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 71468, + "start": 71339, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 71472, + "start": 71468, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 71477, + "start": 71472, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 71481, + "start": 71477, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/pipe.gif", + "style": "height:32px;width:23px;border-width:0px;" + }, + "tag": "img", + "end": 71605, + "start": 71481, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "td", + "end": 71610, + "start": 71605, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "td", + "end": 71614, + "start": 71610, + "tag_type": 1 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/phone.gif", + "alt": "Customer Services: 0845 800 1020", + "style": "border-width:0px;" + }, + "tag": "img", + "end": 71755, + "start": 71614, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "td", + "end": 71760, + "start": 71755, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "tr", + "end": 71765, + "start": 71760, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "table", + "end": 71773, + "start": 71765, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "div", + "end": 71779, + "start": 71773, + "tag_type": 2 + }, + { + "attributes": { + "class": "legal" + }, + "tag": "p", + "end": 71796, + "start": 71779, + "tag_type": 1 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=priv" + }, + "tag": "a", + "end": 71840, + "start": 71796, + "tag_type": 1 + }, + { + "start": 71840, + "end": 71854 + }, + { + "attributes": {}, + "tag": "a", + "end": 71858, + "start": 71854, + "tag_type": 2 + }, + { + "start": 71858, + "end": 71861 + }, + { + "attributes": { + "href": "/HOME/HOME/6-/Help.html?page=terms" + }, + "tag": "a", + "end": 71906, + "start": 71861, + "tag_type": 1 + }, + { + "start": 71906, + "end": 71928 + }, + { + "attributes": {}, + "tag": "a", + "end": 71932, + "start": 71928, + "tag_type": 2 + }, + { + "start": 71932, + "end": 71935 + }, + { + "attributes": { + "style": "color: #000;" + }, + "tag": "span", + "end": 71962, + "start": 71935, + "tag_type": 1 + }, + { + "start": 71962, + "end": 71997 + }, + { + "attributes": {}, + "tag": "span", + "end": 72004, + "start": 71997, + "tag_type": 2 + }, + { + "start": 72004, + "end": 72007 + }, + { + "attributes": {}, + "tag": "span", + "end": 72013, + "start": 72007, + "tag_type": 1 + }, + { + "start": 72013, + "end": 72033 + }, + { + "attributes": {}, + "tag": "span", + "end": 72040, + "start": 72033, + "tag_type": 2 + }, + { + "start": 72040, + "end": 72041 + }, + { + "attributes": { + "href": "http://www.PlayUSA.com" + }, + "tag": "a", + "end": 72074, + "start": 72041, + "tag_type": 1 + }, + { + "start": 72074, + "end": 72075 + }, + { + "attributes": { + "src": "http://images.play.com/SiteCSS/Play/Live1/img/footer/playincorporated.gif", + "alt": "Play Incorporated", + "style": "height:16px;width:55px;border-width:0px;" + }, + "tag": "img", + "end": 72235, + "start": 72075, + "tag_type": 3 + }, + { + "attributes": {}, + "tag": "a", + "end": 72239, + "start": 72235, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "p", + "end": 72243, + "start": 72239, + "tag_type": 2 + }, + { + "start": 72243, + "end": 72251 + }, + { + "attributes": {}, + "tag": "div", + "end": 72257, + "start": 72251, + "tag_type": 2 + }, + { + "start": 72257, + "end": 72301 + }, + { + "attributes": {}, + "tag": "div", + "end": 72307, + "start": 72301, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "body", + "end": 72314, + "start": 72307, + "tag_type": 2 + }, + { + "attributes": {}, + "tag": "html", + "end": 72321, + "start": 72314, + "tag_type": 2 + }, + { + "start": 72321, + "end": 72325 + } +] \ No newline at end of file diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.html b/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.html new file mode 100644 index 000000000..6851f009a --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.html @@ -0,0 +1,632 @@ + + + +TEMPUR Deluxe-HD™ Mattress | Tempur + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + +
+ Order online now or free phone 08000 111 083
+ +
+
+ + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + +
+ + +
+ + + +
+ + + + + +
+

TEMPUR Deluxe-HD™ Mattress

+ + + + +
+
+
+
+ + + + + + + + +
+ +

+

Product Overview

+

The TEMPUR Deluxe-HD™ Mattress combines the unique pressure relieving qualities of TEMPUR, with extra TEMPUR-HD™ soft-touch quilted into the cover, for a luxurious feel that is unparalleled in the bedroom. It not only looks luxurious, but also offers enhanced comfort.

+

This 22cm mattress is constructed differently to the TEMPUR Combi-HD™ Mattress. The TEMPUR Deluxe-HD™ Mattress has a quilted velour cover with a 2cm high density "soft-touch" TEMPUR Material embedded within it. Underneath the quilted cover lies a 9cm layer of TEMPUR Material, on top of 11cm of conventional polyurethane foam.

+

The Deluxe-HD™ Mattress features the new TEMPUR-Tex™ Cover with in-built humidity control. The TEMPUR-Tex™ material allows any moisture to evaporate faster from the surface of the mattress, thus providing the consumer with a drier sleeping experience.

+

Product Specification

+ + + + + +
+
    +
  • A. Quilted Cover with 2cm of HD "soft-
    touch" TEMPUR embedded within it.
    +
  • B. 9cm TEMPUR visco-elastic temperature +
    sensitive material
    +
  • C. 11cm high resilient polyurethane foam +
  • 15 year limited guarantee +
  • Works in perfect partnership with the TEMPUR bed range
+

+

When you purchase a TEMPUR Mattress online you will automatically receive the 60-night trial. Please note only one mattress can be trialled per household.

+

Please refer to our most Frequently Asked Questions to ensure that you know all the facts about our 60-night trial offer.

+

Looking to purchase TEMPUR elsewhere?

+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + +
From £1,049.00
+
+ + + + + + + + + + +
You may be eligible for VAT relief
+ + + + + + + + + + + + +

Dimensions

+ + + + + + + + + + + + + + + + + + + + +
Size (Inches)Size (Centimetres*)Size
3' x 6'3"90 x 190 x 22 cmSingle (Standard)
3' x 6'6"90 x 200 x 22 cmSingle (Long)
4'6" x 6'3"135 x 190 x 22 cmDouble
5' x 6'6"150 x 200 x 22 cmKing
5'3 x 6'6"160 x 200 x 22 cmEuro King
6' x 6'6"180 x 200 x 22 cmSuper King
+

*Please Note: Mattress sizes are approximate. Please allow for a 2cm tolerance.

Can't find the size you are looking for?

Special Size Mattresses are available on request, Please contact our Direct Sales Team on 08000 111 083 for further details.

+
+ +
+ +
+
+ +
+ + + + + + + + + + + + + +
+
+ *Term & Conditions + *FAQ 60Night + © 2008 TEMPUR UK Ltd.  All Rights Reserved + + . PRIVACY POLICY +
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.json b/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.json new file mode 100644 index 000000000..b94b12faf --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/samples/samples_pageparsing_0.json @@ -0,0 +1,78 @@ +[ + { + "surrounds_attribute": "name", + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [], + "end_index": 133, + "start_index": 132, + "metadata": {} + }, + { + "surrounds_attribute": null, + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [ + [ + "src", + "image_urls" + ] + ], + "end_index": 142, + "start_index": 141, + "metadata": {} + }, + { + "surrounds_attribute": null, + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [ + [ + "src", + "image_urls" + ] + ], + "end_index": 149, + "start_index": 148, + "metadata": {} + }, + { + "surrounds_attribute": "description", + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [], + "end_index": 207, + "start_index": 161, + "metadata": {} + }, + { + "surrounds_attribute": "price", + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [], + "end_index": 258, + "start_index": 257, + "metadata": {} + }, + { + "surrounds_attribute": "features", + "annotation_text": null, + "match_common_prefix": false, + "surrounds_variant": null, + "variant_id": null, + "tag_attributes": [], + "end_index": 421, + "start_index": 324, + "metadata": {} + } +] diff --git a/scrapy/tests/test_contrib_ibl/samples_htmlpage.json.gz b/scrapy/tests/test_contrib_ibl/samples_htmlpage.json.gz deleted file mode 100644 index fe4d1894c28718146c560b5dced991cbc775ecdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105488 zcmV)}KzqL*iwFq5oy1E319M?*aBO9BUubk~Y;a*`WiD!SZ*BnOefxLYxUul>-(SJH zx83BdW$_`tVmrNlB%5^e@L79z+q>!Up(Wblh9Xsxvg2;|f4?&T9{@yvlqEU7{nBnC zf|v(pFoVJ1!QXcBbdin2ofq29!88meFFz&K{|;th5opt*m=D5#E~4ARPdg`RQiMq{ zxVWE(pLVn{eS{Z9_@x+5i&?y{ji*7DhsEKdxE^?)c3xJ9l3*4R6!ZHmx|tRn{CQM_ z+PmOBT@<_8X_!YhiT3AUHs9Aul3ER?nYwOk11$@SEX|`Y#r@tm-CKNSNO3%uLj9K~@I%<^TB@5B4MG@IlcNWmL5wYpk{fN8zN(&gwID01`sC+0%z{}o&a1-axd_M8B#qOXnm$`{9bFeu2-T1& z`Xjsr#>r1pFQ$Mg0cP&C36aOHHc#_na2I6FFL*Uhv!IA>>ox@AahT_6256SWbP*MC zD3Os`qa}hYyp8gx7zEdapdWX+@(<}%TJS1~l1cbw_d1Q^^sZI$<1CsNQJQd2r(qC> zS+1qm%Zh3dg%%_e5N{Hqg7Q6CzdQ-X({O;@J4<7ZUXl*R_)-S>>dQRJLcV4Ca&wLr z#Wdxm^dTC5)_x8^cvL$8QJ_vM$v1p z&o1-3VE%S?^X$3y+i-Ym?CGBp?G}Zcjt}9##SEIW8)P^6A^b(2^4&0=?I!zJW$(YD z+08ki$Pbh7PCLr7;Qrb3edP98a%k>r$pOOd#bI(&O!onI^6jAsw6yVIx)%rcAfA0K zx_$;Iv6Msk3-?sw_{SksMMUt=-hbuU7@zmx-+it8fsE$AB;OkU*w=p7e*cvGj74JOd+e5u{Y*BInH`H+G&65jqW*#jWpBY&>dKe_e-EVh`)jgeX-GQe{XR8r8Q zZ@(ptt#JJk{ez%;I|HTdbLF%_@MFKVB{yO5@#@!bTpZuOJ$)8UcGIQyfVSZO`R?^D zQ5v= zaU22*0E>OGqIxhS0oB1(I=RX@U-bNI)Z@4)?Z5=iGA; zN6BaS{YRbrfs(5mA}%Z&>-aw?yIra!7EtL-qFZeo2YJqj2fEI<2q%=*4bsJs00&-# zDGrL@s*))AY4AK;lRsDnp;4HXY>&e@o(Gc&1T#ztsBqkr+(naOii5gi!_zcGS-_*A z>whX~BXyMP%Yz~-3$SPcV;$l`UM&Evx)kMLfD(V98S^h%p2lFu+0E56eOJT(gCUib zh~%ZUT7MwTgTgs)p;bRK-?TSZQ~yu3CQBE|gpW;&5l_A`fBGNu6%>d`r3++ZnGGAebaC|Fu*mX_%ZzA|dFF0qvDr zQbBM9ZBVG-2;XZz=3ie83@4Q;M&>%IFrS((@@X`m!&s(J$9Y-h>#Kv|q*jNujygt9 zO&u8Sqf?yg#bgIkL6j*BMP-KQ+Nu%N+{gpOjS|RrCzeTJX*~!}yaM$Ae5c z-%1MKH+6SunpJ1WA$>L4mk_`}02+ zX|aDB;M!>g$!w)n7A}PO>CIfu2%iktYXv(R8?lJ+3H|Z zy`Dk;M<(JZ=#3?YY;M7j z!C~@7Ogic1B8zj@lq1C#BOKw_v|Gl!fzcjNlwrkH z88;}#xoQVtJ^lbp53m;+H!e_MzUYd7R$|=EgCrm1VTMbDFPArURopGdNr;gI2?cJN zf`V(9%f|OFv?av*b!u_>Z;c5^wyTmZ!GiGL2gw48G5ZH0Hql6nd<8^pvQdhHMb^GA zu9V1TB+ruDp3M7*w@oed53{NAMXUCzK~DNgqAXC?Cgu03IBK>#(k-trW&0+oHa>o% zk)Ih9PQ#!e`ye$QK@Alp~zYa zF~}{#bOwkU%I|{vTo6qbj?)>0mCy--TbyWsY0tDG%nMNa)x8#IFk`=lSv{Gt!$SnR zgUJbx1t#B|9%#R~UH~U|Y4#cMlED(YPe^;(7^J`>xe7JFGeJcK8lAGxy}3XU0^kHW z!Z{LPxWhIMC;=WxFu@re0#}Zs%h>n!xM|hq^{;U8k_g{=tf@MvbKEjlm-xgpto;JL zSGoAM(DlG_bY6U4cUU|}140(HZ4ZYZhDTc*{dhOQ?FFp@l#)6dp{$SLNyRwTW)8VR zH#%UF?(Cv>n*~vV@s0N5_r2W+=ZMP0P?-F45oICC1*I4?X}If_nCIS8vYH>lYweFz z$~diiEY=kBGiIw{T|m=HL*m_e&9(lPv2M1r&Zo?}gvL~@r`KfD+KX}uUDL*0*n{dY z4aSV%?!)~m%B-W^xY)=4NN{+3bn-o&JvVw7PNLf;N2y3hueuXdw$;*Br?2^3wJ^Ko zR~5L#S?B)PXxz2Ohiq|Zwg{6vyE;iMB-YpDPQ63#YjdYw?Ca$2F}GRUt1gh#xt0g+ zy{7Q1Y`?Z2cl)(kA{AO;4Wm4LDy(3%jEWvzClq~|{H$t)vGvTVGtm8(Lynx&TJB8C ze!O;V@Qb|K+0}ODc;^CMEFv+wbreW}0}w7muT0WthIeqeEX@ z;^`N7G~f|t0$BmSbpZOUesXFM!yqqs0@VRqq#!#6j8vN=j98OBNxZ}GhzA%O9$in) zWXVkRNUD}leg~TyIBkqP;>sOuOIcao5W~~uEh+h}8%F9@a9tvQ^TtLU2*;riKi7(lm!ssG>4WV4E>4z0@-VLK{Cl)|o_ zY2^yAzalz}i<}vkv*?%#7ArPtPi8s{U>A!n%LaGyT)~b?Vin2ynUR>&DKYl!I?EY7 z=C1IehQh=hK|-{01=wZc>m7_2oI;f)mbb*yeT5Sh#sgZp1T^%HmQ+XXTLvojn7)EH z$CUF{(XXFLW3B3)fPN;T4^xfK)FBOx^BivPjL;#g5LlxyIKNFkKxUMr~~tj(|fM9vx?y zAjJ$GU*XbfDougU#4U#1#)E>Gp=@x4t|?#}Y_vDHL{y(RM{3c8*bH+reMi9*2wEWl zLzDomUcox{Y7#KT4#r8K6CFS8FikNO=CQf0WsN42b#JbUC zEH2+r;&KJXeS?K0t+F-+a4W;$Y; zEUeSVS{TxEmhwmuLe#jMg3*YD_1Y-s*%+xT-|Rp|B+Q9K6ERy%sIjn-%{C;O-7rn@ zELFd0XI3H=&l1KQ&T)IK2?3dIy^(4V07|@sY4sYmD@@BcN}h_65FM4(D_Fa$O&ld# zH6~ZMm;#%HZOvKLIyPK)WfSE)k;2e?OJ!&kYjpvwUc0xuGt};2p(WNG5>9)$`+F5Ov37}G#91`kpa+dBWOb#h=@-3^^ zu&r?{GlH0H-Lrde5CvXK*!CP*f3*x-5&m0Z_+M79V4bc}m!ssUI@q~;vGG_SFjA;@0vD?=a%^95>e^U zD;$FBrV|8m@y`yWS}XQ(u9lFG7mlTvCP-v0QL3X#NFkyALysfo>v&Y7)>+@SjK$Se zb`7lZot0LvV2xJ0W{jn|JxOLPuBC`gY6?w(NRX@+CpkLqrQey?UP*Ba9BK2!?B*2;f%mtDpb-gbcuE?M=`fX zLj4WLaur#2B=neuGZHf$oQQx`zSq*~HEdUG*4#)Yvzn2kh|OvWO@U*vuq(x8Mqi^L zmy)e(F*OpYx!7OFT-b{h?N~ z$1FX=Lu)RHF&*aaIGODz6P`7Rrob{-*wscHr?2spH_5GQJ`5VE0gay6cw_6nsz3q{DkCH=e{rpDN42$9o8lS( z-)eDtnaQjHz(ZGf%3nh$@fNlzh8-La6_uvIHCfp9P9pIZ$9-kJLm~8dEoHBA%^CeM!VC(c{t{ zMXp~1q5dY~iHmhSD(5j%>9%hwQbEWn-#=;f3bu96A8R7@)t)l*@NJca`ob>2vU&yE zx*R1nkJo+8qq+HWT?64UNlj#>dD~`9#4%M#CW(mKb?Geat7H2$66$RtP+2h`A)!Y! z5l0#4Agf#-b=Ww^k;FOdw2ZxkRbnQNC1zQLt?|5-mep(6)sh;$vl`Vkt!vNB7(7xN zalWFB*sAT<68TCLX^&JL+aC3gv>e-3L|RDbF>S;#RA)DAVP|t$y@EBnBCQ}(E-^XI zNM)fF{-$7Lval=7M2y}GvPaq4Ig1j7)F|AqXcV5SNQFzJDp8*&9#!Oeve&wrBI$>o zrwG%K&|?~f^4JEl%6Cil;08Q&rNZlrjb&EhE61&hKvTeuTmEYEb9(h~AFE*QJzm#3 z1XNNh@xGpwxTdK(K-Mnhc69=(k-Tdoq25*kl@$hugdWjKTvN3>8(HPLX<5C7ZH)wl ztao(~-f+&HAH!|B3@)XF zB$TL$wcM0W3@)G_k*Bw0U`gAJY*=G^x2GdjytxCZa7Q9gG)(J#T@mP`YJ_Zn zu^ULFCGH&KY@`#Lpf`V{m@m2Qd+{Y*(I2UNiZ7gtD63bntsBo*HIml5=D9()ylq}$ zO`fjo#l9^b2xsiv)7$NQxf=@}sOn#)ynlJRYKL`AxhY_FSbK)wkzx{P8NMP6>c+;3 z(-fEP1yrr`4#oLH;Seu(f#3Chuab_VF9$GVVO=M@ao(S0R zec{Xcmc$0$$W`?_OSm4OtX{+RG69Ksjl^h)qg>%`3Ycigv-SRaP(9mF3=$GlE7&nd zO4)OO5xz|}+jH#pp2N(0mOlltL#W~H`&fluzb}~)dA6^}T-4N?0>8;zc#hs41=cen z*%ux7nTgT3kCyLJY$ZtQ@ns6>l*NMxLLsttp-80f`ik%Z3GvdW)k|2<=zmVZ^TdfS zN2ncDUz7F3opqc%JW~iTX!Q!VJtr&c-sY;^+w&E<%bI#q;5TQKJ->AwOV+(jdH0s~ zBwuv~QbJ$SP+xTh(rXVzCHnMj#mWT|TBEP{s+$FnGOrJxxmm#T+mF@B`iiw;U-5O- z0pFT>RZv#1VcQpB+WU&NdSCH%Phn*e`m%8Eq}9SmA+!A4vo~*n*!$0h;OvtzbEM{qX+aA(^OcQgubMqOEVBo!Dj3A za1wo*s?FTK@)NDUr0pV%#{SFle1gn(~~isu{AimG=bROfP$vd{?TT&{1e zu;~ISt2EJ$s&6Bd^E;%>H-eqt`PK@l8GmU$#y6r16+7PnTuOnA1j$?M#cP(`?rOw| zbuB+k_&m~V?;(j{f22AySU0yWpw&xQyCePj@ax`X{moWggIe>`6fhT|Lb%bEz zO0l$~YRQ!KNR9c9xN0Ym;-jRpdIj6n@kLsyWNA0HD-M+^7;w5Sq~TDhF0VjB8x*#y z(kn0`2-{`4yVJE2B+?S6BfNx!`>D$6C9K=J79^3MtE&jP!s1R@y@GAO2b7mC^T~_8 zf_9ZUbq$dx=0XzR?YbsJq~)p{dOJ2@k!Xc)e#qC5d{32qM>hFJdrbD-Z@=_ZK}#8% zbYh!xs8s#OlUyXUJumO8?i%ww;e>Qqy@Hk8r}-dn;j5BA5>gTy^;M}(BqX$nNp%{! z-fE=nl(4o!ojs88LI40&I*E|uc&`8&@b(!{xBLNCwF6L&nltT(STdkih3AAZvC&L` zZs>;5b)~96&rl1w6Q3wKL$w!(kb5Mj2((l?fe5F9C=H+OKc>E-C{05t%1(T99+_fn zA+#RXIRZ&fktrbzZ_EK2x+VG&ftc5^W#@`VrpQzfT0%##m}66hK5CtA$cT-^JKlN4 zbs`fbF%p><@Cgx31yF-`?7rKi!HraxtTwDLB_7MF+qy?pLC+OW`|zT1g)ONSKn=b^ ztb(3=oYRwU| z#jSyS-?MemaBQ6;)^*HWl$0&raV^kW;n+GNQ#0SbaAI2gv%n7VO8Fm29Xsp)_Qe65HUwJ5u0F^u(L>cnwtem=cGL3#!9( z>o(h0eI~0R)0Ftkr?TLwYs^`qryj#9d`yYS8jjy}1Jn{dF;6DY>%uqZktxSaf2HFf zn;0`qU3CnZFwBdy1gOE=H%C8g%rtdzB;c5l5R(jJfK25Uke1jo$78{}c6ac^Jk^w> zM#hwQ1_#~|HZDm@+{Gl&6RoZUsKMJ$0dB)Rn}+I2nTD07gaXvyt=}Y7(G%0lyl5of zIDKG`HI;ccJMv+K5yC3?yfO*cNy_Dykjx`<4@1h55fWQjM5^WrpxFD6w0 zHMp}$-CC;ezR8Hm9E7Euq#`Y`WxmCMcO(uuVk6ZR(+#qwWTaah_-YZnIZ|fwyYbC= zWJ=dIYEQy%vsaE(TSf`PqBuEcyVA7URNgGt0~xyo3974(z!PEu>lB~{w^sOS7*<#I zg9;m4Vzb~~lMvxp5<;kj)rpWlR0R;qxvy!9`Suc^25-N|yuEXp?VVHF4IR}N${N~D ziNi*|rsNaE4|I->>Kd|!7*oP7Oqfo)r>+Hs->Mu`-||h97g~}gAw76iZapTSQFx)+ zTx`H_p-P=fn2I|vH(Ro|r|)I`BDU#7yRj$|_LeqHfXmjX3snHoECxb0Wu zHpd<9)=w#Re+cU#`&kXs6P=@A0j`i3ECFip4x4Yg*3BGm+jO!JI?2DC^`c|J66);IL!~h&za2Si0(>a~b;*SphOt76NJU zvMK>;@b-O;Nb0f3m)e$Y_U7AVh*_f&payTBgSV>9`U+|@RX4TC*q6!5RNd7^XbG~S05y15YKZgE zP+b+k*4Wq*Rx@Vn9nP|VAF8Xulo}gbVsqdte6$d>taO4kwx-0=O%A-(05V^!+Mo+qb-XeHGQP zmX^Bt_O$aW6OMYR+iG9xmi7c&brg^g6GUxW1_$2teeLzXj%ss~R(u`RupHG@a1FOj ziNkJThNoWXoQnIUOMA!*X|Hxv$4eXHObK(q6rXzUEcD7N{DkSWe3oRn%4N%%c2nZA z%a-6BR$DRv0M%Ti8y_cFPnlsvTB}%uCw_2|$L8sx^YL_66kh92Vd*g9iA!DrHNz08 zu}fa?)HP@cSt`p@yN_;!LY4}gv1(3?^u!i$&bsp}IQ*R1@>JjXY|t?!T#(-R1@$F) zDf0&e-#>o;e?Tx@WYpRYreQF7c|fj$)S}7Zr=80=j5inIY#s+iczKEM!|d{s)cCaX z@+=PS_r~c=d-mh^&$SoYc`(Zt$&Gd%W>J`Hwr1P9X1Sksw0Ey8_ZXjs+M83{s;ST6 z=j$vCZ=>)Ie!e?7)h>S0o*l=*_%q^q6^COO(2{7JYXeeKI}PLLHq7o1hJ=Ba+QBR= z0noI9Eo@}5t4(ev8tCIb%NQS}y-$@k&?9gLuPqnyum$&%FSZZ*)3 z7x%JWwW<)cyQrA*ZP$ua`|*1%NG95=MV8LPJx!~LN4Zu^L#Q&>@~8;4>oh~zgAm7) zoWR^bOL8qrNWCAw-_w2$wY*5jpS2*4A#nT^AZF<;GMy&c=})J7JtTD+=3`J8=4%^a zP1wREd10D&h!@T7YvXB<?LaT^SjcIY|9iYlzgWKSolmZk4^=j(0 zCS~9xoz20ZlOi8BNQNh%>>__3CX2mab3ux~Lbbf4_3~gye?A6NAHf*1C&bSWVVpuI zoID|x#%cOF3NKQaYxL$yFnMSC-uc%2*Q+l-z54a`=P%xOfB*S!?~eZV?)d2A_1`D& zZa;tT&HnZ3f8O0Y>0#qWZgHE*{oody!pl#|r{v%dgMo%TUu3~&?Kp%vf;Jeys}>MO2mmJVx7Jzd&p5dN%2tpP`6z4~Mo4Y{{Zb$ksj2Gaiz$2}|Kra@gh)UTan(^#B zEY7lYLbn1wd%lllCs_#ml*KqwT?9AJv`;&p?>Qq={{)d-9X<@`$TzSDFwPAucTkOa zgEyxGGU5%Y@ooU4-QeOU0ROZzWI`zJ_otob$Qac$+hVrWil*HL8H{~@&EKSXp&e?^ zo>492FF+!PhuS0^FED)Ai_D&G zj=KyL`D_8f%s7~bK-sRriCICIGKqrWI1U3c_LtlsVlW^&hrr2*M$*JUBm>8i zCWBY+UY!g^`bfLU!u#VJ?FKppuGm+x1M^(^tES|o27eAKQe2DI5T0kuHu<4@MA#0cN5i>yf8Hi&q$md^xff`Xt6D&{!etMcB zUvsF3h@)f%;x*qA*zD>oF7_-M}FNLf@;VwGPyb|9T6!x`{Cp1k0%$G7jG}# zy*gaOD|Iw+Iv=N#kZE5Jh?5|jybtr7Ou%ZuB<%#f3i8jyG0#%e`rFAWbmvsa`6@8~ zTm%Wo_I^b=vouX_b-WU29OZMIB=rLdVhqdP-)l$Xak@wf#yiaJFN3XB(V+pIEZiOLGn`jw+1d7e;owXOlbJ#;Fbn-mT0FZc+l!UfX#irq%qa7~U;zJtgMP_*>8f*HUdO==nHsWhZ?153IGDfu zw9xgyIvCE|a6qj~bndrA5KW6^5z=4?ZgB_>5q_19aQI-iS9@e4%~p>LZ9F6v_wo$1 zImuBJT1z{^MV400HT7UDX)acSVB+bw*aPM;^TIWFxjlE$gfxSsa5d%*__C)nH^9>p zI@XgEGC*bJD(%%HJ0T5pNj&}m|jH8hNt1qJ5lC%k&|aa(|!U%{;5vNiUlMtPNf zsb2B{@bH|x?-S_Wgv_``(XM8zjGeMJN~4R*Vj`L;eL*@gNsJ3^DoA3JXQ(KXoheD7 z*26jUkS36Oc?A8XbX?$%Xw@ZHe2Ko%)-!Fy~m%@ zikOY2^}fTrw6xw;ntrDBj^UTQUT`&@(0WIUNt9kGE1w*}wB+SU5X0;<$d>C-O@$Mp z5&Dw}t8hAkBSAABNeP{uoWDUz=?tPS=tI(q-yNNPM`SU94l2j@{`eiP5WT0%CTC>X zM6L@`t5gPsDAVauka3(6*Fk|!$|q^{i?=7=zq&ZTJbH)nyog}-|CBo84<=Ojb8?l> z_ce?_3`#zmU7LLT881>_{kLMiZR`BDKNH|u%J@YQ0U0zO|{ zk!I(u2+qs5QUu5Eep~`Pju(S0xR=7bIb8yIbE;I$=DJRA2UWQfp3f6GkCXH+!Q_1# z*lGDrZXDUHz4H+!m9n8N%8H0&aCqn=Qv3*F?d#6ZPL_B)JCWBuU$$TRXEX zXD#*5r1k%H{PAx~0Dpt9L=Is&dMktmFQibX=gU3lTt0RjA1zgfGI{-F9iY-q7FTjJ z|M~6PC7_?9=n;BW-v9vXwVROIcN6>zhz^%M@DV9iLPq&jvIO_`{P@EoNM@yw2P;2B zJcLL;@eFCKq>TJ=eQh~mMxx%l$RO5eO<&=}u9;)-DMvn&T1E6-iOQfCOxc8*dphB0 z3G(R+F~4?RAubmT*rkGp&dtd8afg)UUTL&O7ekz~49n@ukj!|hG#j0dGx-cog?u6+ z6C0n?+%y(XEop}Cyxg2~Oe&LH3y#6}TJ=JsZ_2cQ#nZqZa2d|#n2#phBE$2Se@_>g zM#(mQ_NaWuhRe+SMOIpJ*-#Zm)vua!l848U|>!Ma_Hvre zLh(J9uA$k^H&CrgcVePR^56iIN!gl?F~u&gj0vO|Vr?yz74lL(4aZBlxc$JFla7 zro9hmX%@glI|??zQ#Jh_UJTBsQAW6OO>5{|eT780qFn|$aD`?&^0FN;C%dmb5zcUN zdPDjnv0?f5U}$)wq1n4D5njsRa(zx%do#yRNn59Dyz;g;1y$yK~i4<+S%Up1W6DS@vsq$v5LqwQv#Iz#9poulTU zdsl?Ymm0j$%2!*UdzOV{=LgwsDUybl1M+q&gwt7y%jF``W4a4_BaM}h9-ie44c+eR zuWN~HZV2gKtL(?x8{7cCAtyZxb25WCrx)^C$b#XF9LpV=rOGOGot;~l9?sJ^+!pax z`$M{A&S`F)Pda$m#qlGL8u_tN0)L>b4INzTW1yK2@> zHWEtKG(fxV(CQm{;9^V^(+jFM!A804QT_YsHcSd&$+!I>UcuL!t7IHzg;p=3Y%I1v zvj$cA8MSdr&){$Y{u!5{{?D3K_+a<0-BSzESz1rBP%0Z79_nbm{sCe+0ZKu1lTe1n z<j-E&yPnmgwf&7?{<4?X$7++A&A|Fm# z9hqWisa@4$4=()~-BfV@WPQAhF~p0V3=m#fczW}8f;TrhVDW?vW&i7_o%=F z78?s-p5(~1IqysT9_NAAGQjn`FfNqKT`-+A(Z3a*x129Mw%_gKZd2}7ASCIFw&gZ` z(bOHo)$M8n!dIEfo~Ow@-EXi3nx>Mbxj~xeXG&6MnM3J zc?Y%A^QasHal6H)$l`Vn%hB6uH+w-groR(OqUB_Bd6t?I3|J$5BxIBRf=(EVabyU_ znX1`NqK`bVS#q2GX^Kmq|j_Mr= zNfG2*kdQGlhlcO>?KD|5tERDU(kx3iveG4R1e1Q#aQZGTr|G1MDY7W}ybXSgVgDS& z>xfJoH^&Cqd#Law?B2wuG?bJMyctT?NF1&=l#JtIDj!PPXXoYbxYN^eFt zHM+F#kI{#|+1D7}hY8FSYl&@(B?DOM>%o48m)l~hSANH|>p8Vy*(2L<(1-{Bqovo{ zF`f+k&&@eKC&M&!E0j>SYpAkUozd~CYGF#}GdT+ZRbE@?=ruFyc4tVpv+bYk4Li-ThZrds?J-X9+|jmsy9?a(PX4}u(PUoUDX>*RdAK`aWv_KMO^Z}}oqes8?|hsq z=IN>ttDKrQ}EuRd+0`H-@#yW z19>9{7rKbow~L%*xLaVO?n*x28aYlg-x}$jW$2@Z2Z-adB8w(B8=Z6E_>9{ct-d`2 z=Y5OW#-f=wRrz?X=gr`?@AKs(oGjy1a64S9t~0Qd`lR2YT~*pSw%%^KY~Z_r;-hCeQfNt$Nb>%~S^Xj|BUh}7;Km6G%a4M09# zUq|CDnLY+acK_fg4B}#1?K_AHn67S1cQE+ay$7HTZmwHm1i~Y`cZl?G>ss@);#I6T zT|#dl%*%gqbfLdmjx3V$uW)9u2Zx&){{&hv)R;a@+K7rV`p4N=M;ICo&M?cov3$)k zOO_5SxxHCBk7nd*n)}Yug|vh zBnS8*K?^M_Fa4BHsf4>hAJ=odi%hxG;BJt5NB92VcSV@1-s`+8pN zBv0`QkZp0esk4pS;%}2XhW{^YMcWpSn?6Ogwf;yKq4`d^*2474u5B5Lxr&axRPHig zT;Yc$Bsa^E`poTeRrQu?Eh2ruE*9b9IjN{hN-J)kS#@VfdB~XEAJUt(O>YOGyht~N zY?7}P_kfi9kLsNun`C9B4G{IUfwFB7o8)YzT@NK^;@*c%^0U&Wg2veDtpyv^+A6E# zlox)DycaXg*ISYaexUSI&+oRZwjxc~V?IsvzwA8?Q`<()C;f_(>90+Lj`*`n_km*S%|b^+QDnbk#65p@Zu=||a}dt= z03Q7F?CEN{6FU*zO=S6JPebGW1JErLxW2+jd>Gw#2V1m`tM8cgGc~+#o6dbOhwr^T z=#bL>Vf}O8brx>un>eQ9?1*fOf+8Xd&+GBiHT3w8>ObFEvmGqH`#b*Jr`RvhT2Cvv}rQL3u3+fsAwq|VS(Q>Bl z@_2*6D+S7S-~EwnU^=Ce=+w+~Aous23}`CT&|5Y$Y~O_T;utPOQ_=P>f}>_*0Y-%+ z&AWIvo;@HX3s{b`QedUf48|ASdB!qNc8JEcu%=TyGTJ#M*Zr3cgvBRVpqX?qs6-(3 zM?TY-Kiyj=lOG?q^l!*Sfe2#|gK z&Kra^X&FwyKaN=SE#rTRk|=)3JW<2((%T8GyY zTsOXq=C#=W*YdttgsIwLH5p=xzP{wfXNx^`ugN2-jCQlX(>x|X0bgkz$?!|(j%|4N zCcEP3-NvW4$(y1|#p7$$4il4aw^!z#b>S_8lcib6%#9Y*yp~6s+AC0z;1X#{LMQ1l z4V~ny1Q<=pRluW-En|GkpcxdHZYfaO3H<2JRn|wWuC_=Ki0Hg)xXe73l z(Il{|)zJu<9}Yl%<2n=9w^$Z7pV5ei1|C@7Rs>@iVqkU6*1y-9r7Y@vdAlcV{7(d#4c0&eDn^6m* z8tfDM)hgT3v^Tri%7Pt4BMaP#eCsb8xpEjK$Am$dnUTXNKKUUK>l2$=kQq$o<`fnd zKB!`v&gO2II2kKRXdF@i#J^Q4JW{wjn;jwfS1L&r43rx2ZKRYU=KBQC1aUbPpLvOI zM-CfWON(@P{1fkLK7FRmE1s_tO;-UNydhl)vKnvh{AY|wplGuKTwb#LwD@=L&azeW z<7T9SQ=pErf~Vk$N@R_*qfJ&cq7Ee}x9DY&6ZK0nTyd)s`1UckI&;UzJzCfJF&iJF zkSi&l83E~bhB&)uxqSfM%Jn~=d~+%nJR?cZ^KhOZH3krT7HkYZ#^W^fQ0qY&jui1N zT(4LhnAPAfE6WW@7@U>D*h8ZezPU7;;=Fv(i^7v?JhyJr-P6ir^g$GjNrD4w) z;RuC&RS=~2oDAeKIutWkZ#K00hT2ZECY+1=c9ST6)lXuu+1cfjvui3G})C+ZMM zl8-0BTb316GHiJ%2rtQNV}WXuiJ)9QcOTI%NIpPZDygV6#Vu3xhAdmM>+~&3v^|Go zao~>>3K%_T>xiy0=oGERzKLSnl*Pf>qis7wM9{D4kbYui>M5m%07Lu@gI>{$EORc# z|1J)BA|O}PhEjy^_}FQQ_*|2L)j2OrO?PbF7t`a`>BSn5(TW>+<-$pErxI8!f<7+! z{wrK8D>KswLJtK38D}e#{LIFi!uVimPOOvF_ve4LghPlb9_nBy%Zcj0= zvOJpkc$PwSooOsc+JJFe~CKOM17=lyk@)3YWxXm;-0TMjhb{cvUO#o65_pjd0d zO?C}GV11;!BX$WV@+dJbeg``hB-?nqeeTQ+^ecRH*EwfeTn0x5hm0kR8pz$>*%iAC@9U>8obv^0&cfRrH| z3XaIlJbQ0>baYO4_Av~WVX)J`8SDadt9JlgZFRu!#bQ>B`P1NxY5OT`*e0&&o#F7; z;clFM>O47Su*Y^TyEj*r&Uq)1hvp${;Z75<0!h|mS4iPAW0FY!I7kNAjV5E8=8_G8 z*1R~eW23|@ENPts*fg^xPQ$=uojEQsoAJPbnarO12;=yO22C>kymyf)bPMze6Sy`X zD8fvfdkOm}Qo+>R864d0t^$@LSpn8AdNKjzWl}=m1?()e?4V*ftIb_u97LZT2(+s3 zh0s4@81$X(!Lm+)d~kM@N$OkyXx(5X8DDJqz)W^dZ+Ekq1I`F|CyBM#VLVLZPPYR4 z&aNV#zp%dIrEV<8V*kx`cj=Pd+pD5Qqo-v%pAULt*fdug6YGaJxbtxtV5H)eV$q#v zHlzQZk0P7S+XFo8Tp#pTn(Gg=y4K024ltr{Hc{fXYa$a?V3egT}`bffU`AEgO%z&8p&fTxwUoUt0 z20((y5o>F8WGfB)*=)4;_4U<)FLH^5neD(_%IN9?odvz@wD(LriD(yG;O@Gk+~z6p}8 zDIblbn8%qB1SU6Fjn)WpBYMOBU1U41pUp^iGO>(Y2gFPFvE&5r|C&(8CmhRk%jj}M zsI!-_Nx_zFKf%(qQ7rKJNth(50HhO_izf{BihEdU?8yxwkA;qBJpjd!1ZFNWR&9s`udUV(#rT8=ctO`l=ogGV^@!OBP7 z4_#isH~N>Mb_JPBZGKGmkoi6YVuu_!r?TLYWWTuyLZcMd@Uq4AfYc1{iBW*9eKu5; zTbPEEY+`B#hGp-=N!XgqMJ~?%9+vBa^P(eoSw;RbLB zWg#E;3Cx@DMm&(jOg59yB$wVkkS<|~3dVTiRs0u()1)Mvbdr9M**d0-1 zYWPz?LjXgRFdhtStxs3LqY-p=D%($JvwxsD!S>byqi@CS1+-ey0H@kaDcP4N0yYu= zJ95P)Zq+%V?&f2buFw1zLLan!Nq6bjywQ^kEynbR5cC0rkB^Tr{3wE|kFUM?TLn7S zdnT|6=TrasSU^2hMQY=zyz-LNJ3hZY?}(5{^;%1WMAEA|{l#_l$y?N3|6})4XE+*O z4X@9SH@>6d-X%iM13~ZUSZf?of)6|nxGe99n?)T1bK+>?CBm^t7trT

8Z6POS9R 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�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 V`hWeu|Lgzy{{Wd6i^`Vu3IJ=3NCW@? diff --git a/scrapy/tests/test_contrib_ibl/samples_pageparsing.json.gz b/scrapy/tests/test_contrib_ibl/samples_pageparsing.json.gz deleted file mode 100644 index c3d950f738bc0a5747ce023d5afa4356c23aeab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9026 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 Date: Thu, 7 Oct 2010 14:55:29 -0200 Subject: [PATCH 22/67] Simplification of html parsing algorithm, fixed some tests (with new algorithm, comments inside bigger text region are generated separated from the text). Added test for a case not correctly handled by previous algorithm. Fixed test checking --- scrapy/contrib/ibl/htmlpage.py | 119 ++++++------------ .../samples/samples_htmlpage_0.json | 16 ++- .../samples/samples_htmlpage_1.json | 28 ++++- .../samples/samples_htmlpage_2.json | 28 ++++- .../test_contrib_ibl/test_htmlpage_data.py | 27 +++- 5 files changed, 125 insertions(+), 93 deletions(-) diff --git a/scrapy/contrib/ibl/htmlpage.py b/scrapy/contrib/ibl/htmlpage.py index daeef4053..023030bdc 100644 --- a/scrapy/contrib/ibl/htmlpage.py +++ b/scrapy/contrib/ibl/htmlpage.py @@ -83,93 +83,18 @@ class HtmlTag(HtmlDataFragment): _ATTR = "((?:[^=/>\s]|/(?!>))+)(?:\s*=(?:\s*\"(.*?)\"|\s*'(.*?)'|([^>\s]+))?)?" _TAG = "<(\/?)(\w+(?::\w+)?)((?:\s+" + _ATTR + ")+\s*|\s*)(\/?)>" _DOCTYPE = r"" +_SCRIPT = "()(.*?)()" +_COMMENT = "()" _ATTR_REGEXP = re.compile(_ATTR, re.I | re.DOTALL) -_HTML_REGEXP = re.compile(_TAG, re.I | re.DOTALL) +_HTML_REGEXP = re.compile("%s|%s|%s" % (_COMMENT, _SCRIPT, _TAG), re.I | re.DOTALL) _DOCTYPE_REGEXP = re.compile("(?:%s)" % _DOCTYPE) -_COMMENT_RE = re.compile("()", re.DOTALL) -_SCRIPT_RE = re.compile("().*?()", re.DOTALL | re.I) +_COMMENT_REGEXP = re.compile(_COMMENT, re.DOTALL) def parse_html(text): """Higher level html parser. Calls lower level parsers and joins sucesive HtmlDataFragment elements in a single one. """ - script_layer = lambda x: _parse_clean_html(x, _SCRIPT_RE, HtmlTag, _simple_parse_html) - comment_layer = lambda x: _parse_clean_html(x, _COMMENT_RE, HtmlDataFragment, script_layer) - delayed_element = None - for element in comment_layer(text): - if isinstance(element, HtmlTag): - if delayed_element is not None: - yield delayed_element - delayed_element = None - yield element - else:# element is HtmlDataFragment - if delayed_element is not None: - delayed_element.start = min(element.start, delayed_element.start) - delayed_element.end = max(element.end, delayed_element.end) - else: - delayed_element = element - if delayed_element is not None: - yield delayed_element - -def _parse_clean_html(text, regex, htype, func): - """ - Removes regions from text, passes the cleaned text to the lower parse layer, - and reinserts removed regions. - regex - regular expression that defines regions to be removed/re inserted - htype - the html parser type of the removed elements - func - function that performs the lower parse layer - """ - removed = [[m.start(), m.end(), m.groups()] for m in regex.finditer(text)] - - cleaned = regex.sub("", text) - shift = 0 - for element in func(cleaned): - element.start += shift - element.end += shift - while removed: - if element.end <= removed[0][0]: - yield element - break - else: - start, end, groups = removed.pop(0) - add = end - start - element.end += add - shift += add - if element.start >= start: - element.start += add - elif isinstance(element, HtmlTag): - yield element - break - - if element.start < start: - yield HtmlDataFragment(element.start, start) - element.start = end - - if htype == HtmlTag: - begintag = _parse_tag(_HTML_REGEXP.match(groups[0])) - endtag = _parse_tag(_HTML_REGEXP.match(groups[1])) - begintag.start = start - begintag.end += start - - endtag.start = end - endtag.end - endtag.end = end - content = None - if begintag.end < endtag.start: - content = HtmlDataFragment(begintag.end, endtag.start) - yield begintag - if content is not None: - yield content - yield endtag - else: - yield htype(start, end) - else: - yield element - -def _simple_parse_html(text): - """Simple html parse. It returns a sequence of HtmlTag and HtmlDataFragment - objects. Does not ignore any region. - """ # If have doctype remove it. start_pos = 0 match = _DOCTYPE_REGEXP.match(text) @@ -182,19 +107,49 @@ def _simple_parse_html(text): if start > prev_end: yield HtmlDataFragment(prev_end, start) - - yield _parse_tag(match) + + if match.groups()[0] is not None: # comment + yield HtmlDataFragment(start, end) + elif match.groups()[1] is not None: # + for e in _parse_script(match): + yield e + else: # tag + yield _parse_tag(match) prev_end = end textlen = len(text) if prev_end < textlen: yield HtmlDataFragment(prev_end, textlen) +def _parse_script(match): + """parse a region matched by _HTML_REGEXP""" + open_text, content, close_text = match.groups()[1:4] + + open_tag = _parse_tag(_HTML_REGEXP.match(open_text)) + open_tag.start = match.start() + open_tag.end = match.start() + len(open_text) + + close_tag = _parse_tag(_HTML_REGEXP.match(close_text)) + close_tag.start = match.end() - len(close_text) + close_tag.end = match.end() + + yield open_tag + if open_tag.end < close_tag.start: + start_pos = 0 + for m in _COMMENT_REGEXP.finditer(content): + if m.start() > start_pos: + yield HtmlDataFragment(open_tag.end + start_pos, open_tag.end + m.start()) + yield HtmlDataFragment(open_tag.end + m.start(), open_tag.end + m.end()) + start_pos = m.end() + if open_tag.end + start_pos < close_tag.start: + yield HtmlDataFragment(open_tag.end + start_pos, close_tag.start) + yield close_tag + def _parse_tag(match): """ parse a tag matched by _HTML_REGEXP """ data = match.groups() - closing, tag, attr_text = data[:3] + closing, tag, attr_text = data[4:7] # if tag is None then the match is a comment if tag is not None: unpaired = data[-1] diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json index 13fb0d730..08826aa69 100644 --- a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_0.json @@ -208,11 +208,19 @@ "end": 1073, "start": 1043, "tag_type": 1 - }, + }, + { + "start": 1073, + "end": 1074 + }, { - "start": 1073, + "start": 1074, + "end": 2052 + }, + { + "start": 2052, "end": 2053 - }, + }, { "attributes": {}, "tag": "script", @@ -3088,4 +3096,4 @@ "start": 13843, "tag_type": 2 } -] \ No newline at end of file +] diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json index 15e661399..f94837c4d 100644 --- a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_1.json @@ -208,8 +208,16 @@ }, { "start": 1954, + "end": 1956 + }, + { + "start": 1956, + "end": 1979 + }, + { + "start": 1979, "end": 1980 - }, + }, { "attributes": { "src": "http://images.play.com/sitetrak/cmdatatagutilsA.js", @@ -266,6 +274,14 @@ }, { "start": 2282, + "end": 2283 + }, + { + "start": 2283, + "end": 2437 + }, + { + "start": 2437, "end": 2438 }, { @@ -325,6 +341,14 @@ }, { "start": 2860, + "end": 2861 + }, + { + "start": 2861, + "end": 2882 + }, + { + "start": 2882, "end": 2884 }, { @@ -21941,4 +21965,4 @@ "tag_type": 2, "start": 72792 } -] \ No newline at end of file +] diff --git a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json index 3fa134f28..c856f4a92 100644 --- a/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json +++ b/scrapy/tests/test_contrib_ibl/samples/samples_htmlpage_2.json @@ -240,6 +240,14 @@ }, { "start": 2180, + "end": 2182 + }, + { + "start": 2182, + "end": 2205 + }, + { + "start": 2205, "end": 2206 }, { @@ -298,6 +306,14 @@ }, { "start": 2508, + "end": 2509 + }, + { + "start": 2509, + "end": 2663 + }, + { + "start": 2663, "end": 2664 }, { @@ -356,7 +372,15 @@ "tag_type": 2 }, { - "start": 3086, + "start": 3086, + "end": 3087 + }, + { + "start": 3087, + "end": 3108 + }, + { + "start": 3108, "end": 3110 }, { @@ -21765,4 +21789,4 @@ "start": 72321, "end": 72325 } -] \ No newline at end of file +] diff --git a/scrapy/tests/test_contrib_ibl/test_htmlpage_data.py b/scrapy/tests/test_contrib_ibl/test_htmlpage_data.py index 53992fef1..62cd6b526 100644 --- a/scrapy/tests/test_contrib_ibl/test_htmlpage_data.py +++ b/scrapy/tests/test_contrib_ibl/test_htmlpage_data.py @@ -165,7 +165,9 @@ PARSED3 = [ {'attributes': {}, 'end': 55, 'start': 51, 'tag': u'p', 'tag_type': 2}, {'end': 70, 'start': 55}, {'attributes': {u'type': u'text/javascript'}, 'end': 101, 'start': 70, 'tag': u'script', 'tag_type': 1}, - {'end': 124, 'start': 101}, + {'end': 104, 'start': 101}, + {'end': 118, 'start': 104}, + {'end': 124, 'start': 118}, {'attributes': {}, 'end': 133, 'start': 124, 'tag': u'script', 'tag_type': 2}, {'attributes': {}, 'end': 140, 'start': 133, 'tag': u'body', 'tag_type': 2}, {'attributes': {}, 'end': 147, 'start': 140, 'tag': u'html', 'tag_type': 2} @@ -204,7 +206,8 @@ PARSED5 = [ {'end': 45, 'start': 42}, {'attributes': {}, 'end': 54, 'start': 45, 'tag': u'script', 'tag_type': 2}, {'attributes': {}, 'end': 61, 'start': 54, 'tag': u'body', 'tag_type': 2}, - {'end': 91, 'start': 61}, + {'end': 76, 'start': 61}, + {'end': 91, 'start': 76}, {'attributes': {}, 'end': 98, 'start': 91, 'tag': u'html', 'tag_type': 2}, ] @@ -215,7 +218,9 @@ PARSED6 = [ {'attributes': {}, 'end': 6, 'start': 0, 'tag': u'html', 'tag_type': 1}, {'attributes': {}, 'end': 12, 'start': 6, 'tag': u'body', 'tag_type': 1}, {'attributes': {}, 'end': 20, 'start': 12, 'tag': u'script', 'tag_type': 1}, - {'end': 40, 'start': 20}, + {'end': 23, 'start': 20}, + {'end': 37, 'start': 23}, + {'end': 40, 'start': 37}, {'attributes': {}, 'end': 49, 'start': 40, 'tag': u'script', 'tag_type': 2}, {'end': 52, 'start': 49}, {'attributes': {}, 'end': 60, 'start': 52, 'tag': u'script', 'tag_type': 1}, @@ -225,3 +230,19 @@ PARSED6 = [ {'attributes': {}, 'end': 81, 'start': 74, 'tag': u'body', 'tag_type': 2}, {'attributes': {}, 'end': 88, 'start': 81, 'tag': u'html', 'tag_type': 2}, ] + +# Test source without ending body nor html +PAGE7 = u"""

veris in temporibus sub aprilis idibus

""" + +PARSED7 = [ + {'attributes' : {}, 'end': 6, 'start': 0, 'tag': u'html', 'tag_type': 1}, + {'attributes': {}, 'end': 12, 'start': 6, 'tag': u'body', 'tag_type': 1}, + {'attributes': {}, 'end': 15, 'start': 12, 'tag': u'p', 'tag_type': 1}, + {'end': 53, 'start': 15}, + {'attributes': {}, 'end': 57, 'start': 53, 'tag': u'p', 'tag_type': 2}, + {'attributes' : {}, 'end': 65, 'start': 57, 'tag': u'script', 'tag_type': 1}, + {'end': 76, 'start': 65}, + {'attributes' : {}, 'end': 85, 'start': 76, 'tag': u'script', 'tag_type': 2}, + {'end': 99, 'start': 85}, +] + From a99bb0de9bdac4bae700a1cfce3e8d4b2e755b35 Mon Sep 17 00:00:00 2001 From: Martin Olveyra Date: Fri, 8 Oct 2010 11:28:44 -0200 Subject: [PATCH 23/67] Use binary flag in read/write operations, to fix tests in windows --- scrapy/tests/test_contrib_ibl/test_htmlpage.py | 8 ++++---- scrapy/tests/test_contrib_ibl/test_pageparsing.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scrapy/tests/test_contrib_ibl/test_htmlpage.py b/scrapy/tests/test_contrib_ibl/test_htmlpage.py index a4778b9b5..cdba56853 100644 --- a/scrapy/tests/test_contrib_ibl/test_htmlpage.py +++ b/scrapy/tests/test_contrib_ibl/test_htmlpage.py @@ -43,9 +43,9 @@ def add_sample(source): while os.path.exists("%s_%d.json" % (SAMPLES_FILE_PREFIX, count)): count += 1 - open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "w").write(unicode_to_str(source)) + open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "wb").write(unicode_to_str(source)) parsed = list(parse_html(source)) - open("%s_%d.json" % (SAMPLES_FILE_PREFIX, count), "w")\ + open("%s_%d.json" % (SAMPLES_FILE_PREFIX, count), "wb")\ .write(json.dumps(parsed, default=_encode_element, indent=8)) class TestParseHtml(TestCase): @@ -96,8 +96,8 @@ class TestParseHtml(TestCase): count = 0 fname = "%s_%d.json" % (SAMPLES_FILE_PREFIX, count) while os.path.exists(fname): - source = str_to_unicode(open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "r").read()) - parsed = json.loads(str_to_unicode(open(fname, "r").read()),\ + source = str_to_unicode(open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "rb").read()) + parsed = json.loads(str_to_unicode(open(fname, "rb").read()),\ object_hook=_decode_element) self._test_sample(source, parsed, count) count += 1 diff --git a/scrapy/tests/test_contrib_ibl/test_pageparsing.py b/scrapy/tests/test_contrib_ibl/test_pageparsing.py index 1766f4aa2..ae5e1c129 100644 --- a/scrapy/tests/test_contrib_ibl/test_pageparsing.py +++ b/scrapy/tests/test_contrib_ibl/test_pageparsing.py @@ -277,8 +277,8 @@ class TestPageParsing(TestCase): count = 0 fname = "%s_%d.json" % (SAMPLES_FILE_PREFIX, count) while os.path.exists(fname): - source = str_to_unicode(open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "r").read()) - annotations = json.loads(str_to_unicode(open(fname, "r").read())) + source = str_to_unicode(open("%s_%d.html" % (SAMPLES_FILE_PREFIX, count), "rb").read()) + annotations = json.loads(str_to_unicode(open(fname, "rb").read())) template = HtmlPage(body=source) parser = TemplatePageParser(TokenDict()) parser.feed(template) From 7d8f922df987e238d009e14f410888da460add93 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 18 Oct 2010 22:36:30 -0200 Subject: [PATCH 24/67] Added documentation for CLOSESPIDER_ERRORCOUNT setting. Refs #254 --- docs/topics/extensions.rst | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/topics/extensions.rst b/docs/topics/extensions.rst index e30c389e4..8452d486b 100644 --- a/docs/topics/extensions.rst +++ b/docs/topics/extensions.rst @@ -276,7 +276,12 @@ Closes a spider automatically when some conditions are met, using a specific closing reason for each condition. The conditions for closing a spider can be configured through the following -settings. Other conditions will be supported in the future. +settings: + +* :setting:`CLOSESPIDER_TIMEOUT` +* :setting:`CLOSESPIDER_ITEMPASSED` +* :setting:`CLOSESPIDER_PAGECOUNT` +* :setting:`CLOSESPIDER_ERRORCOUNT` .. setting:: CLOSESPIDER_TIMEOUT @@ -305,7 +310,9 @@ non set), spiders won't be closed by number of passed items. .. setting:: CLOSESPIDER_PAGECOUNT CLOSESPIDER_PAGECOUNT -"""""""""""""""""""""" +""""""""""""""""""""" + +.. versionadded:: 0.11 Default: ``0`` @@ -314,8 +321,20 @@ crawls more than that, the spider will be closed with the reason ``closespider_pagecount``. If zero (or non set), spiders won't be closed by number of crawled responses. +.. setting:: CLOSESPIDER_ERRORCOUNT + +CLOSESPIDER_ERRORCOUNT +"""""""""""""""""""""" + .. versionadded:: 0.11 +Default: ``0`` + +An integer which specifies the maximum number of errors to receive before +closing the spider. If the spider generates more than that number of errors, +it will be closed with the reason ``closespider_errorcount``. If zero (or non +set), spiders won't be closed by number of errors. + StatsMailer extension ~~~~~~~~~~~~~~~~~~~~~ From 1d567cdce67320f8c22af0a5d2afa096edf282d7 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 18 Oct 2010 22:38:46 -0200 Subject: [PATCH 25/67] Added new 'deploy' command. Closes #261 --- docs/topics/commands.rst | 15 +++ docs/topics/scrapyd.rst | 110 ++++++++++++++------ extras/scrapy_bash_completion | 2 +- scrapy/commands/deploy.py | 186 ++++++++++++++++++++++++++++++++++ scrapy/utils/multipart.py | 34 +++++++ 5 files changed, 314 insertions(+), 33 deletions(-) create mode 100644 scrapy/commands/deploy.py create mode 100644 scrapy/utils/multipart.py diff --git a/docs/topics/commands.rst b/docs/topics/commands.rst index 0ea9e13db..8f50b45a9 100644 --- a/docs/topics/commands.rst +++ b/docs/topics/commands.rst @@ -107,6 +107,7 @@ Global commands: * :command:`shell` * :command:`fetch` * :command:`view` +* :command:`version` Project-only commands: @@ -116,6 +117,7 @@ Project-only commands: * :command:`genspider` * :command:`runserver` * :command:`queue` +* :command:`deploy` .. command:: startproject @@ -399,6 +401,8 @@ And clear the queue:: $ scrapy queue clear +.. command:: version + version ------- @@ -407,6 +411,17 @@ version Prints the Scrapy version. +.. command:: deploy + +deploy +------ + +.. versionadded:: 0.11 + +* Syntax: ``scrapy deploy [ | -l | -L ]`` +* Requires project: *yes* + +Deploy the project into a Scrapyd server. See :ref:`topics-deploying`. Custom project commands ======================= diff --git a/docs/topics/scrapyd.rst b/docs/topics/scrapyd.rst index effedfde4..56c75f40c 100644 --- a/docs/topics/scrapyd.rst +++ b/docs/topics/scrapyd.rst @@ -193,35 +193,94 @@ Here is an example configuration file with all the defaults: .. literalinclude:: ../../scrapyd/default_scrapyd.conf -Eggifying your project +.. _topics-deploying: + +Deploying your project ====================== -In order to upload your project to Scrapyd, you must first build a `Python -egg`_ of it. This is called "eggifying" your project. You'll need to install -`setuptools`_ for this. +Deploying your project into a Scrapyd server typically involves two steps: -To eggify your project add a `setup.py`_ file to the root directory of your -project (where the ``scrapy.cfg`` resides) with the following contents:: +1. building a `Python egg`_ of your project. This is called "eggifying" your + project. You'll need to install `setuptools`_ for this. See + :ref:`topics-egg-caveats` below. - #!/usr/bin/env python +2. uploading the egg to the Scrapyd server - from setuptools import setup, find_packages +The simplest way to deploy your project is by using the :command:`deploy` +command, which automates the process of building the egg uploading it using the +Scrapyd HTTP JSON API. - setup( - name = 'myproject', - version = '1.0', - packages = find_packages(), - entry_points = {'scrapy': ['settings = myproject.settings']}, - ) +The :command:`deploy` command supports multiple targets (Scrapyd servers that +can host your project) and each target supports multiple projects. -And then the run the following command:: +Each time you deploy a new version of a project, you can name it for later +reference. - python setup.py bdist_egg +Show and define targets +----------------------- -This will generate an egg file and leave it in the ``dist`` directory, for -example:: +To see all available targets type:: - dist/myproject-1.0-py2.6.egg + scrapy deploy -L + +This will return a list of available targets and their URLs:: + + scrapyd http://localhost:6800/ + +The ``scrapyd`` target is available by default. You can define more targets by +adding them to the ``scrapy.cfg`` file in your project or any other supported +location like ``~/.scrapy.cfg``, ``/etc/scrapy.cfg``, or +``c:\scrapy\scrapy.cfg``. + +Here's an example of defining a new target ``scrapyd2`` with restricted access +through HTTP basic authentication:: + + [deploy_scrapyd2] + url = http://scrapyd.mydomain.com/api/scrapy/ + username = john + password = secret + +.. note:: The :command:`deploy` command also supports netrc for getting the + credentials. + +Now, if you type ``scrapy deploy -L`` you'd see:: + + scrapyd http://localhost:6800/ + scrapyd2 http://scrapyd.mydomain.com/api/scrapy/ + +See available projects +---------------------- + +To see all available projets in certain target use:: + + scrapy deploy -l scrapyd + +It would return something like this:: + + project1 + project2 + +Deploying a project +------------------- + +Finally, to deploy your project use:: + + scrapy deploy scrapyd:project1 + +This will eggify your project and upload it to the target, printing the JSON +response returned from the Scrapyd server. If you have a ``setup.py`` file in +your project, that one will be used. Otherwise a ``setup.py`` file will be +created automatically (based on a simple template) that you can edit later. + +If you don't want to specify the target and project every time you run ``scrapy +deploy`` you can define the default target and project in the ``scrapy.cfg`` +file, like this:: + + [deploy] + target = scrapyd + project = project1 + +.. _topics-egg-caveats: Egg caveats ----------- @@ -242,19 +301,6 @@ project: have write access to certain directories. If you can, avoid writing to disk and always use `tempfile`_ for temporary files. -Uploading your project -====================== - -In these examples we'll be using `curl`_ for the web service interaction -examples, but you can use any command or library that speaks HTTP. - -Once you've built the egg, you can upload your project to Scrapyd, like this:: - - $ curl http://localhost:6800/addversion.json -F project=myproject -F version=r23 -F egg=@dist/myproject-1.0-py2.6.egg - {"status": "ok", "spiders": ["spider1", "spider2", "spider3"]} - -You'll see that the JSON response contains the spiders found in your project. - Scheduling a spider run ======================= diff --git a/extras/scrapy_bash_completion b/extras/scrapy_bash_completion index f311a5a28..b0654ee6a 100644 --- a/extras/scrapy_bash_completion +++ b/extras/scrapy_bash_completion @@ -11,7 +11,7 @@ _scrapy_completion() { ;; *) if [ $COMP_CWORD -eq 1 ]; then - commands="crawl fetch genspider list parse queue runserver runspider settings shell startproject view" + commands="crawl deploy fetch genspider list parse queue runserver runspider settings shell startproject view" COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W "$commands" -- "$cmd")) fi ;; diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py new file mode 100644 index 000000000..d6ebd16df --- /dev/null +++ b/scrapy/commands/deploy.py @@ -0,0 +1,186 @@ + +import sys +import os +import glob +import tempfile +import shutil +import time +import urllib2 +import netrc +from urlparse import urlparse, urljoin +from subprocess import Popen, PIPE, check_call + +from scrapy.command import ScrapyCommand +from scrapy.exceptions import UsageError +from scrapy.utils.py26 import json +from scrapy.utils.multipart import encode_multipart +from scrapy.utils.http import basic_auth_header +from scrapy.utils.conf import get_config, closest_scrapy_cfg + +_DEFAULT_TARGETS = { + 'scrapyd': { + 'url': 'http://localhost:6800/', + }, +} + +_SETUP_PY_TEMPLATE = \ +"""# Automatically created by: scrapy deploy + +from setuptools import setup, find_packages + +setup( + name = 'project', + version = '1.0', + packages = find_packages(), + entry_points = {'scrapy': ['settings = %(settings)s']}, +) +""" + +class Command(ScrapyCommand): + + def syntax(self): + return "[options] [ | -l | -L ]" + + def short_desc(self): + return "Deploy project in Scrapyd server" + + def long_desc(self): + return "Deploy the current project into the given Scrapyd server " \ + "(aka target) and project." + + def add_options(self, parser): + ScrapyCommand.add_options(self, parser) + parser.add_option("-v", "--version", + help="the version to deploy. Defaults to current timestamp") + parser.add_option("-L", "--list-targets", action="store_true", \ + help="list available targets") + parser.add_option("-l", "--list-projects", metavar="TARGET", \ + help="list available projects on TARGET") + + def run(self, args, opts): + try: + import setuptools + except ImportError: + raise UsageError("setuptools not installed") + if opts.list_targets: + for name, target in _get_targets().items(): + print "%-20s %s" % (name, target['url']) + return + if opts.list_projects: + target = _get_target(opts.list_projects) + req = urllib2.Request(_url(target, 'listprojects.json')) + _add_auth_header(req, target) + f = urllib2.urlopen(req) + projects = json.loads(f.read())['projects'] + print os.linesep.join(projects) + return + target, project = _get_target_project(args) + version = _get_version(opts) + egg = _build_egg() + _upload_egg(target, egg, project, version) + +def _log(message): + sys.stderr.write("%s\n" % message) + +def _get_target_project(args): + if len(args) >= 1 and ':' in args[0]: + target_name, project = args[0].split(':', 1) + elif len(args) < 1: + target_name = _get_option('deploy', 'target') + project = _get_option('deploy', 'project') + if not target_name or not project: + raise UsageError(" not given and defaults not found") + else: + raise UsageError("%r is not a " % args[0]) + target = _get_target(target_name) + return target, project + +def _get_option(section, option, default=None): + cfg = get_config() + return cfg.get(section, option) if cfg.has_option(section, option) \ + else default + +def _get_targets(): + cfg = get_config() + targets = _DEFAULT_TARGETS.copy() + for x in cfg.sections(): + if x.startswith('deploy_'): + targets[x[7:]] = dict(cfg.items(x)) + return targets + +def _get_target(name): + try: + return _get_targets()[name] + except KeyError: + raise UsageError("Unknown target: %s" % name) + +def _url(target, action): + return urljoin(target['url'], action) + +def _get_version(opts): + if opts.version == 'HG': + p = Popen(['hg', 'tip', '--template', '{rev}'], stdout=PIPE) + return 'r%s' % p.communicate()[0] + elif opts.version: + return opts.version + else: + return str(int(time.time())) + +def _upload_egg(target, eggfile, project, version): + data = { + 'project': project, + 'version': version, + 'egg': ('project.egg', eggfile.read()), + } + body, boundary = encode_multipart(data) + url = _url(target, 'addversion.json') + headers = { + 'Content-Type': 'multipart/form-data; boundary=%s' % boundary, + 'Content-Length': str(len(body)), + } + req = urllib2.Request(url, body, headers) + _add_auth_header(req, target) + _log("Deploying %s-%s to %s" % (project, version, url)) + _http_post(req) + +def _add_auth_header(request, target): + if 'username' in target: + u, p = target.get('username'), target.get('password', '') + request.add_header('Authorization', basic_auth_header(u, p)) + else: # try netrc + try: + host = urlparse(target['url']).hostname + a = netrc.netrc().authenticators(host) + request.add_header('Authorization', basic_auth_header(a[0], a[2])) + except (netrc.NetrcParseError, TypeError): + pass + +def _http_post(request): + try: + f = urllib2.urlopen(request) + _log("Server response (%s):" % f.getcode()) + print f.read() + except urllib2.HTTPError, e: + _log("Deploy failed (%s):" % e.getcode()) + print e.read() + except urllib2.URLError, e: + _log("Deploy failed: %s" % e) + +def _build_egg(): + closest = closest_scrapy_cfg() + os.chdir(os.path.dirname(closest)) + if not os.path.exists('setup.py'): + settings = get_config().get('settings', 'default') + _create_default_setup_py(settings=settings) + d = tempfile.mkdtemp() + try: + f = tempfile.TemporaryFile(dir=d) + check_call([sys.executable, 'setup.py', 'bdist_egg', '-d', d], stdout=f) + egg = glob.glob(os.path.join(d, '*.egg'))[0] + return open(egg, 'rb') + finally: + shutil.rmtree(d) + +def _create_default_setup_py(**kwargs): + with open('setup.py', 'w') as f: + f.write(_SETUP_PY_TEMPLATE % kwargs) diff --git a/scrapy/utils/multipart.py b/scrapy/utils/multipart.py new file mode 100644 index 000000000..f1ed235ae --- /dev/null +++ b/scrapy/utils/multipart.py @@ -0,0 +1,34 @@ +from cStringIO import StringIO + +def encode_multipart(data): + """Encode the given data to be used in a multipart HTTP POST. Data is a + where keys are the field name, and values are either strings or tuples + (filename, content) for file uploads. + + This code is based on distutils.command.upload + """ + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = '\r\n--' + boundary + end_boundary = sep_boundary + '--' + body = StringIO() + for key, value in data.items(): + # handle multiple entries for the same name + if type(value) != type([]): + value = [value] + for value in value: + if type(value) is tuple: + fn = '; filename="%s"' % value[0] + value = value[1] + else: + fn = "" + + body.write(sep_boundary) + body.write('\r\nContent-Disposition: form-data; name="%s"' % key) + body.write(fn) + body.write("\r\n\r\n") + body.write(value) + body.write(end_boundary) + body.write("\r\n") + return body.getvalue(), boundary From 6c921896a5bbc64a93b1e027aeacb9cd062165b8 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 19 Oct 2010 00:11:45 -0200 Subject: [PATCH 26/67] Expanded documentation on deploy command and versions. Refs #261 --- docs/topics/scrapyd.rst | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/docs/topics/scrapyd.rst b/docs/topics/scrapyd.rst index 56c75f40c..fc02d7dd3 100644 --- a/docs/topics/scrapyd.rst +++ b/docs/topics/scrapyd.rst @@ -272,9 +272,30 @@ response returned from the Scrapyd server. If you have a ``setup.py`` file in your project, that one will be used. Otherwise a ``setup.py`` file will be created automatically (based on a simple template) that you can edit later. -If you don't want to specify the target and project every time you run ``scrapy -deploy`` you can define the default target and project in the ``scrapy.cfg`` -file, like this:: +After running that command you will see something like this meaning your +project was uploaded successfully:: + + Deploying myproject-1287453519 to http://localhost:6800/addversion.json + Server response (200): + {"status": "ok", "spiders": ["spider1", "spider2"]} + +By default ``scrapy deploy`` uses the current timestamp for generating the +project version, as you can see in the output above. However, you can pass a +custom version with the ``--version`` option:: + + scrapy deploy scrapyd:project1 --version 54 + +Also, if you use Mercurial for tracking your project source code, you can use +``HG`` for the version which will be replaced by the current Mercurial +revision, for example ``r382``:: + + scrapy deploy scrapyd:project1 --version HG + +Support for other version discovery sources may be added in the future. + +Finally, if you don't want to specify the target and project every time you run +``scrapy deploy`` you can define the default ones in the ``scrapy.cfg`` file, +like this:: [deploy] target = scrapyd From f8b4d1dc5d6dd8f3f3f642cea342ca37cb6f2b4e Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 21 Oct 2010 12:53:40 -0200 Subject: [PATCH 27/67] Fixed compatibility with Python 2.5 --- scrapy/commands/deploy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index d6ebd16df..65827b5eb 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -1,3 +1,4 @@ +from __future__ import with_statement import sys import os From 992683ac5cca1840738cafa91a74170e72cea67f Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 21 Oct 2010 13:24:02 -0200 Subject: [PATCH 28/67] Deploy command requires project --- scrapy/commands/deploy.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index 65827b5eb..a7cd8c9a9 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -39,6 +39,8 @@ setup( class Command(ScrapyCommand): + requires_project = True + def syntax(self): return "[options] [ | -l | -L ]" From d17edd4a5972d252b1290b76108aa441bf155333 Mon Sep 17 00:00:00 2001 From: Martin Olveyra Date: Fri, 22 Oct 2010 14:21:52 -0200 Subject: [PATCH 29/67] Fix wrong slice of tokens in recursive extraction of follow region --- .../contrib/ibl/extraction/regionextract.py | 6 ++-- .../tests/test_contrib_ibl/test_extraction.py | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/scrapy/contrib/ibl/extraction/regionextract.py b/scrapy/contrib/ibl/extraction/regionextract.py index dd4bc6256..e84c82cd3 100644 --- a/scrapy/contrib/ibl/extraction/regionextract.py +++ b/scrapy/contrib/ibl/extraction/regionextract.py @@ -409,16 +409,16 @@ class RecordExtractor(object): _, _, nested_data = self._doextract(page, nested_regions, pindex, sindex) extracted_data += nested_data if following_regions: - _, _, following_data = self._doextract(page, following_regions, sindex or start_index, end_region) + _, _, following_data = self._doextract(page, following_regions, sindex or start_index, end_index) extracted_data += following_data elif following_regions: - end_index, _, following_data = self._doextract(page, following_regions, start_index, end_region) + end_index, _, following_data = self._doextract(page, following_regions, start_index, end_index) if end_index is not None: pindex, sindex, extracted_data = self._doextract(page, [first_region], start_index, end_index - 1, nested_regions, ignored_regions) extracted_data += following_data elif nested_regions: - _, _, nested_data = self._doextract(page, nested_regions, start_index, end_region) + _, _, nested_data = self._doextract(page, nested_regions, start_index, end_index) extracted_data += nested_data return pindex, sindex, extracted_data diff --git a/scrapy/tests/test_contrib_ibl/test_extraction.py b/scrapy/tests/test_contrib_ibl/test_extraction.py index d4acbf5d5..2c5cbb30a 100644 --- a/scrapy/tests/test_contrib_ibl/test_extraction.py +++ b/scrapy/tests/test_contrib_ibl/test_extraction.py @@ -607,6 +607,32 @@ EXTRACT_PAGE19b = u""" """ +ANNOTATED_PAGE20 = u""" + +

Product Name

+ +
+Twin: $270 - November 2010
+Queen: $330 - In stock
+
+ +""" + +EXTRACT_PAGE20 = u""" + +

Product Name

+ +
+Twin: $270 - November 2010
+Queen: $330 - Movember 2010
+
+ +""" + SAMPLE_DESCRIPTOR1 = ItemDescriptor('test', 'product test', [ A('name', "Product name", required=True), A('price', "Product price, including any discounts and tax or vat", @@ -781,6 +807,12 @@ TEST_DATA = [ SAMPLE_DESCRIPTOR1, None, ), + ('repeated partial annotations with variants', [ANNOTATED_PAGE20], EXTRACT_PAGE20, None, + {u'variants': [ + {'price': ['270'], 'name': ['Twin']}, + {'price': ['330'], 'name': ['Queen']}, + ]}, + ), ] class TestExtraction(TestCase): From ad439173228ae8780b26de43fffc3a0e6e9a7a57 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Sat, 23 Oct 2010 04:44:55 -0200 Subject: [PATCH 30/67] Add tests to MediaPipeline. closes #269 --HG-- extra : rebase_source : ccf726e147b5c97f7cba60d20ce2fca58c687a3e --- scrapy/contrib/pipeline/media.py | 89 +++++---- scrapy/tests/test_pipeline_media.py | 269 ++++++++++++++++++++++------ 2 files changed, 259 insertions(+), 99 deletions(-) diff --git a/scrapy/contrib/pipeline/media.py b/scrapy/contrib/pipeline/media.py index ebaf7b672..2d0cd5053 100644 --- a/scrapy/contrib/pipeline/media.py +++ b/scrapy/contrib/pipeline/media.py @@ -1,3 +1,4 @@ +from collections import defaultdict from twisted.internet.defer import Deferred, DeferredList from scrapy.utils.defer import mustbe_deferred, defer_result @@ -8,20 +9,22 @@ from scrapy.utils.misc import arg_to_iter class MediaPipeline(object): - DOWNLOAD_PRIORITY = 1000 LOG_FAILED_RESULTS = True class SpiderInfo(object): def __init__(self, spider): self.spider = spider - self.downloading = {} + self.downloading = set() self.downloaded = {} - self.waiting = {} + self.waiting = defaultdict(list) - def __init__(self): + def __init__(self, download_func=None): self.spiderinfo = {} + self._download_func = download_func or self._default_download_func() + + def _default_download_func(self): from scrapy.project import crawler - self.crawler = crawler + return crawler.engine.download def open_spider(self, spider): self.spiderinfo[spider] = self.SpiderInfo(spider) @@ -32,63 +35,53 @@ class MediaPipeline(object): def process_item(self, item, spider): info = self.spiderinfo[spider] requests = arg_to_iter(self.get_media_requests(item, info)) - dlist = [self._enqueue(r, info) for r in requests] + dlist = [self._process_request(r, info) for r in requests] dfd = DeferredList(dlist, consumeErrors=1) return dfd.addCallback(self.item_completed, item, info) - def _enqueue(self, request, info): + def _process_request(self, request, info): fp = request_fingerprint(request) cb = request.callback or (lambda _: _) eb = request.errback - # if already downloaded, return cached result. + # Return cached result if request was already seen if fp in info.downloaded: return defer_result(info.downloaded[fp]).addCallbacks(cb, eb) + # Otherwise, wait for result wad = Deferred().addCallbacks(cb, eb) - # add to pending list for this request, and wait for result like the others. - info.waiting.setdefault(fp, []).append(wad) + info.waiting[fp].append(wad) - # if request is not downloading, download it. - if fp not in info.downloading: - self._download(request, info, fp) + # Check if request is downloading right now to avoid doing it twice + if fp in info.downloading: + return wad - return wad - - def _download(self, request, info, fp): - def _downloaded(result): - info.downloading.pop(fp) - info.downloaded[fp] = result - for wad in info.waiting.pop(fp): # pass result to each waiting client - defer_result(result).chainDeferred(wad) - - def _post_media_to_download(result): - if result is None: # continue with download - dwld = mustbe_deferred(self.download, request, info) - dwld.addCallbacks( - callback=self.media_downloaded, - callbackArgs=(request, info), - errback=self.media_failed, - errbackArgs=(request, info)) - else: # or use media_to_download return value as result - dwld = defer_result(result) - - info.downloading[fp] = (request, dwld) # fill downloading state data - dwld.addBoth(_downloaded) # append post-download hook - dwld.addErrback(log.err, spider=info.spider) - - # declare request in downloading state (None is used as place holder) - info.downloading[fp] = None - - # defer pre-download request processing + # Download request checking media_to_download hook output first + info.downloading.add(fp) dfd = mustbe_deferred(self.media_to_download, request, info) - dfd.addCallback(_post_media_to_download) + dfd.addCallback(self._check_media_to_download, request, info) + dfd.addBoth(self._cache_result_and_execute_waiters, fp, info) + dfd.addErrback(log.err, spider=info.spider) + return dfd.addBoth(lambda _: wad) # it must return wad at last + + def _check_media_to_download(self, result, request, info): + if result is not None: + return result + # Download request and process its response + return mustbe_deferred(self.download, request, info).addCallbacks( + callback=self.media_downloaded, callbackArgs=(request, info), + errback=self.media_failed, errbackArgs=(request, info)) + + def _cache_result_and_execute_waiters(self, result, fp, info): + info.downloading.remove(fp) + info.downloaded[fp] = result # cache result + for wad in info.waiting.pop(fp): + defer_result(result).chainDeferred(wad) ### Overradiable Interface def download(self, request, info): """Defines how to download the media request""" - request.priority = self.DOWNLOAD_PRIORITY - return self.crawler.engine.download(request, info.spider) + return self._download_func(request, info.spider) def media_to_download(self, request, info): """Check request before starting download""" @@ -109,8 +102,8 @@ class MediaPipeline(object): def item_completed(self, results, item, info): """Called per item when all media requests has been processed""" if self.LOG_FAILED_RESULTS: - for success, result in results: - if not success: - log.err(result, '%s found errors proessing %s' % (self.__class__.__name__, item)) + msg = '%s found errors proessing %s' % (self.__class__.__name__, item) + for ok, value in results: + if not ok: + log.err(value, msg, spider=info.spider) return item - diff --git a/scrapy/tests/test_pipeline_media.py b/scrapy/tests/test_pipeline_media.py index a9731e6bd..64b506820 100644 --- a/scrapy/tests/test_pipeline_media.py +++ b/scrapy/tests/test_pipeline_media.py @@ -1,85 +1,252 @@ from twisted.trial import unittest -from twisted.python import failure -from twisted.internet import defer, reactor +from twisted.python.failure import Failure +from twisted.internet import reactor +from twisted.internet.defer import Deferred, inlineCallbacks +from twisted.python import log as txlog -from scrapy.settings import Settings -from scrapy.crawler import Crawler from scrapy.http import Request, Response from scrapy.spider import BaseSpider from scrapy.utils.request import request_fingerprint from scrapy.contrib.pipeline.media import MediaPipeline +from scrapy.utils.test import get_crawler +from scrapy import log -class _MockedMediaPipeline(MediaPipeline): - - def download(self, request, info): - delay = request.meta.get('delay') - response = request.meta.get('response') - if delay is None: - return response - else: - dfd = defer.Deferred() - reactor.callLater(delay, dfd.callback, None) - return dfd.addCallback(lambda _: response) - - def get_media_requests(self, item, info): - return item.get('requests') +def _mocked_download_func(request, info): + response = request.meta.get('response') + return response() if callable(response) else response -class MediaPipelineTestCase(unittest.TestCase): +class BaseMediaPipelineTestCase(unittest.TestCase): - pipeline_class = _MockedMediaPipeline + pipeline_class = MediaPipeline def setUp(self): - self.crawler = Crawler(Settings()) - self.crawler.install() self.spider = BaseSpider('media.com') - self.pipe = self.pipeline_class() + self.pipe = self.pipeline_class(download_func=_mocked_download_func) self.pipe.open_spider(self.spider) + self.info = self.pipe.spiderinfo[self.spider] def tearDown(self): self.pipe.close_spider(self.spider) - self.crawler.uninstall() - @defer.inlineCallbacks - def test_return_item_by_default(self): - item = dict(name='sofa') + def test_default_media_to_download(self): + request = Request('url') + assert self.pipe.media_to_download(request, self.info) is None + + def test_default_get_media_requests(self): + item = dict(name='name') + assert self.pipe.get_media_requests(item, self.info) is None + + def test_default_media_downloaded(self): + request = Request('url') + response = Response('url', body='') + assert self.pipe.media_downloaded(response, request, self.info) is response + + def test_default_media_failed(self): + request = Request('url') + fail = Failure(Exception()) + assert self.pipe.media_failed(fail, request, self.info) is fail + + def test_default_item_completed(self): + item = dict(name='name') + assert self.pipe.item_completed([], item, self.info) is item + + # Check that failures are logged by default + fail = Failure(Exception()) + results = [(True, 1), (False, fail)] + + events = [] + txlog.addObserver(events.append) + new_item = self.pipe.item_completed(results, item, self.info) + txlog.removeObserver(events.append) + self.flushLoggedErrors() + + assert new_item is item + assert len(events) == 1 + assert events[0]['logLevel'] == log.ERROR + assert events[0]['failure'] is fail + + # disable failure logging and check again + self.pipe.LOG_FAILED_RESULTS = False + events = [] + txlog.addObserver(events.append) + new_item = self.pipe.item_completed(results, item, self.info) + txlog.removeObserver(events.append) + self.flushLoggedErrors() + assert new_item is item + assert len(events) == 0 + + @inlineCallbacks + def test_default_process_item(self): + item = dict(name='name') new_item = yield self.pipe.process_item(item, self.spider) assert new_item is item - @defer.inlineCallbacks + def test_default_download_func(self): + crawler = get_crawler() + crawler.install() + crawler.configure() + try: + pipe = MediaPipeline() + assert pipe._download_func == crawler.engine.download + finally: + crawler.uninstall() + + +class MockedMediaPipeline(MediaPipeline): + + def __init__(self, *args, **kwargs): + super(MockedMediaPipeline, self).__init__(*args, **kwargs) + self._mockcalled = [] + + def download(self, request, info): + self._mockcalled.append('download') + return super(MockedMediaPipeline, self).download(request, info) + + def media_to_download(self, request, info): + self._mockcalled.append('media_to_download') + return super(MockedMediaPipeline, self).media_to_download(request, info) + + def get_media_requests(self, item, info): + self._mockcalled.append('get_media_requests') + return item.get('requests') + + def media_downloaded(self, response, request, info): + self._mockcalled.append('media_downloaded') + return super(MockedMediaPipeline, self).media_downloaded(response, request, info) + + def media_failed(self, failure, request, info): + self._mockcalled.append('media_failed') + return super(MockedMediaPipeline, self).media_failed(failure, request, info) + + def item_completed(self, results, item, info): + self._mockcalled.append('item_completed') + item = super(MockedMediaPipeline, self).item_completed(results, item, info) + item['results'] = results + return item + + +class MediaPipelineTestCase(BaseMediaPipelineTestCase): + + pipeline_class = MockedMediaPipeline + + @inlineCallbacks + def test_result_succeed(self): + cb = lambda _: self.pipe._mockcalled.append('request_callback') or _ + eb = lambda _: self.pipe._mockcalled.append('request_errback') or _ + rsp = Response('url1') + req = Request('url1', meta=dict(response=rsp), callback=cb, errback=eb) + item = dict(requests=req) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertEqual(new_item['results'], [(True, rsp)]) + self.assertEqual(self.pipe._mockcalled, + ['get_media_requests', 'media_to_download', 'download', + 'media_downloaded', 'request_callback', 'item_completed']) + + @inlineCallbacks + def test_result_failure(self): + self.pipe.LOG_FAILED_RESULTS = False + cb = lambda _: self.pipe._mockcalled.append('request_callback') or _ + eb = lambda _: self.pipe._mockcalled.append('request_errback') or _ + fail = Failure(Exception()) + req = Request('url1', meta=dict(response=fail), callback=cb, errback=eb) + item = dict(requests=req) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertEqual(new_item['results'], [(False, fail)]) + self.assertEqual(self.pipe._mockcalled, + ['get_media_requests', 'media_to_download', 'download', + 'media_failed', 'request_errback', 'item_completed']) + + @inlineCallbacks + def test_mix_of_success_and_failure(self): + self.pipe.LOG_FAILED_RESULTS = False + rsp1 = Response('url1') + req1 = Request('url1', meta=dict(response=rsp1)) + fail = Failure(Exception()) + req2 = Request('url2', meta=dict(response=fail)) + item = dict(requests=[req1, req2]) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertEqual(new_item['results'], [(True, rsp1), (False, fail)]) + m = self.pipe._mockcalled + # only once + self.assertEqual(m[0], 'get_media_requests') # first hook called + self.assertEqual(m.count('get_media_requests'), 1) + self.assertEqual(m.count('item_completed'), 1) + self.assertEqual(m[-1], 'item_completed') # last hook called + # twice, one per request + self.assertEqual(m.count('media_to_download'), 2) + self.assertEqual(m.count('download'), 2) + # one to handle success and other for failure + self.assertEqual(m.count('media_downloaded'), 1) + self.assertEqual(m.count('media_failed'), 1) + + @inlineCallbacks def test_get_media_requests(self): # returns single Request (without callback) - info = self.pipe.spiderinfo[self.spider] - req = Request('http://media.com/2.gif') + req = Request('url') item = dict(requests=req) # pass a single item new_item = yield self.pipe.process_item(item, self.spider) assert new_item is item - assert request_fingerprint(req) in info.downloaded + assert request_fingerprint(req) in self.info.downloaded # returns iterable of Requests - req1 = Request('http://media.com/1.gif') - req2 = Request('http://media.com/1.jpg') + req1 = Request('url1') + req2 = Request('url2') item = dict(requests=iter([req1, req2])) new_item = yield self.pipe.process_item(item, self.spider) assert new_item is item - assert info.downloaded.get(request_fingerprint(req1)) is None - assert info.downloaded.get(request_fingerprint(req2)) is None + assert request_fingerprint(req1) in self.info.downloaded + assert request_fingerprint(req2) in self.info.downloaded - @defer.inlineCallbacks - def test_requets_callback_is_called(self): - collected = [] - response = Response('http://media.com/2.gif') - request = Request('http://media.com/2.gif', meta=dict(response=response), callback=collected.append) - item = dict(requests=request) # pass a single item - yield self.pipe.process_item(item, self.spider) - assert collected == [response] + @inlineCallbacks + def test_results_are_cached_across_multiple_items(self): + rsp1 = Response('url1') + req1 = Request('url1', meta=dict(response=rsp1)) + item = dict(requests=req1) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertTrue(new_item is item) + self.assertEqual(new_item['results'], [(True, rsp1)]) - @defer.inlineCallbacks - def test_requets_errback_is_called(self): - collected = [] - fail = failure.Failure(Exception()) - req = Request('http://media.com/2.gif', meta=dict(response=fail), callback=lambda _:_, errback=collected.append) - item = dict(requests=req) # pass a single item - yield self.pipe.process_item(item, self.spider) - assert collected == [fail] + # rsp2 is ignored, rsp1 must be in results because request fingerprints are the same + req2 = Request(req1.url, meta=dict(response=Response('http://donot.download.me'))) + item = dict(requests=req2) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertTrue(new_item is item) + self.assertEqual(request_fingerprint(req1), request_fingerprint(req2)) + self.assertEqual(new_item['results'], [(True, rsp1)]) + + @inlineCallbacks + def test_results_are_cached_for_requests_of_single_item(self): + rsp1 = Response('url1') + req1 = Request('url1', meta=dict(response=rsp1)) + req2 = Request(req1.url, meta=dict(response=Response('http://donot.download.me'))) + item = dict(requests=[req1, req2]) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertTrue(new_item is item) + self.assertEqual(new_item['results'], [(True, rsp1), (True, rsp1)]) + + @inlineCallbacks + def test_wait_if_request_is_downloading(self): + def _check_downloading(response): + fp = request_fingerprint(req1) + assert fp in self.info.downloading, self.info.downloading + assert fp in self.info.waiting, self.info.waiting + assert len(self.info.waiting[fp]) == 2, self.info.waiting + assert fp not in self.info.downloaded, self.info.downloaded + return response + + rsp1 = Response('url') + def rsp1_func(): + dfd = Deferred().addCallback(_check_downloading) + reactor.callLater(.1, dfd.callback, rsp1) + return dfd + + def rsp2_func(): + assert False, 'This can not be called' + + req1 = Request('url', meta=dict(response=rsp1_func)) + req2 = Request(req1.url, meta=dict(response=rsp2_func)) + item = dict(requests=[req1, req2]) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertEqual(new_item['results'], [(True, rsp1), (True, rsp1)]) From fe1dd3a93d2a942440f9b0b18bce7b495ddd2d32 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Sat, 23 Oct 2010 05:10:52 -0200 Subject: [PATCH 31/67] disconnect signals before uninstalling crawler in image tests --- scrapy/contrib/pipeline/images.py | 4 ++-- scrapy/tests/test_pipeline_images.py | 12 +++++------- scrapy/tests/test_pipeline_media.py | 5 +++++ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/scrapy/contrib/pipeline/images.py b/scrapy/contrib/pipeline/images.py index 238961ad8..a103d5bd9 100644 --- a/scrapy/contrib/pipeline/images.py +++ b/scrapy/contrib/pipeline/images.py @@ -148,9 +148,9 @@ class ImagesPipeline(MediaPipeline): 's3': S3ImagesStore, } - def __init__(self, store_uri): + def __init__(self, store_uri, download_func=None): self.store = self._get_store(store_uri) - super(ImagesPipeline, self).__init__() + super(ImagesPipeline, self).__init__(download_func=download_func) @classmethod def from_settings(cls, settings): diff --git a/scrapy/tests/test_pipeline_images.py b/scrapy/tests/test_pipeline_images.py index 95dfa1a0c..41e9be71f 100644 --- a/scrapy/tests/test_pipeline_images.py +++ b/scrapy/tests/test_pipeline_images.py @@ -5,8 +5,6 @@ from shutil import rmtree from twisted.trial import unittest -from scrapy.crawler import Crawler -from scrapy.conf import settings try: import Image @@ -14,6 +12,10 @@ try: except ImportError, e: skip = True +def _mocked_download_func(request, info): + response = request.meta.get('response') + return response() if callable(response) else response + class ImagesPipelineTestCase(unittest.TestCase): @@ -21,14 +23,10 @@ class ImagesPipelineTestCase(unittest.TestCase): def setUp(self): from scrapy.contrib.pipeline.images import ImagesPipeline - - self.crawler = Crawler(settings) - self.crawler.install() self.tempdir = mkdtemp() - self.pipeline = ImagesPipeline(self.tempdir) + self.pipeline = ImagesPipeline(self.tempdir, download_func=_mocked_download_func) def tearDown(self): - self.crawler.uninstall() rmtree(self.tempdir) def test_image_path(self): diff --git a/scrapy/tests/test_pipeline_media.py b/scrapy/tests/test_pipeline_media.py index 64b506820..569dc2d5b 100644 --- a/scrapy/tests/test_pipeline_media.py +++ b/scrapy/tests/test_pipeline_media.py @@ -9,6 +9,8 @@ from scrapy.spider import BaseSpider from scrapy.utils.request import request_fingerprint from scrapy.contrib.pipeline.media import MediaPipeline from scrapy.utils.test import get_crawler +from scrapy.utils.signal import disconnect_all +from scrapy import signals from scrapy import log @@ -28,6 +30,9 @@ class BaseMediaPipelineTestCase(unittest.TestCase): self.info = self.pipe.spiderinfo[self.spider] def tearDown(self): + for name, signal in vars(signals).items(): + if not name.startswith('_'): + disconnect_all(signal) self.pipe.close_spider(self.spider) def test_default_media_to_download(self): From 7640e99979b188b9e1ffa83fd777b232e4adcaa9 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Mon, 25 Oct 2010 13:16:11 -0200 Subject: [PATCH 32/67] test media_to_download mediapipeline hook. ref #269 --- scrapy/tests/test_pipeline_media.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/scrapy/tests/test_pipeline_media.py b/scrapy/tests/test_pipeline_media.py index 569dc2d5b..fc96950ce 100644 --- a/scrapy/tests/test_pipeline_media.py +++ b/scrapy/tests/test_pipeline_media.py @@ -111,6 +111,8 @@ class MockedMediaPipeline(MediaPipeline): def media_to_download(self, request, info): self._mockcalled.append('media_to_download') + if 'result' in request.meta: + return request.meta.get('result') return super(MockedMediaPipeline, self).media_to_download(request, info) def get_media_requests(self, item, info): @@ -235,10 +237,10 @@ class MediaPipelineTestCase(BaseMediaPipelineTestCase): def test_wait_if_request_is_downloading(self): def _check_downloading(response): fp = request_fingerprint(req1) - assert fp in self.info.downloading, self.info.downloading - assert fp in self.info.waiting, self.info.waiting - assert len(self.info.waiting[fp]) == 2, self.info.waiting - assert fp not in self.info.downloaded, self.info.downloaded + self.assertTrue(fp in self.info.downloading) + self.assertTrue(fp in self.info.waiting) + self.assertTrue(fp not in self.info.downloaded) + self.assertEqual(len(self.info.waiting[fp]), 2) return response rsp1 = Response('url') @@ -248,10 +250,19 @@ class MediaPipelineTestCase(BaseMediaPipelineTestCase): return dfd def rsp2_func(): - assert False, 'This can not be called' + self.fail('it must cache rsp1 result and must not try to redownload') req1 = Request('url', meta=dict(response=rsp1_func)) req2 = Request(req1.url, meta=dict(response=rsp2_func)) item = dict(requests=[req1, req2]) new_item = yield self.pipe.process_item(item, self.spider) self.assertEqual(new_item['results'], [(True, rsp1), (True, rsp1)]) + + @inlineCallbacks + def test_use_media_to_download_result(self): + req = Request('url', meta=dict(result='ITSME', response=self.fail)) + item = dict(requests=req) + new_item = yield self.pipe.process_item(item, self.spider) + self.assertEqual(new_item['results'], [(True, 'ITSME')]) + self.assertEqual(self.pipe._mockcalled, \ + ['get_media_requests', 'media_to_download', 'item_completed']) From a59bfb539d5fb08a1a27a4bd63a753b571eaf40e Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 25 Oct 2010 14:47:10 -0200 Subject: [PATCH 33/67] * Added lxml backend for XPath selectors. Closes #147 * Added new setting (SELECTORS_BACKEND) to choose which backend to use * Deprecated the extract_unquoted() function from selectors * Made libxml2 optional by adding a dummy selector backend. Closes #260 --HG-- rename : scrapy/tests/test_selector.py => scrapy/tests/test_selector_libxml2.py --- docs/topics/selectors.rst | 8 - scrapy/contrib/memdebug.py | 12 +- scrapy/selector/__init__.py | 171 ++---------- scrapy/selector/dummysel.py | 28 ++ scrapy/selector/libxml2sel.py | 151 ++++++++++ scrapy/selector/lxmlsel.py | 114 ++++++++ scrapy/settings/default_settings.py | 2 + scrapy/tests/test_libxml2.py | 20 ++ ...t_selector.py => test_selector_libxml2.py} | 13 - scrapy/tests/test_selector_lxml.py | 258 ++++++++++++++++++ scrapy/tests/test_utils_iterators.py | 1 - scrapy/utils/test.py | 5 +- 12 files changed, 609 insertions(+), 174 deletions(-) create mode 100644 scrapy/selector/dummysel.py create mode 100644 scrapy/selector/libxml2sel.py create mode 100644 scrapy/selector/lxmlsel.py create mode 100644 scrapy/tests/test_libxml2.py rename scrapy/tests/{test_selector.py => test_selector_libxml2.py} (96%) create mode 100644 scrapy/tests/test_selector_lxml.py diff --git a/docs/topics/selectors.rst b/docs/topics/selectors.rst index cd3796296..9e9e47de9 100644 --- a/docs/topics/selectors.rst +++ b/docs/topics/selectors.rst @@ -255,14 +255,6 @@ XPathSelector objects Return a unicode string with the content of this :class:`XPathSelector` object. - .. method:: extract_unquoted() - - Return a unicode string with the content of this :class:`XPathSelector` - without entities or CDATA. This method is intended to be use for text-only - selectors, like ``//h1/text()`` (but not ``//h1``). If it's used for - :class:`XPathSelector` objects which don't select a textual content (ie. if - they contain tags), the output of this method is undefined. - .. method:: register_namespace(prefix, uri) Register the given namespace to be used in this :class:`XPathSelector`. diff --git a/scrapy/contrib/memdebug.py b/scrapy/contrib/memdebug.py index abc05cc4a..f2917e506 100644 --- a/scrapy/contrib/memdebug.py +++ b/scrapy/contrib/memdebug.py @@ -7,7 +7,6 @@ See documentation in docs/topics/extensions.rst import gc import socket -import libxml2 from scrapy.xlib.pydispatch import dispatcher from scrapy import signals @@ -19,6 +18,11 @@ from scrapy import log class MemoryDebugger(object): def __init__(self): + try: + import libxml2 + self.libxml2 = libxml2 + except ImportError: + raise NotConfigured if not settings.getbool('MEMDEBUG_ENABLED'): raise NotConfigured @@ -29,7 +33,7 @@ class MemoryDebugger(object): dispatcher.connect(self.engine_stopped, signals.engine_stopped) def engine_started(self): - libxml2.debugMemory(1) + self.libxml2.debugMemory(1) def engine_stopped(self): figures = self.collect_figures() @@ -37,12 +41,12 @@ class MemoryDebugger(object): self.log_or_send_report(report) def collect_figures(self): - libxml2.cleanupParser() + self.libxml2.cleanupParser() gc.collect() figures = [] figures.append(("Objects in gc.garbage", len(gc.garbage), "")) - figures.append(("libxml2 memory leak", libxml2.debugMemory(1), "bytes")) + figures.append(("libxml2 memory leak", self.libxml2.debugMemory(1), "bytes")) return figures def create_report(self, figures): diff --git a/scrapy/selector/__init__.py b/scrapy/selector/__init__.py index bf2dc52c7..d84c01f9f 100644 --- a/scrapy/selector/__init__.py +++ b/scrapy/selector/__init__.py @@ -1,153 +1,30 @@ """ -XPath selectors +XPath selectors -See documentation in docs/topics/selectors.rst +Two backends are currently available: libxml2 and lxml + +To select the backend explicitly use the SELECTORS_BACKEND variable in your +project. Otherwise, libxml2 will be tried first. If libxml2 is not available, +lxml will be used. """ -import libxml2 +from scrapy.conf import settings -from scrapy.http import TextResponse -from scrapy.utils.python import flatten, unicode_to_str -from scrapy.utils.misc import extract_regex -from scrapy.utils.trackref import object_ref -from scrapy.utils.decorator import deprecated -from .factories import xmlDoc_from_html, xmlDoc_from_xml -from .document import Libxml2Document - -__all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ - 'XPathSelectorList'] - -class XPathSelector(object_ref): - - __slots__ = ['doc', 'xmlNode', 'expr', '__weakref__'] - - def __init__(self, response=None, text=None, node=None, parent=None, expr=None): - if parent: - self.doc = parent.doc - self.xmlNode = node - elif response: - self.doc = Libxml2Document(response, factory=self._get_libxml2_doc) - self.xmlNode = self.doc.xmlDoc - elif text: - response = TextResponse(url='about:blank', \ - body=unicode_to_str(text, 'utf-8'), encoding='utf-8') - self.doc = Libxml2Document(response, factory=self._get_libxml2_doc) - self.xmlNode = self.doc.xmlDoc - self.expr = expr - - def select(self, xpath): - """Perform the given XPath query on the current XPathSelector and - return a XPathSelectorList of the result""" - if hasattr(self.xmlNode, 'xpathEval'): - self.doc.xpathContext.setContextNode(self.xmlNode) - try: - xpath_result = self.doc.xpathContext.xpathEval(xpath) - except libxml2.xpathError: - raise ValueError("Invalid XPath: %s" % xpath) - if hasattr(xpath_result, '__iter__'): - return XPathSelectorList([self.__class__(node=node, parent=self, \ - expr=xpath) for node in xpath_result]) - else: - return XPathSelectorList([self.__class__(node=xpath_result, \ - parent=self, expr=xpath)]) +if settings['SELECTORS_BACKEND'] == 'lxml': + from .lxmlsel import * +elif settings['SELECTORS_BACKEND'] == 'libxml2': + from .libxml2sel import * +elif settings['SELECTORS_BACKEND'] == 'dummy': + from .dummysel import * +else: + try: + import libxml2 + except ImportError: + try: + import lxml + except ImportError: + from .dummysel import * else: - return XPathSelectorList([]) - - def re(self, regex): - """Return a list of unicode strings by applying the regex over all - current XPath selections, and flattening the results""" - return extract_regex(regex, self.extract(), 'utf-8') - - def extract(self): - """Return a unicode string of the content referenced by the XPathSelector""" - if isinstance(self.xmlNode, basestring): - text = unicode(self.xmlNode, 'utf-8', errors='ignore') - elif hasattr(self.xmlNode, 'serialize'): - if isinstance(self.xmlNode, libxml2.xmlDoc): - data = self.xmlNode.getRootElement().serialize('utf-8') - text = unicode(data, 'utf-8', errors='ignore') if data else u'' - elif isinstance(self.xmlNode, libxml2.xmlAttr): - # serialization doesn't work sometimes for xmlAttr types - text = unicode(self.xmlNode.content, 'utf-8', errors='ignore') - else: - data = self.xmlNode.serialize('utf-8') - text = unicode(data, 'utf-8', errors='ignore') if data else u'' - else: - try: - text = unicode(self.xmlNode, 'utf-8', errors='ignore') - except TypeError: # catched when self.xmlNode is a float - see tests - text = unicode(self.xmlNode) - return text - - def extract_unquoted(self): - """Get unescaped contents from the text node (no entities, no CDATA)""" - if self.select('self::text()'): - return unicode(self.xmlNode.getContent(), 'utf-8', errors='ignore') - else: - return u'' - - def register_namespace(self, prefix, uri): - """Register namespace so that it can be used in XPath queries""" - self.doc.xpathContext.xpathRegisterNs(prefix, uri) - - def _get_libxml2_doc(self, response): - """Return libxml2 document (xmlDoc) from response""" - return xmlDoc_from_html(response) - - def __nonzero__(self): - return bool(self.extract()) - - def __str__(self): - return "<%s (%s) xpath=%s>" % (type(self).__name__, getattr(self.xmlNode, \ - 'name', type(self.xmlNode).__name__), self.expr) - - __repr__ = __str__ - - @deprecated(use_instead='XPathSelector.select') - def __call__(self, xpath): - return self.select(xpath) - - @deprecated(use_instead='XPathSelector.select') - def x(self, xpath): - return self.select(xpath) - - -class XPathSelectorList(list): - """List of XPathSelector objects""" - - def __getslice__(self, i, j): - return XPathSelectorList(list.__getslice__(self, i, j)) - - def select(self, xpath): - """Perform the given XPath query on each XPathSelector of the list and - return a new (flattened) XPathSelectorList of the results""" - return XPathSelectorList(flatten([x.select(xpath) for x in self])) - - def re(self, regex): - """Perform the re() method on each XPathSelector of the list, and - return the result as a flattened list of unicode strings""" - return flatten([x.re(regex) for x in self]) - - def extract(self): - """Return a list of unicode strings with the content referenced by each - XPathSelector of the list""" - return [x.extract() if isinstance(x, XPathSelector) else x for x in self] - - def extract_unquoted(self): - return [x.extract_unquoted() if isinstance(x, XPathSelector) else x for x in self] - - @deprecated(use_instead='XPathSelectorList.select') - def x(self, xpath): - return self.select(xpath) - - -class XmlXPathSelector(XPathSelector): - """XPathSelector for XML content""" - __slots__ = () - _get_libxml2_doc = staticmethod(xmlDoc_from_xml) - - -class HtmlXPathSelector(XPathSelector): - """XPathSelector for HTML content""" - __slots__ = () - _get_libxml2_doc = staticmethod(xmlDoc_from_html) + from .lxmlsel import * + else: + from .libxml2sel import * diff --git a/scrapy/selector/dummysel.py b/scrapy/selector/dummysel.py new file mode 100644 index 000000000..7930835b6 --- /dev/null +++ b/scrapy/selector/dummysel.py @@ -0,0 +1,28 @@ +""" +Dummy selectors +""" + +__all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ + 'XPathSelectorList'] + +class XPathSelector(object): + + def __init__(self, *a, **kw): + pass + + def _raise(self, *a, **kw): + raise RuntimeError("No selectors backend available. " \ + "Please install libxml2 or lxml") + + select = re = exract = register_namespace = __nonzero__ = _raise + +class XPathSelectorList(list): + + def _raise(self, *a, **kw): + raise RuntimeError("No selectors backend available. " \ + "Please install libxml2 or lxml") + + __getslice__ = select = re = extract = extract_unquoted = _raise + +XmlXPathSelector = XPathSelector +HtmlXPathSelector = XPathSelector diff --git a/scrapy/selector/libxml2sel.py b/scrapy/selector/libxml2sel.py new file mode 100644 index 000000000..f5fec4f93 --- /dev/null +++ b/scrapy/selector/libxml2sel.py @@ -0,0 +1,151 @@ +""" +XPath selectors based on libxml2 +""" + +import libxml2 + +from scrapy.http import TextResponse +from scrapy.utils.python import flatten, unicode_to_str +from scrapy.utils.misc import extract_regex +from scrapy.utils.trackref import object_ref +from scrapy.utils.decorator import deprecated +from .factories import xmlDoc_from_html, xmlDoc_from_xml +from .document import Libxml2Document + +__all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ + 'XPathSelectorList'] + +class XPathSelector(object_ref): + + __slots__ = ['doc', 'xmlNode', 'expr', '__weakref__'] + + def __init__(self, response=None, text=None, node=None, parent=None, expr=None): + if parent: + self.doc = parent.doc + self.xmlNode = node + elif response: + self.doc = Libxml2Document(response, factory=self._get_libxml2_doc) + self.xmlNode = self.doc.xmlDoc + elif text: + response = TextResponse(url='about:blank', \ + body=unicode_to_str(text, 'utf-8'), encoding='utf-8') + self.doc = Libxml2Document(response, factory=self._get_libxml2_doc) + self.xmlNode = self.doc.xmlDoc + self.expr = expr + + def select(self, xpath): + """Perform the given XPath query on the current XPathSelector and + return a XPathSelectorList of the result""" + if hasattr(self.xmlNode, 'xpathEval'): + self.doc.xpathContext.setContextNode(self.xmlNode) + try: + xpath_result = self.doc.xpathContext.xpathEval(xpath) + except libxml2.xpathError: + raise ValueError("Invalid XPath: %s" % xpath) + if hasattr(xpath_result, '__iter__'): + return XPathSelectorList([self.__class__(node=node, parent=self, \ + expr=xpath) for node in xpath_result]) + else: + return XPathSelectorList([self.__class__(node=xpath_result, \ + parent=self, expr=xpath)]) + else: + return XPathSelectorList([]) + + def re(self, regex): + """Return a list of unicode strings by applying the regex over all + current XPath selections, and flattening the results""" + return extract_regex(regex, self.extract(), 'utf-8') + + def extract(self): + """Return a unicode string of the content referenced by the XPathSelector""" + if isinstance(self.xmlNode, basestring): + text = unicode(self.xmlNode, 'utf-8', errors='ignore') + elif hasattr(self.xmlNode, 'serialize'): + if isinstance(self.xmlNode, libxml2.xmlDoc): + data = self.xmlNode.getRootElement().serialize('utf-8') + text = unicode(data, 'utf-8', errors='ignore') if data else u'' + elif isinstance(self.xmlNode, libxml2.xmlAttr): + # serialization doesn't work sometimes for xmlAttr types + text = unicode(self.xmlNode.content, 'utf-8', errors='ignore') + else: + data = self.xmlNode.serialize('utf-8') + text = unicode(data, 'utf-8', errors='ignore') if data else u'' + else: + try: + text = unicode(self.xmlNode, 'utf-8', errors='ignore') + except TypeError: # catched when self.xmlNode is a float - see tests + text = unicode(self.xmlNode) + return text + + def extract_unquoted(self): + """Get unescaped contents from the text node (no entities, no CDATA)""" + if self.select('self::text()'): + return unicode(self.xmlNode.getContent(), 'utf-8', errors='ignore') + else: + return u'' + + def register_namespace(self, prefix, uri): + """Register namespace so that it can be used in XPath queries""" + self.doc.xpathContext.xpathRegisterNs(prefix, uri) + + def _get_libxml2_doc(self, response): + """Return libxml2 document (xmlDoc) from response""" + return xmlDoc_from_html(response) + + def __nonzero__(self): + return bool(self.extract()) + + def __str__(self): + return "<%s (%s) xpath=%s>" % (type(self).__name__, getattr(self.xmlNode, \ + 'name', type(self.xmlNode).__name__), self.expr) + + __repr__ = __str__ + + @deprecated(use_instead='XPathSelector.select') + def __call__(self, xpath): + return self.select(xpath) + + @deprecated(use_instead='XPathSelector.select') + def x(self, xpath): + return self.select(xpath) + + +class XPathSelectorList(list): + """List of XPathSelector objects""" + + def __getslice__(self, i, j): + return XPathSelectorList(list.__getslice__(self, i, j)) + + def select(self, xpath): + """Perform the given XPath query on each XPathSelector of the list and + return a new (flattened) XPathSelectorList of the results""" + return XPathSelectorList(flatten([x.select(xpath) for x in self])) + + def re(self, regex): + """Perform the re() method on each XPathSelector of the list, and + return the result as a flattened list of unicode strings""" + return flatten([x.re(regex) for x in self]) + + def extract(self): + """Return a list of unicode strings with the content referenced by each + XPathSelector of the list""" + return [x.extract() if isinstance(x, XPathSelector) else x for x in self] + + def extract_unquoted(self): + return [x.extract_unquoted() if isinstance(x, XPathSelector) else x for x in self] + + @deprecated(use_instead='XPathSelectorList.select') + def x(self, xpath): + return self.select(xpath) + + +class XmlXPathSelector(XPathSelector): + """XPathSelector for XML content""" + __slots__ = () + _get_libxml2_doc = staticmethod(xmlDoc_from_xml) + + +class HtmlXPathSelector(XPathSelector): + """XPathSelector for HTML content""" + __slots__ = () + _get_libxml2_doc = staticmethod(xmlDoc_from_html) diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py new file mode 100644 index 000000000..a313fad4e --- /dev/null +++ b/scrapy/selector/lxmlsel.py @@ -0,0 +1,114 @@ +""" +XPath selectors based on lxml +""" + +from lxml import etree + +from scrapy.utils.python import flatten +from scrapy.utils.misc import extract_regex +from scrapy.utils.trackref import object_ref +from scrapy.utils.python import unicode_to_str +from scrapy.utils.decorator import deprecated +from scrapy.http import TextResponse + +__all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ + 'XPathSelectorList'] + +class XPathSelector(object_ref): + + __slots__ = ['response', 'text', 'expr', 'namespaces', '_root', '__weakref__'] + _parser = etree.HTMLParser + _tostring_method = 'html' + + def __init__(self, response=None, text=None, root=None, expr=None, namespaces=None): + if text: + self.response = TextResponse(url='about:blank', \ + body=unicode_to_str(text, 'utf-8'), encoding='utf-8') + else: + self.response = response + self._root = root + self.namespaces = namespaces + self.expr = expr + + @property + def root(self): + if self._root is None: + parser = self._parser(encoding=self.response.encoding, recover=True) + self._root = etree.fromstring(self.response.body, parser=parser, \ + base_url=self.response.url) + return self._root + + def select(self, xpath): + xpatheval = etree.XPathEvaluator(self.root, namespaces=self.namespaces) + try: + result = xpatheval(xpath) + except etree.XPathError: + raise ValueError("Invalid XPath: %s" % xpath) + if hasattr(result, '__iter__'): + result = [self.__class__(root=x, expr=xpath, namespaces=self.namespaces) \ + for x in result] + elif result: + result = [self.__class__(root=result, expr=xpath, namespaces=self.namespaces)] + return XPathSelectorList(result) + + def re(self, regex): + return extract_regex(regex, self.extract(), 'utf-8') + + def extract(self): + try: + return etree.tostring(self.root, method=self._tostring_method, \ + encoding=unicode).strip() + except (AttributeError, TypeError): + return unicode(self.root).strip() + + def register_namespace(self, prefix, uri): + if self.namespaces is None: + self.namespaces = {} + self.namespaces[prefix] = uri + + def __nonzero__(self): + return bool(self.extract()) + + def __str__(self): + data = repr(self.extract()[:40]) + return "<%s xpath=%r data=%s>" % (type(self).__name__, self.expr, data) + + __repr__ = __str__ + + + @deprecated(use_instead='XPathSelector.extract') + def extract_unquoted(self): + return self.extract() + + +class XPathSelectorList(list): + + def __getslice__(self, i, j): + return XPathSelectorList(list.__getslice__(self, i, j)) + + def select(self, xpath): + return XPathSelectorList(flatten([x.select(xpath) for x in self])) + + def re(self, regex): + return flatten([x.re(regex) for x in self]) + + def extract(self): + return [x.extract() if isinstance(x, XPathSelector) else x for x in self] + + @deprecated(use_instead='XPathSelectorList.extract_unquoted') + def extract_unquoted(self): + return [x.extract_unquoted() if isinstance(x, XPathSelector) else x for x in self] + + +class XmlXPathSelector(XPathSelector): + """XPathSelector for XML content""" + __slots__ = () + _parser = etree.XMLParser + _tostring_method = 'xml' + + +class HtmlXPathSelector(XPathSelector): + """XPathSelector for HTML content""" + __slots__ = () + _parser = etree.HTMLParser + _tostring_method = 'html' diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index 0b6703189..c48bc0fe6 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -212,6 +212,8 @@ SCHEDULER_MIDDLEWARES_BASE = { SCHEDULER_ORDER = 'DFO' +SELECTORS_BACKEND = None # possible values: libxml2, lxml + SPIDER_MANAGER_CLASS = 'scrapy.spidermanager.SpiderManager' SPIDER_MIDDLEWARES = {} diff --git a/scrapy/tests/test_libxml2.py b/scrapy/tests/test_libxml2.py new file mode 100644 index 000000000..3f3249440 --- /dev/null +++ b/scrapy/tests/test_libxml2.py @@ -0,0 +1,20 @@ +from twisted.trial import unittest + +from scrapy.utils.test import libxml2debug + +class Libxml2Test(unittest.TestCase): + + try: + import libxml2 + except ImportError, e: + skip = str(e) + + @libxml2debug + def test_libxml2_bug_2_6_27(self): + # this test will fail in version 2.6.27 but passes on 2.6.29+ + html = "123" + node = self.libxml2.htmlParseDoc(html, 'utf-8') + result = [str(r) for r in node.xpathEval('//text()')] + self.assertEquals(result, ['1', '2', '3']) + node.freeDoc() + diff --git a/scrapy/tests/test_selector.py b/scrapy/tests/test_selector_libxml2.py similarity index 96% rename from scrapy/tests/test_selector.py rename to scrapy/tests/test_selector_libxml2.py index 8ceb87ed6..b40d0697d 100644 --- a/scrapy/tests/test_selector.py +++ b/scrapy/tests/test_selector_libxml2.py @@ -2,8 +2,6 @@ import re import unittest import weakref -import libxml2 - from scrapy.http import TextResponse, HtmlResponse, XmlResponse from scrapy.selector import XmlXPathSelector, HtmlXPathSelector, \ XPathSelector @@ -284,16 +282,5 @@ class Libxml2DocumentTest(unittest.TestCase): headers={'Content-Type': 'text/plain; charset=utf-8'}, body=self.body_content) Libxml2Document(response) -class Libxml2Test(unittest.TestCase): - - @libxml2debug - def test_libxml2_bug_2_6_27(self): - # this test will fail in version 2.6.27 but passes on 2.6.29+ - html = "123" - node = libxml2.htmlParseDoc(html, 'utf-8') - result = [str(r) for r in node.xpathEval('//text()')] - self.assertEquals(result, ['1', '2', '3']) - node.freeDoc() - if __name__ == "__main__": unittest.main() diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py new file mode 100644 index 000000000..2c977431f --- /dev/null +++ b/scrapy/tests/test_selector_lxml.py @@ -0,0 +1,258 @@ +# TODO: we should merge these tests with test_selector_libxml2.py + +import re +import unittest +import weakref + +from scrapy.http import TextResponse, HtmlResponse, XmlResponse +from scrapy.selector.lxmlsel import XmlXPathSelector, HtmlXPathSelector, \ + XPathSelector +from scrapy.utils.test import libxml2debug + +class XPathSelectorTestCase(unittest.TestCase): + + @libxml2debug + def test_selector_simple(self): + """Simple selector tests""" + body = "

" + response = TextResponse(url="http://example.com", body=body) + xpath = HtmlXPathSelector(response) + + xl = xpath.select('//input') + self.assertEqual(2, len(xl)) + for x in xl: + assert isinstance(x, HtmlXPathSelector) + + self.assertEqual(xpath.select('//input').extract(), + [x.extract() for x in xpath.select('//input')]) + + self.assertEqual([x.extract() for x in xpath.select("//input[@name='a']/@name")], + [u'a']) + self.assertEqual([x.extract() for x in xpath.select("number(concat(//input[@name='a']/@value, //input[@name='b']/@value))")], + [u'12.0']) + + self.assertEqual(xpath.select("concat('xpath', 'rules')").extract(), + [u'xpathrules']) + self.assertEqual([x.extract() for x in xpath.select("concat(//input[@name='a']/@value, //input[@name='b']/@value)")], + [u'12']) + + @libxml2debug + def test_selector_same_type(self): + """Test XPathSelector returning the same type in x() method""" + text = '

test

' + assert isinstance(XmlXPathSelector(text=text).select("//p")[0], + XmlXPathSelector) + assert isinstance(HtmlXPathSelector(text=text).select("//p")[0], + HtmlXPathSelector) + + @libxml2debug + def test_selector_xml_html(self): + """Test that XML and HTML XPathSelector's behave differently""" + + # some text which is parsed differently by XML and HTML flavors + text = '

Hello

' + + self.assertEqual(XmlXPathSelector(text=text).select("//div").extract(), + [u'

Hello

']) + + self.assertEqual(HtmlXPathSelector(text=text).select("//div").extract(), + [u'

Hello

']) + + @libxml2debug + def test_selector_nested(self): + """Nested selector tests""" + body = """ +
+
    +
  • one
  • two
  • +
+
+
+
    +
  • four
  • five
  • six
  • +
+
+ """ + + response = HtmlResponse(url="http://example.com", body=body) + x = HtmlXPathSelector(response) + + divtwo = x.select('//div[@class="two"]') + self.assertEqual(divtwo.select("//li").extract(), + ["
  • one
  • ", "
  • two
  • ", "
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select("./ul/li").extract(), + ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select(".//li").extract(), + ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select("./li").extract(), + []) + + @libxml2debug + def test_selector_re(self): + body = """
    Name: Mary +
      +
    • Name: John
    • +
    • Age: 10
    • +
    • Name: Paul
    • +
    • Age: 20
    • +
    + Age: 20 +
    + + """ + response = HtmlResponse(url="http://example.com", body=body) + x = HtmlXPathSelector(response) + + name_re = re.compile("Name: (\w+)") + self.assertEqual(x.select("//ul/li").re(name_re), + ["John", "Paul"]) + self.assertEqual(x.select("//ul/li").re("Age: (\d+)"), + ["10", "20"]) + + @libxml2debug + def test_selector_over_text(self): + hxs = HtmlXPathSelector(text='lala') + self.assertEqual(hxs.extract(), + u'lala') + + xxs = XmlXPathSelector(text='lala') + self.assertEqual(xxs.extract(), + u'lala') + + xxs = XmlXPathSelector(text='lala') + self.assertEqual(xxs.select('.').extract(), + [u'lala']) + + + @libxml2debug + def test_selector_namespaces_simple(self): + body = """ + + take this + found + + """ + + response = XmlResponse(url="http://example.com", body=body) + x = XmlXPathSelector(response) + + x.register_namespace("somens", "http://scrapy.org") + self.assertEqual(x.select("//somens:a/text()").extract(), + [u'take this']) + + + @libxml2debug + def test_selector_namespaces_multiple(self): + body = """ + + hello + value + iron90Dried Rose + + """ + response = XmlResponse(url="http://example.com", body=body) + x = XmlXPathSelector(response) + + x.register_namespace("xmlns", "http://webservices.amazon.com/AWSECommerceService/2005-10-05") + x.register_namespace("p", "http://www.scrapy.org/product") + x.register_namespace("b", "http://somens.com") + self.assertEqual(len(x.select("//xmlns:TestTag")), 1) + self.assertEqual(x.select("//b:Operation/text()").extract()[0], 'hello') + self.assertEqual(x.select("//xmlns:TestTag/@b:att").extract()[0], 'value') + self.assertEqual(x.select("//p:SecondTestTag/xmlns:price/text()").extract()[0], '90') + self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') + self.assertEqual(x.select("//p:SecondTestTag/xmlns:material/text()").extract()[0], 'iron') + + @libxml2debug + def test_selector_invalid_xpath(self): + response = XmlResponse(url="http://example.com", body="") + x = HtmlXPathSelector(response) + xpath = "//test[@foo='bar]" + try: + x.select(xpath) + except ValueError, e: + assert xpath in str(e), "Exception message does not contain invalid xpath" + except Exception: + raise AssertionError("A invalid XPath does not raise ValueError") + else: + raise AssertionError("A invalid XPath does not raise an exception") + + @libxml2debug + def test_http_header_encoding_precedence(self): + # u'\xa3' = pound symbol in unicode + # u'\xc2\xa3' = pound symbol in utf-8 + # u'\xa3' = pound symbol in latin-1 (iso-8859-1) + + meta = u'' + head = u'' + meta + u'' + body_content = u'\xa3' + body = u'' + body_content + u'' + html = u'' + head + body + u'' + encoding = 'utf-8' + html_utf8 = html.encode(encoding) + + headers = {'Content-Type': ['text/html; charset=utf-8']} + response = HtmlResponse(url="http://example.com", headers=headers, body=html_utf8) + x = HtmlXPathSelector(response) + self.assertEquals(x.select("//span[@id='blank']/text()").extract(), + [u'\xa3']) + + @libxml2debug + def test_null_bytes(self): + hxs = HtmlXPathSelector(text='la\x00la') + self.assertEqual(hxs.extract(), + u'la la') + + xxs = XmlXPathSelector(text='la\x00la') + self.assertEqual(xxs.extract(), + u'la') + + @libxml2debug + def test_unquote(self): + xmldoc = '\n'.join(( + '', + ' lala', + ' ', + ' blabla&moreatestoh', + ' PPPP
    ppp&la]]>', + ' ', + ' pff', + '')) + xxs = XmlXPathSelector(text=xmldoc) + + # this tests were commented out because they make no sense (pablo) + #self.assertEqual(xxs.extract_unquoted(), u'') + #self.assertEqual(xxs.select('/root').extract_unquoted(), [u'']) + #self.assertEqual(xxs.select('//*').extract_unquoted(), [u'', u'', u'']) + + self.assertEqual(xxs.select('/root/text()').extract_unquoted(), [ + u'lala', + u'pff']) + + self.assertEqual(xxs.select('//text()').extract_unquoted(), [ + u'lala', + u'blabla&more', + u'a', + u'test', + u'oh\n lalalal&pppppPPPPppp&la', + u'pff']) + + @libxml2debug + def test_empty_bodies(self): + r1 = TextResponse('http://www.example.com', body='') + hxs = HtmlXPathSelector(r1) # shouldn't raise error + xxs = XmlXPathSelector(r1) # shouldn't raise error + + @libxml2debug + def test_weakref_slots(self): + """Check that classes are using slots and are weak-referenceable""" + for cls in [XPathSelector, HtmlXPathSelector, XmlXPathSelector]: + x = cls() + weakref.ref(x) + assert not hasattr(x, '__dict__'), "%s does not use __slots__" % \ + x.__class__.__name__ + +if __name__ == "__main__": + unittest.main() diff --git a/scrapy/tests/test_utils_iterators.py b/scrapy/tests/test_utils_iterators.py index ffbe27262..0c77ded21 100644 --- a/scrapy/tests/test_utils_iterators.py +++ b/scrapy/tests/test_utils_iterators.py @@ -1,5 +1,4 @@ import os -import libxml2 from twisted.trial import unittest from scrapy.utils.iterators import csviter, xmliter diff --git a/scrapy/utils/test.py b/scrapy/utils/test.py index 597ee909c..87cbc3ab8 100644 --- a/scrapy/utils/test.py +++ b/scrapy/utils/test.py @@ -4,7 +4,6 @@ This module contains some assorted functions used in tests import os -import libxml2 from twisted.trial.unittest import SkipTest from scrapy.crawler import Crawler @@ -19,6 +18,10 @@ def libxml2debug(testfunction): LIBXML2_DEBUGLEAKS is set. """ + try: + import libxml2 + except ImportError: + return testfunction def newfunc(*args, **kwargs): libxml2.debugMemory(1) testfunction(*args, **kwargs) From f7283ad18e7599ddb9094e40be12a7c9464fe194 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 25 Oct 2010 14:56:33 -0200 Subject: [PATCH 34/67] skip lxml selector tests if lxml is not available. refs #147 --- scrapy/tests/test_selector_lxml.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py index 2c977431f..8a079ef1e 100644 --- a/scrapy/tests/test_selector_lxml.py +++ b/scrapy/tests/test_selector_lxml.py @@ -1,16 +1,25 @@ # TODO: we should merge these tests with test_selector_libxml2.py import re -import unittest import weakref +from twisted.trial import unittest + from scrapy.http import TextResponse, HtmlResponse, XmlResponse -from scrapy.selector.lxmlsel import XmlXPathSelector, HtmlXPathSelector, \ - XPathSelector +nolxml = False +try: + from scrapy.selector.lxmlsel import XmlXPathSelector, HtmlXPathSelector, \ + XPathSelector +except ImportError: + nolxml = True + from scrapy.utils.test import libxml2debug class XPathSelectorTestCase(unittest.TestCase): + if nolxml: + skip = "lxml not available" + @libxml2debug def test_selector_simple(self): """Simple selector tests""" From df6357724380993d3931fb014f769c9120f05d57 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 25 Oct 2010 14:57:50 -0200 Subject: [PATCH 35/67] added lxml to setup.py install_requires, if using setuptools. refs #147 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fe185117d..6786d9c49 100644 --- a/setup.py +++ b/setup.py @@ -116,7 +116,7 @@ setup_args = { try: from setuptools import setup - setup_args['install_requires'] = ['Twisted>=2.5'] + setup_args['install_requires'] = ['Twisted>=2.5', 'lxml'] except ImportError: from distutils.core import setup From 41a85f9d14d3637dbd45214755c5612f096552b6 Mon Sep 17 00:00:00 2001 From: Martin Olveyra Date: Tue, 26 Oct 2010 16:11:04 -0200 Subject: [PATCH 36/67] Added support for variants when applied to tag attributes. fixed handling of variants with single attribute. Removed unneeded object attribute surrounds_variant. Added new tests cases for fixes. --- scrapy/contrib/ibl/extraction/pageobjects.py | 5 +- scrapy/contrib/ibl/extraction/pageparsing.py | 21 +-- .../contrib/ibl/extraction/regionextract.py | 5 +- .../tests/test_contrib_ibl/test_extraction.py | 144 ++++++++++++++++++ .../test_contrib_ibl/test_pageparsing.py | 50 +++++- 5 files changed, 209 insertions(+), 16 deletions(-) diff --git a/scrapy/contrib/ibl/extraction/pageobjects.py b/scrapy/contrib/ibl/extraction/pageobjects.py index 404106674..e73b4e699 100644 --- a/scrapy/contrib/ibl/extraction/pageobjects.py +++ b/scrapy/contrib/ibl/extraction/pageobjects.py @@ -194,18 +194,17 @@ class AnnotationTag(object): """ __slots__ = ('surrounds_attribute', 'start_index', 'end_index', 'tag_attributes', 'annotation_text', 'variant_id', - 'surrounds_variant','match_common_prefix', 'metadata') + 'match_common_prefix', 'metadata') def __init__(self, start_index, end_index, surrounds_attribute=None, annotation_text=None, tag_attributes=None, variant_id=None, - surrounds_variant=None, match_common_prefix=False): + match_common_prefix=False): self.start_index = start_index self.end_index = end_index self.surrounds_attribute = surrounds_attribute self.annotation_text = annotation_text self.tag_attributes = tag_attributes or [] self.variant_id = variant_id - self.surrounds_variant = surrounds_variant self.match_common_prefix = match_common_prefix self.metadata = {} diff --git a/scrapy/contrib/ibl/extraction/pageparsing.py b/scrapy/contrib/ibl/extraction/pageparsing.py index df9b5c184..b672ef502 100644 --- a/scrapy/contrib/ibl/extraction/pageparsing.py +++ b/scrapy/contrib/ibl/extraction/pageparsing.py @@ -201,29 +201,32 @@ class TemplatePageParser(InstanceLearningParser): self.extra_required_attrs.extend(jannotation.pop('required', [])) - variant_id = jannotation.pop('variant', 0) - if variant_id > 0: - self.variant_stack.append(variant_id) - annotation.surrounds_variant = variant_id attribute_annotations = jannotation.pop('annotations', {}).items() for extract_attribute, tag_value in attribute_annotations: if extract_attribute == 'content': annotation.surrounds_attribute = tag_value else: annotation.tag_attributes.append((extract_attribute, tag_value)) - + + variant_id = jannotation.pop('variant', 0) + if variant_id > 0: + if annotation.surrounds_attribute is not None: + self.variant_stack.append(variant_id) + else: + annotation.variant_id = variant_id + annotation.metadata = jannotation if annotation.annotation_text is None: self.next_tag_index += 1 - if self.variant_stack: + if self.variant_stack and annotation.variant_id is None: variant_id = self.variant_stack[-1] if variant_id == '0': variant_id = None annotation.variant_id = variant_id # look for a closing tag if the content is important - if annotation.surrounds_attribute or annotation.surrounds_variant: + if annotation.surrounds_attribute: self.labelled_tag_stacks[html_tag.tag].append(annotation) else: annotation.end_index = annotation.start_index + 1 @@ -272,9 +275,9 @@ class TemplatePageParser(InstanceLearningParser): self.next_tag_index += 1 if len(labelled_tags) == 0: del self.labelled_tag_stacks[html_tag.tag] - if annotation.surrounds_variant and self.variant_stack: + if annotation.variant_id and self.variant_stack: prev = self.variant_stack.pop() - if prev != annotation.surrounds_variant: + if prev != annotation.variant_id: raise ValueError("unbalanced variant annotation tags") def handle_data(self, html_data_fragment): diff --git a/scrapy/contrib/ibl/extraction/regionextract.py b/scrapy/contrib/ibl/extraction/regionextract.py index e84c82cd3..fc5470f5b 100644 --- a/scrapy/contrib/ibl/extraction/regionextract.py +++ b/scrapy/contrib/ibl/extraction/regionextract.py @@ -25,7 +25,7 @@ def build_extraction_tree(template, type_descriptor, trace=True): extractors = BasicTypeExtractor.create(template.annotations, attribute_map) if trace: extractors = TraceExtractor.apply(template, extractors) - for cls in (RepeatedDataExtractor, AdjacentVariantExtractor, RepeatedDataExtractor, + for cls in (AdjacentVariantExtractor, RepeatedDataExtractor, AdjacentVariantExtractor, RepeatedDataExtractor, RecordExtractor): extractors = cls.apply(template, extractors) if trace: @@ -465,9 +465,8 @@ class AdjacentVariantExtractor(RecordExtractor): continue if vid in adjacent_variants: adjacent_variants.remove(vid) - elif len(list(egroup)) > 1: + else: adjacent_variants.add(vid) - new_extractors = [] for variant, group_seq in groupby(extractors, variantf): group_seq = list(group_seq) diff --git a/scrapy/tests/test_contrib_ibl/test_extraction.py b/scrapy/tests/test_contrib_ibl/test_extraction.py index 2c5cbb30a..895e563b7 100644 --- a/scrapy/tests/test_contrib_ibl/test_extraction.py +++ b/scrapy/tests/test_contrib_ibl/test_extraction.py @@ -633,6 +633,121 @@ EXTRACT_PAGE20 = u""" """ +ANNOTATED_PAGE21 = u""" + + +

    + + + + + + + + + + +
    + +

    tables
    + + +""" + +EXTRACT_PAGE21 = u""" + + +

    + + + + + + + + + + +
    + +

    chairs
    + +""" + +ANNOTATED_PAGE22 = u""" + + +

    + + + + + + + + + + +
    +

    product 1

    +$67 + +
    +

    product 2

    +$70 + +
    +

    product 3

    +$73 + +
    +

    product 4

    +$80 + +
    + +

    tables
    + + +""" + +EXTRACT_PAGE22 = u""" + + +

    + + + + + + + + + + +
    +

    product 1

    +$70 + +
    +

    product 2

    +$80 + +
    +

    product 3

    +$90 + +
    +

    product 4

    +$100 + +
    + +

    chairs
    + +""" + + SAMPLE_DESCRIPTOR1 = ItemDescriptor('test', 'product test', [ A('name', "Product name", required=True), A('price', "Product price, including any discounts and tax or vat", @@ -813,6 +928,35 @@ TEST_DATA = [ {'price': ['330'], 'name': ['Queen']}, ]}, ), + ('variants with swatches', [ANNOTATED_PAGE21], EXTRACT_PAGE21, None, + {u'category': [u'chairs'], + u'image_urls': [u'image.jpg'], + u'variants': [ + {'swatches': ['swatch1.jpg']}, + {'swatches': ['swatch2.jpg']}, + {'swatches': ['swatch3.jpg']}, + {'swatches': ['swatch4.jpg']}, + ] + }, + ), + ('variants with swatches complete', [ANNOTATED_PAGE22], EXTRACT_PAGE22, None, + {u'category': [u'chairs'], + u'variants': [ + {u'swatches': [u'swatch1.jpg'], + u'price': [u'$70'], + u'name': [u'product 1']}, + {u'swatches': [u'swatch2.jpg'],\ + u'price': [u'$80'], + u'name': [u'product 2']}, + {u'swatches': [u'swatch3.jpg'], + u'price': [u'$90'], + u'name': [u'product 3']}, + {u'swatches': [u'swatch4.jpg'], + u'price': [u'$100'], + u'name': [u'product 4']} + ], + u'image_urls': [u'image.jpg']}, + ), ] class TestExtraction(TestCase): diff --git a/scrapy/tests/test_contrib_ibl/test_pageparsing.py b/scrapy/tests/test_contrib_ibl/test_pageparsing.py index ae5e1c129..8b88c81d8 100644 --- a/scrapy/tests/test_contrib_ibl/test_pageparsing.py +++ b/scrapy/tests/test_contrib_ibl/test_pageparsing.py @@ -155,6 +155,32 @@ Description """ +LABELLED_PAGE9 = u""" + + +

    product 1

    +$67 +

    product 2

    +$70 +
    tables
    + +""" + +LABELLED_PAGE10 = u""" + + +

    product 1

    +$67 + + +

    product 2

    +$70 + + +
    tables
    + +""" + def _parse_page(parser_class, pagetext): htmlpage = HtmlPage(None, {}, pagetext) parser = parser_class(TokenDict()) @@ -268,7 +294,29 @@ class TestPageParsing(TestCase): """Test parsing of extra required attributes""" p = _parse_page(TemplatePageParser, LABELLED_PAGE8) self.assertEqual(p.extra_required_attrs, ["description"]) - + + def test_variants(self): + """Test parsing of variant annotations""" + annotations = _parse_page(TemplatePageParser, LABELLED_PAGE9).annotations + self.assertEqual(annotations[0].variant_id, None) + self.assertEqual(annotations[1].variant_id, 1) + self.assertEqual(annotations[2].variant_id, 1) + self.assertEqual(annotations[3].variant_id, 2) + self.assertEqual(annotations[4].variant_id, 2) + self.assertEqual(annotations[5].variant_id, None) + + def test_variants_in_attributes(self): + """Test parsing of variant annotations in attributes""" + annotations = _parse_page(TemplatePageParser, LABELLED_PAGE10).annotations + self.assertEqual(annotations[0].variant_id, None) + self.assertEqual(annotations[1].variant_id, 1) + self.assertEqual(annotations[2].variant_id, 1) + self.assertEqual(annotations[3].variant_id, 1) + self.assertEqual(annotations[4].variant_id, 2) + self.assertEqual(annotations[5].variant_id, 2) + self.assertEqual(annotations[6].variant_id, 2) + self.assertEqual(annotations[7].variant_id, None) + def test_site_pages(self): """ Tests from real pages. More reliable and easy to build for more complicated structures From a09dd18bbb3332080d1194679b29b260ad01e5f2 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 26 Oct 2010 16:37:16 -0200 Subject: [PATCH 37/67] use absolute imports for compatibility with python 2.5 --- scrapy/selector/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scrapy/selector/__init__.py b/scrapy/selector/__init__.py index d84c01f9f..392108ea7 100644 --- a/scrapy/selector/__init__.py +++ b/scrapy/selector/__init__.py @@ -11,11 +11,11 @@ lxml will be used. from scrapy.conf import settings if settings['SELECTORS_BACKEND'] == 'lxml': - from .lxmlsel import * + from scrapy.selector.lxmlsel import * elif settings['SELECTORS_BACKEND'] == 'libxml2': - from .libxml2sel import * + from scrapy.selector.libxml2sel import * elif settings['SELECTORS_BACKEND'] == 'dummy': - from .dummysel import * + from scrapy.selector.dummysel import * else: try: import libxml2 @@ -23,8 +23,8 @@ else: try: import lxml except ImportError: - from .dummysel import * + from scrapy.selector.dummysel import * else: - from .lxmlsel import * + from scrapy.selector.lxmlsel import * else: - from .libxml2sel import * + from scrapy.selector.libxml2sel import * From b7c9503d9cd94e6aa1023a41fe86a64526aa134c Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 26 Oct 2010 16:50:34 -0200 Subject: [PATCH 38/67] disable lxml selectors tests which was failing on certain versions of lxml-libxml2 --- scrapy/tests/test_selector_lxml.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py index 8a079ef1e..b16a2e2bf 100644 --- a/scrapy/tests/test_selector_lxml.py +++ b/scrapy/tests/test_selector_lxml.py @@ -208,15 +208,19 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEquals(x.select("//span[@id='blank']/text()").extract(), [u'\xa3']) - @libxml2debug - def test_null_bytes(self): - hxs = HtmlXPathSelector(text='la\x00la') - self.assertEqual(hxs.extract(), - u'la la') - - xxs = XmlXPathSelector(text='la\x00la') - self.assertEqual(xxs.extract(), - u'la') + # XXX: this test was disabled because lxml behaves inconsistently when + # handling null bytes between different 2.2.x versions, but it may be due + # to differences in libxml2 too. it's also unclear what should be the + # proper behaviour (pablo - 26 oct 2010) + #@libxml2debug + #def test_null_bytes(self): + # hxs = HtmlXPathSelector(text='la\x00la') + # self.assertEqual(hxs.extract(), + # u'la') + # + # xxs = XmlXPathSelector(text='la\x00la') + # self.assertEqual(xxs.extract(), + # u'la') @libxml2debug def test_unquote(self): From a3a108dc71188d7f07d2dafc325c69e08d0b2fb3 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 26 Oct 2010 17:21:43 -0200 Subject: [PATCH 39/67] fixed some compatibility issues with python 2.5 in scrapyd --- scrapy/utils/py26.py | 25 +++++++++++++++++++++++++ scrapyd/config.py | 7 +++++-- scrapyd/tests/test_eggutils.py | 7 +++++-- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/scrapy/utils/py26.py b/scrapy/utils/py26.py index c8a9cd7ea..df3952c5c 100644 --- a/scrapy/utils/py26.py +++ b/scrapy/utils/py26.py @@ -6,6 +6,7 @@ in Python 2.5. The Python 2.6 function is used when available. import sys import os import fnmatch +import pkgutil from shutil import copy2, copystat __all__ = ['cpu_count', 'copytree', 'ignore_patterns'] @@ -105,3 +106,27 @@ except ImportError: import simplejson as json except ImportError: import scrapy.xlib.simplejson as json + + +def _get_data(package, resource): + loader = pkgutil.get_loader(package) + if loader is None or not hasattr(loader, 'get_data'): + return None + mod = sys.modules.get(package) or loader.load_module(package) + if mod is None or not hasattr(mod, '__file__'): + return None + + # Modify the resource name to be compatible with the loader.get_data + # signature - an os.path format "filename" starting with the dirname of + # the package's __file__ + parts = resource.split('/') + parts.insert(0, os.path.dirname(mod.__file__)) + resource_name = os.path.join(*parts) + return loader.get_data(resource_name) + +# pkgutil.get_data() not available in python 2.5 +# see http://docs.python.org/release/2.5/lib/module-pkgutil.html +try: + get_data = pkgutil.get_data +except AttributeError: + get_data = _get_data diff --git a/scrapyd/config.py b/scrapyd/config.py index a01296fee..5abbc4ccd 100644 --- a/scrapyd/config.py +++ b/scrapyd/config.py @@ -1,8 +1,11 @@ import glob -import pkgutil from cStringIO import StringIO from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError +from scrapy.utils.py26 import get_data + +__package__ = 'scrapyd' # required for compatibility with python 2.5 + class Config(object): """A ConfigParser wrapper to support defaults when calling instance methods, and also tied to a single section""" @@ -12,7 +15,7 @@ class Config(object): def __init__(self, values=None): if values is None: sources = self._getsources() - default_config = pkgutil.get_data(__package__, 'default_scrapyd.conf') + default_config = get_data(__package__, 'default_scrapyd.conf') self.cp = SafeConfigParser() self.cp.readfp(StringIO(default_config)) self.cp.read(sources) diff --git a/scrapyd/tests/test_eggutils.py b/scrapyd/tests/test_eggutils.py index ec6d00269..88346b091 100644 --- a/scrapyd/tests/test_eggutils.py +++ b/scrapyd/tests/test_eggutils.py @@ -1,11 +1,14 @@ -import pkgutil, unittest +import unittest from cStringIO import StringIO from scrapyd.eggutils import get_spider_list_from_eggfile +from scrapy.utils.py26 import get_data + +__package__ = 'scrapyd.tests' # required for compatibility with python 2.5 class EggUtilsTest(unittest.TestCase): def test_get_spider_list_from_eggfile(self): - eggfile = StringIO(pkgutil.get_data(__package__, 'mybot.egg')) + eggfile = StringIO(get_data(__package__, 'mybot.egg')) spiders = get_spider_list_from_eggfile(eggfile, 'mybot') self.assertEqual(set(spiders), set(['spider1', 'spider2'])) From 1ead888db879fa8861875f59ff204b75ae778821 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Tue, 26 Oct 2010 20:50:41 -0200 Subject: [PATCH 40/67] make trial run doctests --- scrapy/tests/test_contrib_ibl/test_extraction.py | 2 ++ scrapy/tests/test_contrib_ibl/test_extractors.py | 5 +++++ scrapy/tests/test_utils_datatypes.py | 2 ++ scrapy/tests/test_utils_http.py | 1 + scrapy/tests/test_utils_misc/__init__.py | 2 ++ scrapy/tests/test_utils_python.py | 2 ++ scrapy/tests/test_utils_response.py | 2 ++ scrapy/tests/test_utils_template.py | 1 + scrapy/utils/response.py | 4 ++-- 9 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 scrapy/tests/test_contrib_ibl/test_extractors.py create mode 100644 scrapy/tests/test_utils_template.py diff --git a/scrapy/tests/test_contrib_ibl/test_extraction.py b/scrapy/tests/test_contrib_ibl/test_extraction.py index 895e563b7..97027114b 100644 --- a/scrapy/tests/test_contrib_ibl/test_extraction.py +++ b/scrapy/tests/test_contrib_ibl/test_extraction.py @@ -13,6 +13,8 @@ from scrapy.contrib.ibl.extractors import (contains_any_numbers, try: import numpy + __doctests__ = ['scrapy.contrib.ibl.extraction.%s' % x for x in \ + ['regionextract', 'similarity', 'pageobjects']] except ImportError: numpy = None diff --git a/scrapy/tests/test_contrib_ibl/test_extractors.py b/scrapy/tests/test_contrib_ibl/test_extractors.py new file mode 100644 index 000000000..16d8aa342 --- /dev/null +++ b/scrapy/tests/test_contrib_ibl/test_extractors.py @@ -0,0 +1,5 @@ +try: + import numpy + __doctests__ = ['scrapy.contrib.ibl.extractors'] +except ImportError: + pass diff --git a/scrapy/tests/test_utils_datatypes.py b/scrapy/tests/test_utils_datatypes.py index 516bbc6a4..19473971c 100644 --- a/scrapy/tests/test_utils_datatypes.py +++ b/scrapy/tests/test_utils_datatypes.py @@ -3,6 +3,8 @@ import unittest from scrapy.utils.datatypes import PriorityQueue, PriorityStack, CaselessDict +__doctests__ = ['scrapy.utils.datatypes'] + # (ITEM, PRIORITY) INPUT = [(1, -5), (30, -1), (80, -3), (4, 1), (6, 3), (20, 0), (50, -1)] diff --git a/scrapy/tests/test_utils_http.py b/scrapy/tests/test_utils_http.py index d8355bee3..70d59cc99 100644 --- a/scrapy/tests/test_utils_http.py +++ b/scrapy/tests/test_utils_http.py @@ -1,6 +1,7 @@ import unittest from scrapy.utils.http import basic_auth_header +__doctests__ = ['scrapy.utils.http'] class UtilsHttpTestCase(unittest.TestCase): diff --git a/scrapy/tests/test_utils_misc/__init__.py b/scrapy/tests/test_utils_misc/__init__.py index 5c8a1d7d9..e7bb801f0 100644 --- a/scrapy/tests/test_utils_misc/__init__.py +++ b/scrapy/tests/test_utils_misc/__init__.py @@ -5,6 +5,8 @@ from cStringIO import StringIO from scrapy.utils.misc import load_object, arg_to_iter, walk_modules +__doctests__ = ['scrapy.utils.misc'] + class UtilsMiscTestCase(unittest.TestCase): def test_load_object(self): diff --git a/scrapy/tests/test_utils_python.py b/scrapy/tests/test_utils_python.py index 84eebbac1..3c4c9fd6f 100644 --- a/scrapy/tests/test_utils_python.py +++ b/scrapy/tests/test_utils_python.py @@ -6,6 +6,8 @@ from scrapy.utils.python import str_to_unicode, unicode_to_str, \ memoizemethod_noargs, isbinarytext, equal_attributes, \ WeakKeyCache, stringify_dict +__doctests__ = ['scrapy.utils.python'] + class UtilsPythonTestCase(unittest.TestCase): def test_str_to_unicode(self): # converting an utf-8 encoded string to unicode diff --git a/scrapy/tests/test_utils_response.py b/scrapy/tests/test_utils_response.py index 99f1d0ea8..9fa5e77f5 100644 --- a/scrapy/tests/test_utils_response.py +++ b/scrapy/tests/test_utils_response.py @@ -7,6 +7,8 @@ from scrapy.http import Response, TextResponse, HtmlResponse from scrapy.utils.response import body_or_str, get_base_url, get_meta_refresh, \ response_httprepr, get_cached_beautifulsoup, open_in_browser +__doctests__ = ['scrapy.utils.response'] + class ResponseUtilsTest(unittest.TestCase): dummy_response = TextResponse(url='http://example.org/', body='dummy_response') diff --git a/scrapy/tests/test_utils_template.py b/scrapy/tests/test_utils_template.py new file mode 100644 index 000000000..e690a8537 --- /dev/null +++ b/scrapy/tests/test_utils_template.py @@ -0,0 +1 @@ +__doctests__ = ['scrapy.utils.template'] diff --git a/scrapy/utils/response.py b/scrapy/utils/response.py index 0f44a6f5a..7826be6e8 100644 --- a/scrapy/utils/response.py +++ b/scrapy/utils/response.py @@ -72,10 +72,10 @@ def response_status_message(status): """Return status code plus status text descriptive message >>> response_status_message(200) - 200 OK + '200 OK' >>> response_status_message(404) - 404 Not Found + '404 Not Found' """ return '%s %s' % (status, http.responses.get(int(status))) From bd7def8fd46574ac18740e8da9112f9016dd05a4 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 05:51:30 -0200 Subject: [PATCH 41/67] lxml selectors: cache and reuse XPathEvaluator object, for performance. refs #147 --- scrapy/selector/lxmlsel.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py index a313fad4e..e4b4682af 100644 --- a/scrapy/selector/lxmlsel.py +++ b/scrapy/selector/lxmlsel.py @@ -16,7 +16,8 @@ __all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ class XPathSelector(object_ref): - __slots__ = ['response', 'text', 'expr', 'namespaces', '_root', '__weakref__'] + __slots__ = ['response', 'text', 'expr', 'namespaces', '_root', '_xpathev', \ + '__weakref__'] _parser = etree.HTMLParser _tostring_method = 'html' @@ -27,6 +28,7 @@ class XPathSelector(object_ref): else: self.response = response self._root = root + self._xpathev = None self.namespaces = namespaces self.expr = expr @@ -38,10 +40,15 @@ class XPathSelector(object_ref): base_url=self.response.url) return self._root + @property + def xpathev(self): + if self._xpathev is None: + self._xpathev = etree.XPathEvaluator(self.root, namespaces=self.namespaces) + return self._xpathev + def select(self, xpath): - xpatheval = etree.XPathEvaluator(self.root, namespaces=self.namespaces) try: - result = xpatheval(xpath) + result = self.xpathev(xpath) except etree.XPathError: raise ValueError("Invalid XPath: %s" % xpath) if hasattr(result, '__iter__'): From 9c9a655cb4963db673b55891495006206390a025 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 05:53:46 -0200 Subject: [PATCH 42/67] selectors: no need to pass encoding on re() method --- scrapy/selector/libxml2sel.py | 2 +- scrapy/selector/lxmlsel.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scrapy/selector/libxml2sel.py b/scrapy/selector/libxml2sel.py index f5fec4f93..d6ef7ebb1 100644 --- a/scrapy/selector/libxml2sel.py +++ b/scrapy/selector/libxml2sel.py @@ -54,7 +54,7 @@ class XPathSelector(object_ref): def re(self, regex): """Return a list of unicode strings by applying the regex over all current XPath selections, and flattening the results""" - return extract_regex(regex, self.extract(), 'utf-8') + return extract_regex(regex, self.extract()) def extract(self): """Return a unicode string of the content referenced by the XPathSelector""" diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py index e4b4682af..ae7166ccb 100644 --- a/scrapy/selector/lxmlsel.py +++ b/scrapy/selector/lxmlsel.py @@ -59,7 +59,7 @@ class XPathSelector(object_ref): return XPathSelectorList(result) def re(self, regex): - return extract_regex(regex, self.extract(), 'utf-8') + return extract_regex(regex, self.extract()) def extract(self): try: From 17a6adde1f91e08abe898578a7498b01148cfd6a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 06:19:49 -0200 Subject: [PATCH 43/67] some refactoring to selectors code, to reuse more code between lxml and libxml2 backends (refs #147). also added tests for dummy backend --- scrapy/selector/dummysel.py | 12 ++------ scrapy/selector/libxml2sel.py | 46 ++++------------------------- scrapy/selector/list.py | 23 +++++++++++++++ scrapy/selector/lxmlsel.py | 22 +------------- scrapy/tests/test_selector_dummy.py | 17 +++++++++++ 5 files changed, 49 insertions(+), 71 deletions(-) create mode 100644 scrapy/selector/list.py create mode 100644 scrapy/tests/test_selector_dummy.py diff --git a/scrapy/selector/dummysel.py b/scrapy/selector/dummysel.py index 7930835b6..8718f3311 100644 --- a/scrapy/selector/dummysel.py +++ b/scrapy/selector/dummysel.py @@ -2,6 +2,8 @@ Dummy selectors """ +from .list import XPathSelectorList as XPathSelectorList + __all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ 'XPathSelectorList'] @@ -14,15 +16,7 @@ class XPathSelector(object): raise RuntimeError("No selectors backend available. " \ "Please install libxml2 or lxml") - select = re = exract = register_namespace = __nonzero__ = _raise - -class XPathSelectorList(list): - - def _raise(self, *a, **kw): - raise RuntimeError("No selectors backend available. " \ - "Please install libxml2 or lxml") - - __getslice__ = select = re = extract = extract_unquoted = _raise + select = re = extract = register_namespace = __nonzero__ = _raise XmlXPathSelector = XPathSelector HtmlXPathSelector = XPathSelector diff --git a/scrapy/selector/libxml2sel.py b/scrapy/selector/libxml2sel.py index d6ef7ebb1..15ae3c584 100644 --- a/scrapy/selector/libxml2sel.py +++ b/scrapy/selector/libxml2sel.py @@ -5,12 +5,13 @@ XPath selectors based on libxml2 import libxml2 from scrapy.http import TextResponse -from scrapy.utils.python import flatten, unicode_to_str +from scrapy.utils.python import unicode_to_str from scrapy.utils.misc import extract_regex from scrapy.utils.trackref import object_ref from scrapy.utils.decorator import deprecated from .factories import xmlDoc_from_html, xmlDoc_from_xml from .document import Libxml2Document +from .list import XPathSelectorList __all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ 'XPathSelectorList'] @@ -34,8 +35,6 @@ class XPathSelector(object_ref): self.expr = expr def select(self, xpath): - """Perform the given XPath query on the current XPathSelector and - return a XPathSelectorList of the result""" if hasattr(self.xmlNode, 'xpathEval'): self.doc.xpathContext.setContextNode(self.xmlNode) try: @@ -52,12 +51,9 @@ class XPathSelector(object_ref): return XPathSelectorList([]) def re(self, regex): - """Return a list of unicode strings by applying the regex over all - current XPath selections, and flattening the results""" return extract_regex(regex, self.extract()) def extract(self): - """Return a unicode string of the content referenced by the XPathSelector""" if isinstance(self.xmlNode, basestring): text = unicode(self.xmlNode, 'utf-8', errors='ignore') elif hasattr(self.xmlNode, 'serialize'): @@ -79,25 +75,24 @@ class XPathSelector(object_ref): def extract_unquoted(self): """Get unescaped contents from the text node (no entities, no CDATA)""" + # TODO: this function should be deprecated. but what would be use instead? if self.select('self::text()'): return unicode(self.xmlNode.getContent(), 'utf-8', errors='ignore') else: return u'' def register_namespace(self, prefix, uri): - """Register namespace so that it can be used in XPath queries""" self.doc.xpathContext.xpathRegisterNs(prefix, uri) def _get_libxml2_doc(self, response): - """Return libxml2 document (xmlDoc) from response""" return xmlDoc_from_html(response) def __nonzero__(self): return bool(self.extract()) def __str__(self): - return "<%s (%s) xpath=%s>" % (type(self).__name__, getattr(self.xmlNode, \ - 'name', type(self.xmlNode).__name__), self.expr) + data = repr(self.extract()[:40]) + return "<%s xpath=%r data=%s>" % (type(self).__name__, self.expr, data) __repr__ = __str__ @@ -110,42 +105,11 @@ class XPathSelector(object_ref): return self.select(xpath) -class XPathSelectorList(list): - """List of XPathSelector objects""" - - def __getslice__(self, i, j): - return XPathSelectorList(list.__getslice__(self, i, j)) - - def select(self, xpath): - """Perform the given XPath query on each XPathSelector of the list and - return a new (flattened) XPathSelectorList of the results""" - return XPathSelectorList(flatten([x.select(xpath) for x in self])) - - def re(self, regex): - """Perform the re() method on each XPathSelector of the list, and - return the result as a flattened list of unicode strings""" - return flatten([x.re(regex) for x in self]) - - def extract(self): - """Return a list of unicode strings with the content referenced by each - XPathSelector of the list""" - return [x.extract() if isinstance(x, XPathSelector) else x for x in self] - - def extract_unquoted(self): - return [x.extract_unquoted() if isinstance(x, XPathSelector) else x for x in self] - - @deprecated(use_instead='XPathSelectorList.select') - def x(self, xpath): - return self.select(xpath) - - class XmlXPathSelector(XPathSelector): - """XPathSelector for XML content""" __slots__ = () _get_libxml2_doc = staticmethod(xmlDoc_from_xml) class HtmlXPathSelector(XPathSelector): - """XPathSelector for HTML content""" __slots__ = () _get_libxml2_doc = staticmethod(xmlDoc_from_html) diff --git a/scrapy/selector/list.py b/scrapy/selector/list.py new file mode 100644 index 000000000..a6977fd99 --- /dev/null +++ b/scrapy/selector/list.py @@ -0,0 +1,23 @@ +from scrapy.utils.python import flatten +from scrapy.utils.decorator import deprecated + +class XPathSelectorList(list): + + def __getslice__(self, i, j): + return self.__class__(list.__getslice__(self, i, j)) + + def select(self, xpath): + return self.__class__(flatten([x.select(xpath) for x in self])) + + def re(self, regex): + return flatten([x.re(regex) for x in self]) + + def extract(self): + return [x.extract() for x in self] + + def extract_unquoted(self): + return [x.extract_unquoted() for x in self] + + @deprecated(use_instead='XPathSelectorList.select') + def x(self, xpath): + return self.select(xpath) diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py index ae7166ccb..af5f765b4 100644 --- a/scrapy/selector/lxmlsel.py +++ b/scrapy/selector/lxmlsel.py @@ -10,6 +10,7 @@ from scrapy.utils.trackref import object_ref from scrapy.utils.python import unicode_to_str from scrapy.utils.decorator import deprecated from scrapy.http import TextResponse +from .list import XPathSelectorList __all__ = ['HtmlXPathSelector', 'XmlXPathSelector', 'XPathSelector', \ 'XPathSelectorList'] @@ -88,34 +89,13 @@ class XPathSelector(object_ref): return self.extract() -class XPathSelectorList(list): - - def __getslice__(self, i, j): - return XPathSelectorList(list.__getslice__(self, i, j)) - - def select(self, xpath): - return XPathSelectorList(flatten([x.select(xpath) for x in self])) - - def re(self, regex): - return flatten([x.re(regex) for x in self]) - - def extract(self): - return [x.extract() if isinstance(x, XPathSelector) else x for x in self] - - @deprecated(use_instead='XPathSelectorList.extract_unquoted') - def extract_unquoted(self): - return [x.extract_unquoted() if isinstance(x, XPathSelector) else x for x in self] - - class XmlXPathSelector(XPathSelector): - """XPathSelector for XML content""" __slots__ = () _parser = etree.XMLParser _tostring_method = 'xml' class HtmlXPathSelector(XPathSelector): - """XPathSelector for HTML content""" __slots__ = () _parser = etree.HTMLParser _tostring_method = 'html' diff --git a/scrapy/tests/test_selector_dummy.py b/scrapy/tests/test_selector_dummy.py new file mode 100644 index 000000000..00ac0c152 --- /dev/null +++ b/scrapy/tests/test_selector_dummy.py @@ -0,0 +1,17 @@ +import unittest + +from scrapy.http import TextResponse +from scrapy.selector.dummysel import XmlXPathSelector, HtmlXPathSelector, \ + XPathSelector + +class XPathSelectorTestCase(unittest.TestCase): + + def test_raises(self): + response = TextResponse(url="http://example.com", body='test') + for cls in [XmlXPathSelector, HtmlXPathSelector, XPathSelector]: + sel = cls(response) + self.assertRaises(RuntimeError, sel.select, '//h2') + self.assertRaises(RuntimeError, sel.re, 'lala') + self.assertRaises(RuntimeError, sel.extract) + self.assertRaises(RuntimeError, sel.register_namespace, 'a', 'b') + self.assertRaises(RuntimeError, sel.__nonzero__, 'a', 'b') From a8be54a8ea52754702221623342c9a58b71c5523 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 06:49:15 -0200 Subject: [PATCH 44/67] scrapyd: make Environment tests independent of the current OS environment --HG-- rename : scrapyd/tests/test_envion.py => scrapyd/tests/test_environ.py --- scrapyd/environ.py | 5 +++-- scrapyd/tests/{test_envion.py => test_environ.py} | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) rename scrapyd/tests/{test_envion.py => test_environ.py} (96%) diff --git a/scrapyd/environ.py b/scrapyd/environ.py index 0cbf7c30b..211377e38 100644 --- a/scrapyd/environ.py +++ b/scrapyd/environ.py @@ -8,17 +8,18 @@ class Environment(object): implements(IEnvironment) - def __init__(self, config): + def __init__(self, config, initenv=os.environ): self.dbs_dir = config.get('dbs_dir', 'dbs') self.logs_dir = config.get('logs_dir', 'logs') if config.cp.has_section('settings'): self.settings = dict(config.cp.items('settings')) else: self.settings = {} + self.initenv = initenv def get_environment(self, message, slot, eggpath): project = message['project'] - env = os.environ.copy() + env = self.initenv.copy() env['SCRAPY_PROJECT'] = project if eggpath: env['SCRAPY_EGGFILE'] = eggpath diff --git a/scrapyd/tests/test_envion.py b/scrapyd/tests/test_environ.py similarity index 96% rename from scrapyd/tests/test_envion.py rename to scrapyd/tests/test_environ.py index 9f99da3a6..a1a2e2e75 100644 --- a/scrapyd/tests/test_envion.py +++ b/scrapyd/tests/test_environ.py @@ -16,7 +16,7 @@ class EggStorageTest(unittest.TestCase): config = Config(values={'eggs_dir': d, 'logs_dir': d}) config.cp.add_section('settings') config.cp.set('settings', 'newbot', 'newbot.settings') - self.environ = Environment(config) + self.environ = Environment(config, initenv={}) def test_interface(self): verifyObject(IEnvironment, self.environ) From 9b9ab378049afb69edac266ba4236e6773f82cfb Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 08:03:37 -0200 Subject: [PATCH 45/67] fixed bug with boolean results in lxml-based selectors --- scrapy/selector/lxmlsel.py | 2 +- scrapy/tests/test_selector_lxml.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py index af5f765b4..55d1a48e6 100644 --- a/scrapy/selector/lxmlsel.py +++ b/scrapy/selector/lxmlsel.py @@ -55,7 +55,7 @@ class XPathSelector(object_ref): if hasattr(result, '__iter__'): result = [self.__class__(root=x, expr=xpath, namespaces=self.namespaces) \ for x in result] - elif result: + else: result = [self.__class__(root=result, expr=xpath, namespaces=self.namespaces)] return XPathSelectorList(result) diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py index b16a2e2bf..75375a57f 100644 --- a/scrapy/tests/test_selector_lxml.py +++ b/scrapy/tests/test_selector_lxml.py @@ -45,6 +45,14 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEqual([x.extract() for x in xpath.select("concat(//input[@name='a']/@value, //input[@name='b']/@value)")], [u'12']) + @libxml2debug + def test_selector_boolean_result(self): + body = "

    " + response = TextResponse(url="http://example.com", body=body) + xs = HtmlXPathSelector(response) + self.assertEqual(xs.select("//input[@name='a']/@name='a'").extract(), [u'True']) + self.assertEqual(xs.select("//input[@name='a']/@name='n'").extract(), [u'False']) + @libxml2debug def test_selector_same_type(self): """Test XPathSelector returning the same type in x() method""" From 665578bfe8e48b96e34ecc8bea1509d4bb5e6cce Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 08:05:08 -0200 Subject: [PATCH 46/67] fixed imports in scrapy.xlib.simplejson --- scrapy/xlib/simplejson/__init__.py | 2 +- scrapy/xlib/simplejson/decoder.py | 4 ++-- scrapy/xlib/simplejson/encoder.py | 4 ++-- scrapy/xlib/simplejson/scanner.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scrapy/xlib/simplejson/__init__.py b/scrapy/xlib/simplejson/__init__.py index dcfd5413b..9ae5fa698 100644 --- a/scrapy/xlib/simplejson/__init__.py +++ b/scrapy/xlib/simplejson/__init__.py @@ -121,7 +121,7 @@ OrderedDict = _import_OrderedDict() def _import_c_make_encoder(): try: - from simplejson._speedups import make_encoder + from scrapy.xlib.simplejson._speedups import make_encoder return make_encoder except ImportError: return None diff --git a/scrapy/xlib/simplejson/decoder.py b/scrapy/xlib/simplejson/decoder.py index 4cf4015f6..a6ce82f57 100644 --- a/scrapy/xlib/simplejson/decoder.py +++ b/scrapy/xlib/simplejson/decoder.py @@ -4,10 +4,10 @@ import re import sys import struct -from simplejson.scanner import make_scanner +from scrapy.xlib.simplejson.scanner import make_scanner def _import_c_scanstring(): try: - from simplejson._speedups import scanstring + from scrapy.xlib.simplejson._speedups import scanstring return scanstring except ImportError: return None diff --git a/scrapy/xlib/simplejson/encoder.py b/scrapy/xlib/simplejson/encoder.py index cab845653..a3b473a8c 100644 --- a/scrapy/xlib/simplejson/encoder.py +++ b/scrapy/xlib/simplejson/encoder.py @@ -5,13 +5,13 @@ from decimal import Decimal def _import_speedups(): try: - from simplejson import _speedups + from scrapy.xlib.simplejson import _speedups return _speedups.encode_basestring_ascii, _speedups.make_encoder except ImportError: return None, None c_encode_basestring_ascii, c_make_encoder = _import_speedups() -from simplejson.decoder import PosInf +from scrapy.xlib.simplejson.decoder import PosInf ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') diff --git a/scrapy/xlib/simplejson/scanner.py b/scrapy/xlib/simplejson/scanner.py index 54593a371..ac99c2708 100644 --- a/scrapy/xlib/simplejson/scanner.py +++ b/scrapy/xlib/simplejson/scanner.py @@ -3,7 +3,7 @@ import re def _import_c_make_scanner(): try: - from simplejson._speedups import make_scanner + from scrapy.xlib.simplejson._speedups import make_scanner return make_scanner except ImportError: return None From d1f63237adec8ddcdc3f85d6f07fa2c8e772ded3 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 08:37:02 -0200 Subject: [PATCH 47/67] refactored selectors tests, by splitting tests in: common tests, lxml-specific tests and libxml2-specific tests. refs #147 --- scrapy/contrib/linkextractors/image.py | 2 +- scrapy/tests/test_selector.py | 182 ++++++++++++++++++++ scrapy/tests/test_selector_libxml2.py | 174 ++----------------- scrapy/tests/test_selector_lxml.py | 220 ++----------------------- 4 files changed, 206 insertions(+), 372 deletions(-) create mode 100644 scrapy/tests/test_selector.py diff --git a/scrapy/contrib/linkextractors/image.py b/scrapy/contrib/linkextractors/image.py index 88dd78577..1f29a6797 100644 --- a/scrapy/contrib/linkextractors/image.py +++ b/scrapy/contrib/linkextractors/image.py @@ -7,7 +7,7 @@ image links only. from scrapy.link import Link from scrapy.utils.url import canonicalize_url, urljoin_rfc from scrapy.utils.python import unicode_to_str, flatten -from scrapy.selector import XPathSelectorList, HtmlXPathSelector +from scrapy.selector.libxml2sel import XPathSelectorList, HtmlXPathSelector class HTMLImageLinkExtractor(object): '''HTMLImageLinkExtractor objects are intended to extract image links from HTML pages diff --git a/scrapy/tests/test_selector.py b/scrapy/tests/test_selector.py new file mode 100644 index 000000000..9fe3aa6ed --- /dev/null +++ b/scrapy/tests/test_selector.py @@ -0,0 +1,182 @@ +""" +Selectors tests, common for all backends +""" + +import re +import weakref + +from twisted.trial import unittest + +from scrapy.http import TextResponse, HtmlResponse, XmlResponse +from scrapy.selector import XmlXPathSelector, HtmlXPathSelector, \ + XPathSelector +from scrapy.utils.test import libxml2debug + +class XPathSelectorTestCase(unittest.TestCase): + + xs_cls = XPathSelector + hxs_cls = HtmlXPathSelector + xxs_cls = XmlXPathSelector + + @libxml2debug + def test_selector_simple(self): + """Simple selector tests""" + body = "

    " + response = TextResponse(url="http://example.com", body=body) + xpath = self.hxs_cls(response) + + xl = xpath.select('//input') + self.assertEqual(2, len(xl)) + for x in xl: + assert isinstance(x, self.hxs_cls) + + self.assertEqual(xpath.select('//input').extract(), + [x.extract() for x in xpath.select('//input')]) + + self.assertEqual([x.extract() for x in xpath.select("//input[@name='a']/@name")], + [u'a']) + self.assertEqual([x.extract() for x in xpath.select("number(concat(//input[@name='a']/@value, //input[@name='b']/@value))")], + [u'12.0']) + + self.assertEqual(xpath.select("concat('xpath', 'rules')").extract(), + [u'xpathrules']) + self.assertEqual([x.extract() for x in xpath.select("concat(//input[@name='a']/@value, //input[@name='b']/@value)")], + [u'12']) + + @libxml2debug + def test_selector_same_type(self): + """Test XPathSelector returning the same type in x() method""" + text = '

    test

    ' + assert isinstance(self.xxs_cls(text=text).select("//p")[0], + self.xxs_cls) + assert isinstance(self.hxs_cls(text=text).select("//p")[0], + self.hxs_cls) + + @libxml2debug + def test_selector_xml_html(self): + """Test that XML and HTML XPathSelector's behave differently""" + + # some text which is parsed differently by XML and HTML flavors + text = '

    Hello

    ' + + self.assertEqual(self.xxs_cls(text=text).select("//div").extract(), + [u'

    Hello

    ']) + + self.assertEqual(self.hxs_cls(text=text).select("//div").extract(), + [u'

    Hello

    ']) + + @libxml2debug + def test_selector_nested(self): + """Nested selector tests""" + body = """ +
    +
      +
    • one
    • two
    • +
    +
    +
    +
      +
    • four
    • five
    • six
    • +
    +
    + """ + + response = HtmlResponse(url="http://example.com", body=body) + x = self.hxs_cls(response) + + divtwo = x.select('//div[@class="two"]') + self.assertEqual(divtwo.select("//li").extract(), + ["
  • one
  • ", "
  • two
  • ", "
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select("./ul/li").extract(), + ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select(".//li").extract(), + ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) + self.assertEqual(divtwo.select("./li").extract(), + []) + + @libxml2debug + def test_selector_re(self): + body = """
    Name: Mary +
      +
    • Name: John
    • +
    • Age: 10
    • +
    • Name: Paul
    • +
    • Age: 20
    • +
    + Age: 20 +
    + + """ + response = HtmlResponse(url="http://example.com", body=body) + x = self.hxs_cls(response) + + name_re = re.compile("Name: (\w+)") + self.assertEqual(x.select("//ul/li").re(name_re), + ["John", "Paul"]) + self.assertEqual(x.select("//ul/li").re("Age: (\d+)"), + ["10", "20"]) + + @libxml2debug + def test_selector_over_text(self): + hxs = self.hxs_cls(text='lala') + self.assertEqual(hxs.extract(), + u'lala') + + xxs = self.xxs_cls(text='lala') + self.assertEqual(xxs.extract(), + u'lala') + + xxs = self.xxs_cls(text='lala') + self.assertEqual(xxs.select('.').extract(), + [u'lala']) + + + @libxml2debug + def test_selector_invalid_xpath(self): + response = XmlResponse(url="http://example.com", body="") + x = self.hxs_cls(response) + xpath = "//test[@foo='bar]" + try: + x.select(xpath) + except ValueError, e: + assert xpath in str(e), "Exception message does not contain invalid xpath" + except Exception: + raise AssertionError("A invalid XPath does not raise ValueError") + else: + raise AssertionError("A invalid XPath does not raise an exception") + + @libxml2debug + def test_http_header_encoding_precedence(self): + # u'\xa3' = pound symbol in unicode + # u'\xc2\xa3' = pound symbol in utf-8 + # u'\xa3' = pound symbol in latin-1 (iso-8859-1) + + meta = u'' + head = u'' + meta + u'' + body_content = u'\xa3' + body = u'' + body_content + u'' + html = u'' + head + body + u'' + encoding = 'utf-8' + html_utf8 = html.encode(encoding) + + headers = {'Content-Type': ['text/html; charset=utf-8']} + response = HtmlResponse(url="http://example.com", headers=headers, body=html_utf8) + x = self.hxs_cls(response) + self.assertEquals(x.select("//span[@id='blank']/text()").extract(), + [u'\xa3']) + + @libxml2debug + def test_empty_bodies(self): + r1 = TextResponse('http://www.example.com', body='') + self.hxs_cls(r1) # shouldn't raise error + self.xxs_cls(r1) # shouldn't raise error + + @libxml2debug + def test_weakref_slots(self): + """Check that classes are using slots and are weak-referenceable""" + for cls in [self.xs_cls, self.hxs_cls, self.xxs_cls]: + x = cls() + weakref.ref(x) + assert not hasattr(x, '__dict__'), "%s does not use __slots__" % \ + x.__class__.__name__ + diff --git a/scrapy/tests/test_selector_libxml2.py b/scrapy/tests/test_selector_libxml2.py index b40d0697d..e4e6a2f18 100644 --- a/scrapy/tests/test_selector_libxml2.py +++ b/scrapy/tests/test_selector_libxml2.py @@ -1,127 +1,21 @@ -import re +""" +Selectors tests, specific for libxml2 backend +""" + import unittest -import weakref from scrapy.http import TextResponse, HtmlResponse, XmlResponse -from scrapy.selector import XmlXPathSelector, HtmlXPathSelector, \ +from scrapy.selector.libxml2sel import XmlXPathSelector, HtmlXPathSelector, \ XPathSelector from scrapy.selector.document import Libxml2Document from scrapy.utils.test import libxml2debug +from scrapy.tests.test_selector import XPathSelectorTestCase -class XPathSelectorTestCase(unittest.TestCase): - - @libxml2debug - def test_selector_simple(self): - """Simple selector tests""" - body = "

    " - response = TextResponse(url="http://example.com", body=body) - xpath = HtmlXPathSelector(response) - - xl = xpath.select('//input') - self.assertEqual(2, len(xl)) - for x in xl: - assert isinstance(x, HtmlXPathSelector) - - self.assertEqual(xpath.select('//input').extract(), - [x.extract() for x in xpath.select('//input')]) - - self.assertEqual([x.extract() for x in xpath.select("//input[@name='a']/@name")], - [u'a']) - self.assertEqual([x.extract() for x in xpath.select("number(concat(//input[@name='a']/@value, //input[@name='b']/@value))")], - [u'12.0']) - - self.assertEqual(xpath.select("concat('xpath', 'rules')").extract(), - [u'xpathrules']) - self.assertEqual([x.extract() for x in xpath.select("concat(//input[@name='a']/@value, //input[@name='b']/@value)")], - [u'12']) - - @libxml2debug - def test_selector_same_type(self): - """Test XPathSelector returning the same type in x() method""" - text = '

    test

    ' - assert isinstance(XmlXPathSelector(text=text).select("//p")[0], - XmlXPathSelector) - assert isinstance(HtmlXPathSelector(text=text).select("//p")[0], - HtmlXPathSelector) - - @libxml2debug - def test_selector_xml_html(self): - """Test that XML and HTML XPathSelector's behave differently""" - - # some text which is parsed differently by XML and HTML flavors - text = '

    Hello

    ' - - self.assertEqual(XmlXPathSelector(text=text).select("//div").extract(), - [u'

    Hello

    ']) - - self.assertEqual(HtmlXPathSelector(text=text).select("//div").extract(), - [u'

    Hello

    ']) - - @libxml2debug - def test_selector_nested(self): - """Nested selector tests""" - body = """ -
    -
      -
    • one
    • two
    • -
    -
    -
    -
      -
    • four
    • five
    • six
    • -
    -
    - """ - - response = HtmlResponse(url="http://example.com", body=body) - x = HtmlXPathSelector(response) - - divtwo = x.select('//div[@class="two"]') - self.assertEqual(divtwo.select("//li").extract(), - ["
  • one
  • ", "
  • two
  • ", "
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select("./ul/li").extract(), - ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select(".//li").extract(), - ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select("./li").extract(), - []) - - @libxml2debug - def test_selector_re(self): - body = """
    Name: Mary -
      -
    • Name: John
    • -
    • Age: 10
    • -
    • Name: Paul
    • -
    • Age: 20
    • -
    - Age: 20 -
    - - """ - response = HtmlResponse(url="http://example.com", body=body) - x = HtmlXPathSelector(response) - - name_re = re.compile("Name: (\w+)") - self.assertEqual(x.select("//ul/li").re(name_re), - ["John", "Paul"]) - self.assertEqual(x.select("//ul/li").re("Age: (\d+)"), - ["10", "20"]) - - @libxml2debug - def test_selector_over_text(self): - hxs = HtmlXPathSelector(text='lala') - self.assertEqual(hxs.extract(), - u'lala') - - xxs = XmlXPathSelector(text='lala') - self.assertEqual(xxs.extract(), - u'lala') - - xxs = XmlXPathSelector(text='lala') - self.assertEqual(xxs.select('.').extract(), - [u'lala']) +class XPathSelectorTestCase(XPathSelectorTestCase): + xs_cls = XPathSelector + hxs_cls = HtmlXPathSelector + xxs_cls = XmlXPathSelector @libxml2debug def test_selector_namespaces_simple(self): @@ -164,40 +58,6 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') self.assertEqual(x.select("//p:SecondTestTag/xmlns:material").extract()[0], '') - @libxml2debug - def test_selector_invalid_xpath(self): - response = XmlResponse(url="http://example.com", body="") - x = HtmlXPathSelector(response) - xpath = "//test[@foo='bar]" - try: - x.select(xpath) - except ValueError, e: - assert xpath in str(e), "Exception message does not contain invalid xpath" - except Exception: - raise AssertionError("A invalid XPath does not raise ValueError") - else: - raise AssertionError("A invalid XPath does not raise an exception") - - @libxml2debug - def test_http_header_encoding_precedence(self): - # u'\xa3' = pound symbol in unicode - # u'\xc2\xa3' = pound symbol in utf-8 - # u'\xa3' = pound symbol in latin-1 (iso-8859-1) - - meta = u'' - head = u'' + meta + u'' - body_content = u'\xa3' - body = u'' + body_content + u'' - html = u'' + head + body + u'' - encoding = 'utf-8' - html_utf8 = html.encode(encoding) - - headers = {'Content-Type': ['text/html; charset=utf-8']} - response = HtmlResponse(url="http://example.com", headers=headers, body=html_utf8) - x = HtmlXPathSelector(response) - self.assertEquals(x.select("//span[@id='blank']/text()").extract(), - [u'\xa3']) - @libxml2debug def test_null_bytes(self): hxs = HtmlXPathSelector(text='la\x00la') @@ -239,20 +99,6 @@ class XPathSelectorTestCase(unittest.TestCase): u'\n ', u'\n pff\n']) - @libxml2debug - def test_empty_bodies(self): - r1 = TextResponse('http://www.example.com', body='') - hxs = HtmlXPathSelector(r1) # shouldn't raise error - xxs = XmlXPathSelector(r1) # shouldn't raise error - - @libxml2debug - def test_weakref_slots(self): - """Check that classes are using slots and are weak-referenceable""" - for cls in [XPathSelector, HtmlXPathSelector, XmlXPathSelector]: - x = cls() - weakref.ref(x) - assert not hasattr(x, '__dict__'), "%s does not use __slots__" % \ - x.__class__.__name__ class Libxml2DocumentTest(unittest.TestCase): diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py index 75375a57f..9e3bf5cb5 100644 --- a/scrapy/tests/test_selector_lxml.py +++ b/scrapy/tests/test_selector_lxml.py @@ -1,50 +1,26 @@ -# TODO: we should merge these tests with test_selector_libxml2.py +""" +Selectors tests, specific for lxml backend +""" -import re -import weakref - -from twisted.trial import unittest - -from scrapy.http import TextResponse, HtmlResponse, XmlResponse -nolxml = False +from scrapy.http import TextResponse, XmlResponse +has_lxml = True try: from scrapy.selector.lxmlsel import XmlXPathSelector, HtmlXPathSelector, \ XPathSelector except ImportError: - nolxml = True - + has_lxml = False from scrapy.utils.test import libxml2debug +from scrapy.tests.test_selector import XPathSelectorTestCase -class XPathSelectorTestCase(unittest.TestCase): +class XPathSelectorTestCase(XPathSelectorTestCase): - if nolxml: + if has_lxml: + xs_cls = XPathSelector + hxs_cls = HtmlXPathSelector + xxs_cls = XmlXPathSelector + else: skip = "lxml not available" - @libxml2debug - def test_selector_simple(self): - """Simple selector tests""" - body = "

    " - response = TextResponse(url="http://example.com", body=body) - xpath = HtmlXPathSelector(response) - - xl = xpath.select('//input') - self.assertEqual(2, len(xl)) - for x in xl: - assert isinstance(x, HtmlXPathSelector) - - self.assertEqual(xpath.select('//input').extract(), - [x.extract() for x in xpath.select('//input')]) - - self.assertEqual([x.extract() for x in xpath.select("//input[@name='a']/@name")], - [u'a']) - self.assertEqual([x.extract() for x in xpath.select("number(concat(//input[@name='a']/@value, //input[@name='b']/@value))")], - [u'12.0']) - - self.assertEqual(xpath.select("concat('xpath', 'rules')").extract(), - [u'xpathrules']) - self.assertEqual([x.extract() for x in xpath.select("concat(//input[@name='a']/@value, //input[@name='b']/@value)")], - [u'12']) - @libxml2debug def test_selector_boolean_result(self): body = "

    " @@ -53,94 +29,6 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEqual(xs.select("//input[@name='a']/@name='a'").extract(), [u'True']) self.assertEqual(xs.select("//input[@name='a']/@name='n'").extract(), [u'False']) - @libxml2debug - def test_selector_same_type(self): - """Test XPathSelector returning the same type in x() method""" - text = '

    test

    ' - assert isinstance(XmlXPathSelector(text=text).select("//p")[0], - XmlXPathSelector) - assert isinstance(HtmlXPathSelector(text=text).select("//p")[0], - HtmlXPathSelector) - - @libxml2debug - def test_selector_xml_html(self): - """Test that XML and HTML XPathSelector's behave differently""" - - # some text which is parsed differently by XML and HTML flavors - text = '

    Hello

    ' - - self.assertEqual(XmlXPathSelector(text=text).select("//div").extract(), - [u'

    Hello

    ']) - - self.assertEqual(HtmlXPathSelector(text=text).select("//div").extract(), - [u'

    Hello

    ']) - - @libxml2debug - def test_selector_nested(self): - """Nested selector tests""" - body = """ -
    -
      -
    • one
    • two
    • -
    -
    -
    -
      -
    • four
    • five
    • six
    • -
    -
    - """ - - response = HtmlResponse(url="http://example.com", body=body) - x = HtmlXPathSelector(response) - - divtwo = x.select('//div[@class="two"]') - self.assertEqual(divtwo.select("//li").extract(), - ["
  • one
  • ", "
  • two
  • ", "
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select("./ul/li").extract(), - ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select(".//li").extract(), - ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select("./li").extract(), - []) - - @libxml2debug - def test_selector_re(self): - body = """
    Name: Mary -
      -
    • Name: John
    • -
    • Age: 10
    • -
    • Name: Paul
    • -
    • Age: 20
    • -
    - Age: 20 -
    - - """ - response = HtmlResponse(url="http://example.com", body=body) - x = HtmlXPathSelector(response) - - name_re = re.compile("Name: (\w+)") - self.assertEqual(x.select("//ul/li").re(name_re), - ["John", "Paul"]) - self.assertEqual(x.select("//ul/li").re("Age: (\d+)"), - ["10", "20"]) - - @libxml2debug - def test_selector_over_text(self): - hxs = HtmlXPathSelector(text='lala') - self.assertEqual(hxs.extract(), - u'lala') - - xxs = XmlXPathSelector(text='lala') - self.assertEqual(xxs.extract(), - u'lala') - - xxs = XmlXPathSelector(text='lala') - self.assertEqual(xxs.select('.').extract(), - [u'lala']) - - @libxml2debug def test_selector_namespaces_simple(self): body = """ @@ -182,40 +70,6 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') self.assertEqual(x.select("//p:SecondTestTag/xmlns:material/text()").extract()[0], 'iron') - @libxml2debug - def test_selector_invalid_xpath(self): - response = XmlResponse(url="http://example.com", body="") - x = HtmlXPathSelector(response) - xpath = "//test[@foo='bar]" - try: - x.select(xpath) - except ValueError, e: - assert xpath in str(e), "Exception message does not contain invalid xpath" - except Exception: - raise AssertionError("A invalid XPath does not raise ValueError") - else: - raise AssertionError("A invalid XPath does not raise an exception") - - @libxml2debug - def test_http_header_encoding_precedence(self): - # u'\xa3' = pound symbol in unicode - # u'\xc2\xa3' = pound symbol in utf-8 - # u'\xa3' = pound symbol in latin-1 (iso-8859-1) - - meta = u'' - head = u'' + meta + u'' - body_content = u'\xa3' - body = u'' + body_content + u'' - html = u'' + head + body + u'' - encoding = 'utf-8' - html_utf8 = html.encode(encoding) - - headers = {'Content-Type': ['text/html; charset=utf-8']} - response = HtmlResponse(url="http://example.com", headers=headers, body=html_utf8) - x = HtmlXPathSelector(response) - self.assertEquals(x.select("//span[@id='blank']/text()").extract(), - [u'\xa3']) - # XXX: this test was disabled because lxml behaves inconsistently when # handling null bytes between different 2.2.x versions, but it may be due # to differences in libxml2 too. it's also unclear what should be the @@ -229,51 +83,3 @@ class XPathSelectorTestCase(unittest.TestCase): # xxs = XmlXPathSelector(text='la\x00la') # self.assertEqual(xxs.extract(), # u'la') - - @libxml2debug - def test_unquote(self): - xmldoc = '\n'.join(( - '', - ' lala', - ' ', - ' blabla&moreatestoh', - ' PPPPppp&la]]>', - ' ', - ' pff', - '')) - xxs = XmlXPathSelector(text=xmldoc) - - # this tests were commented out because they make no sense (pablo) - #self.assertEqual(xxs.extract_unquoted(), u'') - #self.assertEqual(xxs.select('/root').extract_unquoted(), [u'']) - #self.assertEqual(xxs.select('//*').extract_unquoted(), [u'', u'', u'']) - - self.assertEqual(xxs.select('/root/text()').extract_unquoted(), [ - u'lala', - u'pff']) - - self.assertEqual(xxs.select('//text()').extract_unquoted(), [ - u'lala', - u'blabla&more', - u'a', - u'test', - u'oh\n lalalal&pppppPPPPppp&la', - u'pff']) - - @libxml2debug - def test_empty_bodies(self): - r1 = TextResponse('http://www.example.com', body='') - hxs = HtmlXPathSelector(r1) # shouldn't raise error - xxs = XmlXPathSelector(r1) # shouldn't raise error - - @libxml2debug - def test_weakref_slots(self): - """Check that classes are using slots and are weak-referenceable""" - for cls in [XPathSelector, HtmlXPathSelector, XmlXPathSelector]: - x = cls() - weakref.ref(x) - assert not hasattr(x, '__dict__'), "%s does not use __slots__" % \ - x.__class__.__name__ - -if __name__ == "__main__": - unittest.main() From e625a8d56e765e3ef31971ac331b0e94e9bb003a Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 08:54:32 -0200 Subject: [PATCH 48/67] moved all similar selector tests to common selector tests, to reuse them among all backends --- scrapy/tests/test_selector.py | 52 ++++++++++++++++++++++++++ scrapy/tests/test_selector_libxml2.py | 45 +---------------------- scrapy/tests/test_selector_lxml.py | 53 +-------------------------- 3 files changed, 56 insertions(+), 94 deletions(-) diff --git a/scrapy/tests/test_selector.py b/scrapy/tests/test_selector.py index 9fe3aa6ed..375ef3464 100644 --- a/scrapy/tests/test_selector.py +++ b/scrapy/tests/test_selector.py @@ -52,6 +52,18 @@ class XPathSelectorTestCase(unittest.TestCase): assert isinstance(self.hxs_cls(text=text).select("//p")[0], self.hxs_cls) + @libxml2debug + def test_selector_boolean_result(self): + body = "

    " + response = TextResponse(url="http://example.com", body=body) + xs = self.hxs_cls(response) + true = xs.select("//input[@name='a']/@name='a'").extract()[0] + false = xs.select("//input[@name='a']/@name='n'").extract()[0] + + # the actual result depends on the backend used + assert true in [u'1', u'True'], true + assert false in [u'0', u'False'], false + @libxml2debug def test_selector_xml_html(self): """Test that XML and HTML XPathSelector's behave differently""" @@ -94,6 +106,46 @@ class XPathSelectorTestCase(unittest.TestCase): self.assertEqual(divtwo.select("./li").extract(), []) + @libxml2debug + def test_selector_namespaces_simple(self): + body = """ + + take this + found + + """ + + response = XmlResponse(url="http://example.com", body=body) + x = self.xxs_cls(response) + + x.register_namespace("somens", "http://scrapy.org") + self.assertEqual(x.select("//somens:a/text()").extract(), + [u'take this']) + + @libxml2debug + def test_selector_namespaces_multiple(self): + body = """ + + hello + value + iron90Dried Rose + + """ + response = XmlResponse(url="http://example.com", body=body) + x = self.xxs_cls(response) + + x.register_namespace("xmlns", "http://webservices.amazon.com/AWSECommerceService/2005-10-05") + x.register_namespace("p", "http://www.scrapy.org/product") + x.register_namespace("b", "http://somens.com") + self.assertEqual(len(x.select("//xmlns:TestTag")), 1) + self.assertEqual(x.select("//b:Operation/text()").extract()[0], 'hello') + self.assertEqual(x.select("//xmlns:TestTag/@b:att").extract()[0], 'value') + self.assertEqual(x.select("//p:SecondTestTag/xmlns:price/text()").extract()[0], '90') + self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') + self.assertEqual(x.select("//p:SecondTestTag/xmlns:material/text()").extract()[0], 'iron') + @libxml2debug def test_selector_re(self): body = """
    Name: Mary diff --git a/scrapy/tests/test_selector_libxml2.py b/scrapy/tests/test_selector_libxml2.py index e4e6a2f18..917ddaf96 100644 --- a/scrapy/tests/test_selector_libxml2.py +++ b/scrapy/tests/test_selector_libxml2.py @@ -9,55 +9,14 @@ from scrapy.selector.libxml2sel import XmlXPathSelector, HtmlXPathSelector, \ XPathSelector from scrapy.selector.document import Libxml2Document from scrapy.utils.test import libxml2debug -from scrapy.tests.test_selector import XPathSelectorTestCase +from scrapy.tests import test_selector -class XPathSelectorTestCase(XPathSelectorTestCase): +class Libxml2XPathSelectorTestCase(test_selector.XPathSelectorTestCase): xs_cls = XPathSelector hxs_cls = HtmlXPathSelector xxs_cls = XmlXPathSelector - @libxml2debug - def test_selector_namespaces_simple(self): - body = """ - - - found - - """ - - response = XmlResponse(url="http://example.com", body=body) - x = XmlXPathSelector(response) - - x.register_namespace("somens", "http://scrapy.org") - self.assertEqual(x.select("//somens:a").extract(), - ['']) - - - @libxml2debug - def test_selector_namespaces_multiple(self): - body = """ - - hello - value - 90Dried Rose - - """ - response = XmlResponse(url="http://example.com", body=body) - x = XmlXPathSelector(response) - - x.register_namespace("xmlns", "http://webservices.amazon.com/AWSECommerceService/2005-10-05") - x.register_namespace("p", "http://www.scrapy.org/product") - x.register_namespace("b", "http://somens.com") - self.assertEqual(len(x.select("//xmlns:TestTag")), 1) - self.assertEqual(x.select("//b:Operation/text()").extract()[0], 'hello') - self.assertEqual(x.select("//xmlns:TestTag/@b:att").extract()[0], 'value') - self.assertEqual(x.select("//p:SecondTestTag/xmlns:price/text()").extract()[0], '90') - self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') - self.assertEqual(x.select("//p:SecondTestTag/xmlns:material").extract()[0], '') - @libxml2debug def test_null_bytes(self): hxs = HtmlXPathSelector(text='la\x00la') diff --git a/scrapy/tests/test_selector_lxml.py b/scrapy/tests/test_selector_lxml.py index 9e3bf5cb5..8050a2758 100644 --- a/scrapy/tests/test_selector_lxml.py +++ b/scrapy/tests/test_selector_lxml.py @@ -10,9 +10,9 @@ try: except ImportError: has_lxml = False from scrapy.utils.test import libxml2debug -from scrapy.tests.test_selector import XPathSelectorTestCase +from scrapy.tests import test_selector -class XPathSelectorTestCase(XPathSelectorTestCase): +class LxmlXPathSelectorTestCase(test_selector.XPathSelectorTestCase): if has_lxml: xs_cls = XPathSelector @@ -21,55 +21,6 @@ class XPathSelectorTestCase(XPathSelectorTestCase): else: skip = "lxml not available" - @libxml2debug - def test_selector_boolean_result(self): - body = "

    " - response = TextResponse(url="http://example.com", body=body) - xs = HtmlXPathSelector(response) - self.assertEqual(xs.select("//input[@name='a']/@name='a'").extract(), [u'True']) - self.assertEqual(xs.select("//input[@name='a']/@name='n'").extract(), [u'False']) - - @libxml2debug - def test_selector_namespaces_simple(self): - body = """ - - take this - found - - """ - - response = XmlResponse(url="http://example.com", body=body) - x = XmlXPathSelector(response) - - x.register_namespace("somens", "http://scrapy.org") - self.assertEqual(x.select("//somens:a/text()").extract(), - [u'take this']) - - - @libxml2debug - def test_selector_namespaces_multiple(self): - body = """ - - hello - value - iron90Dried Rose - - """ - response = XmlResponse(url="http://example.com", body=body) - x = XmlXPathSelector(response) - - x.register_namespace("xmlns", "http://webservices.amazon.com/AWSECommerceService/2005-10-05") - x.register_namespace("p", "http://www.scrapy.org/product") - x.register_namespace("b", "http://somens.com") - self.assertEqual(len(x.select("//xmlns:TestTag")), 1) - self.assertEqual(x.select("//b:Operation/text()").extract()[0], 'hello') - self.assertEqual(x.select("//xmlns:TestTag/@b:att").extract()[0], 'value') - self.assertEqual(x.select("//p:SecondTestTag/xmlns:price/text()").extract()[0], '90') - self.assertEqual(x.select("//p:SecondTestTag").select("./xmlns:price/text()")[0].extract(), '90') - self.assertEqual(x.select("//p:SecondTestTag/xmlns:material/text()").extract()[0], 'iron') - # XXX: this test was disabled because lxml behaves inconsistently when # handling null bytes between different 2.2.x versions, but it may be due # to differences in libxml2 too. it's also unclear what should be the From bc2d78406c712187c77e5b9333986529d7ac7a63 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Wed, 27 Oct 2010 12:36:24 -0200 Subject: [PATCH 49/67] MediaPipeline fails to assign crawler.engine.download as download function because crawler is configured after pipelines are loaded --- scrapy/contrib/pipeline/media.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scrapy/contrib/pipeline/media.py b/scrapy/contrib/pipeline/media.py index 2d0cd5053..baaa22fd5 100644 --- a/scrapy/contrib/pipeline/media.py +++ b/scrapy/contrib/pipeline/media.py @@ -20,7 +20,13 @@ class MediaPipeline(object): def __init__(self, download_func=None): self.spiderinfo = {} - self._download_func = download_func or self._default_download_func() + self._cached_download_func = download_func + + @property + def _download_func(self): + if self._cached_download_func is None: + self._cached_download_func = self._default_download_func() + return self._cached_download_func def _default_download_func(self): from scrapy.project import crawler From 7f646541c3f9ca47e66ed3b71f981287dbcf812c Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 21:18:58 -0200 Subject: [PATCH 50/67] added trackref stats to memory debugger report. closes #272 --- scrapy/contrib/memdebug.py | 15 +++++++++++---- scrapy/utils/trackref.py | 18 ++++++++++-------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/scrapy/contrib/memdebug.py b/scrapy/contrib/memdebug.py index f2917e506..2d79d0b80 100644 --- a/scrapy/contrib/memdebug.py +++ b/scrapy/contrib/memdebug.py @@ -4,6 +4,7 @@ MemoryDebugger extension See documentation in docs/topics/extensions.rst """ +import os import gc import socket @@ -12,6 +13,7 @@ from scrapy.xlib.pydispatch import dispatcher from scrapy import signals from scrapy.exceptions import NotConfigured from scrapy.mail import MailSender +from scrapy.utils.trackref import format_live_refs from scrapy.conf import settings from scrapy import log @@ -22,7 +24,7 @@ class MemoryDebugger(object): import libxml2 self.libxml2 = libxml2 except ImportError: - raise NotConfigured + self.libxml2 = None if not settings.getbool('MEMDEBUG_ENABLED'): raise NotConfigured @@ -33,7 +35,8 @@ class MemoryDebugger(object): dispatcher.connect(self.engine_stopped, signals.engine_stopped) def engine_started(self): - self.libxml2.debugMemory(1) + if self.libxml2: + self.libxml2.debugMemory(1) def engine_stopped(self): figures = self.collect_figures() @@ -41,12 +44,13 @@ class MemoryDebugger(object): self.log_or_send_report(report) def collect_figures(self): - self.libxml2.cleanupParser() gc.collect() figures = [] figures.append(("Objects in gc.garbage", len(gc.garbage), "")) - figures.append(("libxml2 memory leak", self.libxml2.debugMemory(1), "bytes")) + if self.libxml2: + self.libxml2.cleanupParser() + figures.append(("libxml2 memory leak", self.libxml2.debugMemory(1), "bytes")) return figures def create_report(self, figures): @@ -54,6 +58,9 @@ class MemoryDebugger(object): s += "SCRAPY MEMORY DEBUGGER RESULTS\n\n" for f in figures: s += "%-30s : %d %s\n" % f + if settings.getbool('TRACK_REFS'): + s += os.linesep + s += format_live_refs() return s def log_or_send_report(self, report): diff --git a/scrapy/utils/trackref.py b/scrapy/utils/trackref.py index 6006c1bbe..e28489ff3 100644 --- a/scrapy/utils/trackref.py +++ b/scrapy/utils/trackref.py @@ -10,7 +10,7 @@ and no performance penalty at all when disabled (as object_ref becomes just an alias to object in that case). """ -import weakref +import weakref, os from collections import defaultdict from time import time from operator import itemgetter @@ -34,12 +34,10 @@ class object_ref(object): if not settings.getbool('TRACK_REFS'): object_ref = object -def print_live_refs(ignore=NoneType): +def format_live_refs(ignore=NoneType): if object_ref is object: - print "The trackref module is disabled. Use TRACK_REFS setting to enable it." - return - print "Live References" - print + return "The trackref module is disabled. Use TRACK_REFS setting to enable it." + s = "Live References" + os.linesep + os.linesep now = time() for cls, wdict in live_refs.iteritems(): if not wdict: @@ -47,8 +45,12 @@ def print_live_refs(ignore=NoneType): if issubclass(cls, ignore): continue oldest = min(wdict.itervalues()) - print "%-30s %6d oldest: %ds ago" % (cls.__name__, len(wdict), \ - now-oldest) + s += "%-30s %6d oldest: %ds ago" % (cls.__name__, len(wdict), \ + now-oldest) + os.linesep + return s + +def print_live_refs(*a, **kw): + print format_live_refs(*a, **kw) def get_oldest(class_name): for cls, wdict in live_refs.iteritems(): From 22283854d49de2a4b01fd114880b486f45c5e3f0 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 27 Oct 2010 21:39:28 -0200 Subject: [PATCH 51/67] avoid stripping trailing spaces on lxml-based selectors. closes #270 --- scrapy/selector/lxmlsel.py | 5 ++--- scrapy/tests/test_selector.py | 12 +++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/scrapy/selector/lxmlsel.py b/scrapy/selector/lxmlsel.py index 55d1a48e6..cc32a81f4 100644 --- a/scrapy/selector/lxmlsel.py +++ b/scrapy/selector/lxmlsel.py @@ -4,7 +4,6 @@ XPath selectors based on lxml from lxml import etree -from scrapy.utils.python import flatten from scrapy.utils.misc import extract_regex from scrapy.utils.trackref import object_ref from scrapy.utils.python import unicode_to_str @@ -65,9 +64,9 @@ class XPathSelector(object_ref): def extract(self): try: return etree.tostring(self.root, method=self._tostring_method, \ - encoding=unicode).strip() + encoding=unicode) except (AttributeError, TypeError): - return unicode(self.root).strip() + return unicode(self.root) def register_namespace(self, prefix, uri): if self.namespaces is None: diff --git a/scrapy/tests/test_selector.py b/scrapy/tests/test_selector.py index 375ef3464..5ee0c6625 100644 --- a/scrapy/tests/test_selector.py +++ b/scrapy/tests/test_selector.py @@ -97,15 +97,21 @@ class XPathSelectorTestCase(unittest.TestCase): x = self.hxs_cls(response) divtwo = x.select('//div[@class="two"]') - self.assertEqual(divtwo.select("//li").extract(), + self.assertEqual(map(unicode.strip, divtwo.select("//li").extract()), ["
  • one
  • ", "
  • two
  • ", "
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select("./ul/li").extract(), + self.assertEqual(map(unicode.strip, divtwo.select("./ul/li").extract()), ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) - self.assertEqual(divtwo.select(".//li").extract(), + self.assertEqual(map(unicode.strip, divtwo.select(".//li").extract()), ["
  • four
  • ", "
  • five
  • ", "
  • six
  • "]) self.assertEqual(divtwo.select("./li").extract(), []) + @libxml2debug + def test_dont_strip(self): + hxs = self.hxs_cls(text='
    fff: zzz
    ') + self.assertEqual(hxs.select("//text()").extract(), + [u'fff: ', u'zzz']) + @libxml2debug def test_selector_namespaces_simple(self): body = """ From 836e40896a904edf7678bb8191368257293ea4bb Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Fri, 29 Oct 2010 02:23:10 -0200 Subject: [PATCH 52/67] minor fixes for python 2.5 compatibility --- scrapy/commands/deploy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index a7cd8c9a9..24084bd89 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -161,10 +161,10 @@ def _add_auth_header(request, target): def _http_post(request): try: f = urllib2.urlopen(request) - _log("Server response (%s):" % f.getcode()) + _log("Server response (%s):" % f.code) print f.read() except urllib2.HTTPError, e: - _log("Deploy failed (%s):" % e.getcode()) + _log("Deploy failed (%s):" % e.code) print e.read() except urllib2.URLError, e: _log("Deploy failed: %s" % e) From 20efdc027355e4e8a880de5af5214e3f10db41fe Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Fri, 29 Oct 2010 16:21:36 -0200 Subject: [PATCH 53/67] added --egg argument to scrapy deploy command, and log message when building the egg --- scrapy/commands/deploy.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index 24084bd89..afbb2bc41 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -59,6 +59,8 @@ class Command(ScrapyCommand): help="list available targets") parser.add_option("-l", "--list-projects", metavar="TARGET", \ help="list available projects on TARGET") + parser.add_option("--egg", metavar="FILE", + help="use the given egg, instead of building it") def run(self, args, opts): try: @@ -79,7 +81,11 @@ class Command(ScrapyCommand): return target, project = _get_target_project(args) version = _get_version(opts) - egg = _build_egg() + if opts.egg: + egg = open(opts.egg, 'rb') + else: + _log("Bulding egg of %s-%s" % (project, version)) + egg = _build_egg() _upload_egg(target, egg, project, version) def _log(message): From f73449fed63698b1607dfbd1f1f5b211b70722ff Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Sat, 30 Oct 2010 16:02:14 -0200 Subject: [PATCH 54/67] removed LxmlItemLoader, as it has been obsoleted by the new lxml selector backend --- scrapy/contrib_exp/loader/__init__.py | 0 scrapy/contrib_exp/loader/lxmlloader.py | 34 ---------- .../test_contrib_exp_loader_lxmlloader.py | 67 ------------------- 3 files changed, 101 deletions(-) delete mode 100644 scrapy/contrib_exp/loader/__init__.py delete mode 100644 scrapy/contrib_exp/loader/lxmlloader.py delete mode 100644 scrapy/tests/test_contrib_exp_loader_lxmlloader.py diff --git a/scrapy/contrib_exp/loader/__init__.py b/scrapy/contrib_exp/loader/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/scrapy/contrib_exp/loader/lxmlloader.py b/scrapy/contrib_exp/loader/lxmlloader.py deleted file mode 100644 index 724e7c43c..000000000 --- a/scrapy/contrib_exp/loader/lxmlloader.py +++ /dev/null @@ -1,34 +0,0 @@ -from lxml import html, etree - -from scrapy.contrib.loader import ItemLoader - - -class LxmlItemLoader(ItemLoader): - - def __init__(self, response, item=None, **context): - self.tree = html.fromstring(response.body_as_unicode()) - context.update(response=response) - super(LxmlItemLoader, self).__init__(item, **context) - - def add_xpath(self, field_name, xpath): - self.add_value(field_name, self._get_xpath(xpath)) - - def replace_xpath(self, field_name, xpath): - self.replace_value(field_name, self._get_xpath(xpath)) - - def _get_xpath(self, xpath): - return self._get_values(self.tree.xpath(xpath)) - - def add_css(self, field_name, css): - self.add_value(field_name, self._get_css(css)) - - def replace_css(self, field_name, css): - self.replace_value(field_name, self._get_css(css)) - - def _get_css(self, css): - return self._get_values(self.tree.cssselect(css)) - - def _get_values(self, elems): - for e in elems: - yield etree.tostring(e) if isinstance(e, etree.ElementBase) else e - diff --git a/scrapy/tests/test_contrib_exp_loader_lxmlloader.py b/scrapy/tests/test_contrib_exp_loader_lxmlloader.py deleted file mode 100644 index 1980648c1..000000000 --- a/scrapy/tests/test_contrib_exp_loader_lxmlloader.py +++ /dev/null @@ -1,67 +0,0 @@ -from twisted.trial import unittest - -from scrapy.contrib.loader.processor import MapCompose -from scrapy.item import Item, Field -from scrapy.http import HtmlResponse - -try: - import lxml -except ImportError: - lxml = False - - -class TestItem(Item): - name = Field() - - -if lxml: - from scrapy.contrib_exp.loader.lxmlloader import LxmlItemLoader - - class TestLxmlItemLoader(LxmlItemLoader): - default_item_class = TestItem - - -class LxmlItemLoaderTest(unittest.TestCase): - response = HtmlResponse(url="", body='
    marta

    paragraph

    ') - - def setUp(self): - if not lxml: - raise unittest.SkipTest("lxml is not available") - - def test_constructor_with_response(self): - l = TestLxmlItemLoader(response=self.response) - self.assert_(l.tree) - - def test_add_xpath(self): - l = TestLxmlItemLoader(response=self.response) - l.add_xpath('name', '//div') - self.assertEqual(l.get_output_value('name'), [u'
    marta
    ']) - - def test_add_xpath_text(self): - l = TestLxmlItemLoader(response=self.response) - l.add_xpath('name', '//div/text()') - self.assertEqual(l.get_output_value('name'), [u'marta']) - - def test_replace_xpath(self): - l = TestLxmlItemLoader(response=self.response) - l.add_xpath('name', '//div/text()') - self.assertEqual(l.get_output_value('name'), [u'marta']) - l.replace_xpath('name', '//p/text()') - self.assertEqual(l.get_output_value('name'), [u'paragraph']) - - def test_add_css(self): - l = TestLxmlItemLoader(response=self.response) - l.add_css('name', '#id') - self.assertEqual(l.get_output_value('name'), [u'
    marta
    ']) - - def test_replace_css(self): - l = TestLxmlItemLoader(response=self.response) - l.add_css('name', '#id') - self.assertEqual(l.get_output_value('name'), [u'
    marta
    ']) - l.replace_css('name', 'p') - self.assertEqual(l.get_output_value('name'), [u'

    paragraph

    ']) - - -if __name__ == "__main__": - unittest.main() - From 3d96016da1f8ab66a5f634876fc26a59aaa03da8 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Sat, 30 Oct 2010 16:03:00 -0200 Subject: [PATCH 55/67] runtests.sh: switched to 'text' repoter in trial --- bin/runtests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/runtests.sh b/bin/runtests.sh index 3c8079210..58ef8f134 100755 --- a/bin/runtests.sh +++ b/bin/runtests.sh @@ -37,7 +37,7 @@ fi find -name '*.py[co]' -delete if [ $# -eq 0 ]; then - $trial scrapy scrapyd + $trial --reporter=text scrapy scrapyd else $trial "$@" fi From b76c5c597f0d5d649444cea7a9d357b0b36ebcf2 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Sun, 31 Oct 2010 03:25:37 -0200 Subject: [PATCH 56/67] * Added support for project data storage (closes #276) * Documented project file structure * Moved default location of SQLite database to project data storage dir (closes #277) --- docs/topics/commands.rst | 40 +++++++++++++++++++++++++++ docs/topics/settings.rst | 12 +++++++++ scrapy/contrib/spidercontext.py | 14 +++------- scrapy/spiderqueue.py | 13 +++------ scrapy/utils/project.py | 48 +++++++++++++++++++++++++++++++++ scrapy/utils/python.py | 10 +++++++ 6 files changed, 117 insertions(+), 20 deletions(-) create mode 100644 scrapy/utils/project.py diff --git a/docs/topics/commands.rst b/docs/topics/commands.rst index 8f50b45a9..c14d0d488 100644 --- a/docs/topics/commands.rst +++ b/docs/topics/commands.rst @@ -13,6 +13,44 @@ just call "commands", or "Scrapy commands". The Scrapy tool provides several commands, for multiple purposes, and each one accepts a different set of arguments and options. +.. _topics-project-structure: + +Default structure of Scrapy projects +==================================== + +Before delving into the command-line tool and its sub-commands, let's first +understand the directory structure of a Scrapy project. + +Even thought it can be modified, all Scrapy projects have the same file +structure by default, similar to this:: + + scrapy.cfg + myproject/ + __init__.py + items.py + pipelines.py + settings.py + spiders/ + __init__.py + spider1.py + spider2.py + ... + .scrapy/ + scrapy.db + +The directory where the ``scrapy.cfg`` file resides is known as the *project +root directory*. That file contains the name of the python module that defines +the project settings. Here is an example:: + + [settings] + default = myproject.settings + +By default, Scrapy projects use a SQLite_ database to store persistent runtime +data of the project, such as the spider queue (the list of spiders that are +scheduled to run). By default, this SQLite database is stored in the *project +data directory* which, by default, is the ``.scrapy`` directory inside the +project root directory mentioned above. + Using the ``scrapy`` tool ========================= @@ -444,3 +482,5 @@ commands for your Scrapy project. Example:: COMMANDS_MODULE = 'mybot.commands' + +.. _SQLite: http://en.wikipedia.org/wiki/SQLite diff --git a/docs/topics/settings.rst b/docs/topics/settings.rst index 0f2f99811..2a1d9aeb2 100644 --- a/docs/topics/settings.rst +++ b/docs/topics/settings.rst @@ -878,6 +878,18 @@ Example:: SPIDER_MODULES = ['mybot.spiders_prod', 'mybot.spiders_dev'] +.. setting:: SQLITE_DB + +SQLITE_DB +--------- + +Default: ``'scrapy.db'`` + +The location of the project SQLite database, used for storing the spider queue +and other persistent data of the project. If a relative path is given, is taken +relative to the project data dir. For more info see: +:ref:`topics-project-structure`. + .. setting:: STATS_CLASS STATS_CLASS diff --git a/scrapy/contrib/spidercontext.py b/scrapy/contrib/spidercontext.py index 5c369a172..29a309183 100644 --- a/scrapy/contrib/spidercontext.py +++ b/scrapy/contrib/spidercontext.py @@ -1,12 +1,11 @@ -import sqlite3 - from zope.interface import Interface, implements from scrapy.xlib.pydispatch import dispatcher from scrapy.exceptions import NotConfigured from scrapy.utils.misc import load_object from scrapy.utils.sqlite import JsonSqliteDict -from scrapy import log, signals +from scrapy.utils.project import sqlite_db +from scrapy import signals class ISpiderContextStorage(Interface): @@ -24,16 +23,11 @@ class SqliteSpiderContextStorage(object): sqlite_dict_class = JsonSqliteDict def __init__(self, database=None, table='contexts'): - try: - self.d = self.sqlite_dict_class(database, table) - except sqlite3.Error, e: - self.d = self.sqlite_dict_class(':memory:', table) - log.msg("Cannot open SQLite %r - using in-memory context storage " \ - "instead. Error was: %r" % (database, str(e)), log.WARNING) + self.d = self.sqlite_dict_class(database, table) @classmethod def from_settings(cls, settings): - return cls(settings['SQLITE_DB']) + return cls(sqlite_db(settings['SQLITE_DB'])) def get(self, spider): if spider.name in self.d: diff --git a/scrapy/spiderqueue.py b/scrapy/spiderqueue.py index 409a85181..e19d10fc9 100644 --- a/scrapy/spiderqueue.py +++ b/scrapy/spiderqueue.py @@ -1,10 +1,8 @@ -import sqlite3 - from zope.interface import implements -from scrapy import log from scrapy.interfaces import ISpiderQueue from scrapy.utils.sqlite import JsonSqlitePriorityQueue +from scrapy.utils.project import sqlite_db class SqliteSpiderQueue(object): @@ -12,16 +10,11 @@ class SqliteSpiderQueue(object): implements(ISpiderQueue) def __init__(self, database=None, table='spider_queue'): - try: - self.q = JsonSqlitePriorityQueue(database, table) - except sqlite3.Error, e: - self.q = JsonSqlitePriorityQueue(':memory:', table) - log.msg("Cannot open SQLite %r - using in-memory spider queue " \ - "instead. Error was: %r" % (database, str(e)), log.WARNING) + self.q = JsonSqlitePriorityQueue(database, table) @classmethod def from_settings(cls, settings): - return cls(settings['SQLITE_DB']) + return cls(sqlite_db(settings['SQLITE_DB'])) def add(self, name, **spider_args): d = spider_args.copy() diff --git a/scrapy/utils/project.py b/scrapy/utils/project.py new file mode 100644 index 000000000..596d8380f --- /dev/null +++ b/scrapy/utils/project.py @@ -0,0 +1,48 @@ +from os.path import join, dirname, abspath, isabs, exists +from os import makedirs +import warnings + +from scrapy.utils.conf import closest_scrapy_cfg, get_config +from scrapy.utils.python import is_writable + +DATADIR_CFG_SECTION = 'datadir' + +def inside_project(): + return bool(closest_scrapy_cfg()) + +def project_data_dir(project='default'): + """Return the current project data dir, creating it if it doesn't exist""" + assert inside_project(), "Not inside project" + scrapy_cfg = closest_scrapy_cfg() + d = abspath(join(dirname(scrapy_cfg), '.scrapy')) + cfg = get_config() + if cfg.has_option(DATADIR_CFG_SECTION, project): + d = cfg.get(DATADIR_CFG_SECTION, project) + if not exists(d): + makedirs(d) + return d + +def expand_data_path(path): + """If path is relative, return the given path inside the project data dir, + otherwise return the path unmodified + """ + if isabs(path): + return path + return join(project_data_dir(), path) + +def sqlite_db(path, nonwritable_fallback=True): + """Get the SQLite database to use. If path is relative, returns the given + path inside the project data dir, otherwise returns the path unmodified. If + not inside a project returns :memory: to use an in-memory database. + + If nonwritable_fallback is True, and the path is not writable it issues a + warning and returns :memory: + """ + if not inside_project() or path == ':memory:': + db = ':memory:' + else: + db = expand_data_path(path) + if not is_writable(db) and nonwritable_fallback: + warnings.warn("%r is not writable - using in-memory SQLite instead" % db) + db = ':memory:' + return db diff --git a/scrapy/utils/python.py b/scrapy/utils/python.py index 24e4476e6..486aece73 100644 --- a/scrapy/utils/python.py +++ b/scrapy/utils/python.py @@ -5,6 +5,7 @@ It also contains functions (or functionality) which is in Python versions higher than 2.5 which is the lowest version supported by Scrapy. """ +import os import re import inspect import weakref @@ -205,3 +206,12 @@ def stringify_dict(dct_or_tuples, encoding='utf-8', keys_only=True): v = v.encode(encoding) if isinstance(v, unicode) else v d[k] = v return d + +def is_writable(path): + """Return True if the given path can be written (if it exists) or created + (if it doesn't exist) + """ + if os.path.exists(path): + return os.access(path, os.W_OK) + else: + return os.access(os.path.dirname(path), os.W_OK) From 130276605b0610175f8317c6e535467de5dbfae0 Mon Sep 17 00:00:00 2001 From: dfdeshom Date: Mon, 1 Nov 2010 00:59:04 -0200 Subject: [PATCH 57/67] Bind the web server and telnet server to a configurable interface (WEBSERVICE_HOST). The default is to bind to all interfaces. Also add documentation for WEBSERVICE_HOST and TELNETCONSOLE_HOST. --- docs/topics/telnetconsole.rst | 25 +++++++++++++++++++++++++ docs/topics/webservice.rst | 9 +++++++++ scrapy/settings/default_settings.py | 2 ++ scrapy/telnet.py | 7 ++++--- scrapy/utils/reactor.py | 10 +++++----- scrapy/webservice.py | 7 ++++--- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/docs/topics/telnetconsole.rst b/docs/topics/telnetconsole.rst index 831bcd6d4..5e234fd5c 100644 --- a/docs/topics/telnetconsole.rst +++ b/docs/topics/telnetconsole.rst @@ -140,3 +140,28 @@ Telnet Console signals :param telnet_vars: the dict of telnet variables :type telnet_vars: dict +Telnet settings +=============== + +These are the settings that control the telnet console's behaviour: + +.. setting:: TELNETCONSOLE_HOST + +TELNETCONSOLE_PORT +------------------ + +Default: ``[6023, 6073]`` + +The port range to use for the etlnet console. If set to ``None`` or ``0``, a +dynamically assigned port is used. + + +.. setting:: TELNETCONSOLE_HOST + +TELNETCONSOLE_HOST +------------------ + +Default: ``'0.0.0.0'`` + +The interface the telnet console should listen on + diff --git a/docs/topics/webservice.rst b/docs/topics/webservice.rst index b15db661b..1b05d1ed9 100644 --- a/docs/topics/webservice.rst +++ b/docs/topics/webservice.rst @@ -136,6 +136,15 @@ Default: ``[6080, 7030]`` The port range to use for the web service. If set to ``None`` or ``0``, a dynamically assigned port is used. +.. setting:: WEBSERVICE_HOST + +WEBSERVICE_HOST +--------------- + +Default: ``'0.0.0.0'`` + +The interface the web service should listen on + WEBSERVICE_RESOURCES -------------------- diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index c48bc0fe6..aaf445c7f 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -259,10 +259,12 @@ USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION) TELNETCONSOLE_ENABLED = 1 TELNETCONSOLE_PORT = [6023, 6073] +TELNETCONSOLE_HOST = '0.0.0.0' WEBSERVICE_ENABLED = True WEBSERVICE_LOGFILE = None WEBSERVICE_PORT = [6080, 7030] +WEBSERVICE_HOST = '0.0.0.0' WEBSERVICE_RESOURCES = {} WEBSERVICE_RESOURCES_BASE = { 'scrapy.contrib.webservice.crawler.CrawlerResource': 1, diff --git a/scrapy/telnet.py b/scrapy/telnet.py index 1d9d9e1b0..ea8512257 100644 --- a/scrapy/telnet.py +++ b/scrapy/telnet.py @@ -39,13 +39,14 @@ class TelnetConsole(protocol.ServerFactory): raise NotConfigured self.noisy = False self.portrange = map(int, settings.getlist('TELNETCONSOLE_PORT')) + self.host = settings['TELNETCONSOLE_HOST'] dispatcher.connect(self.start_listening, signals.engine_started) dispatcher.connect(self.stop_listening, signals.engine_stopped) def start_listening(self): - self.port = listen_tcp(self.portrange, self) - log.msg("Telnet console listening on port %d" % self.port.getHost().port, - log.DEBUG) + self.port = listen_tcp(self.portrange, self.host, self) + h = self.port.getHost() + log.msg("Telnet console listening on %s:%d" % (h.host, h.port), log.DEBUG) def stop_listening(self): self.port.stopListening() diff --git a/scrapy/utils/reactor.py b/scrapy/utils/reactor.py index bd306e0cd..88bb15eb4 100644 --- a/scrapy/utils/reactor.py +++ b/scrapy/utils/reactor.py @@ -1,17 +1,17 @@ from twisted.internet import reactor, error -def listen_tcp(portrange, factory): +def listen_tcp(portrange, host, factory): """Like reactor.listenTCP but tries different ports in a range.""" assert len(portrange) <= 2, "invalid portrange: %s" % portrange if not hasattr(portrange, '__iter__'): - return reactor.listenTCP(portrange, factory) + return reactor.listenTCP(portrange, factory, interface=host) if not portrange: - return reactor.listenTCP(0, factory) + return reactor.listenTCP(0, factory, interface=host) if len(portrange) == 1: - return reactor.listenTCP(portrange[0], factory) + return reactor.listenTCP(portrange[0], factory, interface=host) for x in range(portrange[0], portrange[1]+1): try: - return reactor.listenTCP(x, factory) + return reactor.listenTCP(x, factory, interface=host) except error.CannotListenError: if x == portrange[1]: raise diff --git a/scrapy/webservice.py b/scrapy/webservice.py index 8ab6513e0..1f3caa018 100644 --- a/scrapy/webservice.py +++ b/scrapy/webservice.py @@ -68,6 +68,7 @@ class WebService(server.Site): raise NotConfigured logfile = settings['WEBSERVICE_LOGFILE'] self.portrange = map(int, settings.getlist('WEBSERVICE_PORT')) + self.host = settings['WEBSERVICE_HOST'] root = RootResource() reslist = build_component_list(settings['WEBSERVICE_RESOURCES_BASE'], \ settings['WEBSERVICE_RESOURCES']) @@ -80,9 +81,9 @@ class WebService(server.Site): dispatcher.connect(self.stop_listening, signals.engine_stopped) def start_listening(self): - self.port = listen_tcp(self.portrange, self) - log.msg("Web service listening on port %d" % self.port.getHost().port, - log.DEBUG) + self.port = listen_tcp(self.portrange, self.host, self) + h = self.port.getHost() + log.msg("Web service listening on %s:%d" % (h.host, h.port), log.DEBUG) def stop_listening(self): self.port.stopListening() From 0b7e815888acb92ccfd8ed939e208438f2506d83 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 1 Nov 2010 01:25:30 -0200 Subject: [PATCH 58/67] Added Didier to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8601441ff..74168b0b7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -25,3 +25,4 @@ Here is the list of the primary authors & contributors: * Ping Yin * Lucian Ursu * Shuaib Khan + * Didier Deshommes From 3c94c6cb9bdff682400d216922b0e9b6c396609c Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 1 Nov 2010 02:31:20 -0200 Subject: [PATCH 59/67] fixed sphinx doc id --- docs/topics/telnetconsole.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/telnetconsole.rst b/docs/topics/telnetconsole.rst index 5e234fd5c..27d170c77 100644 --- a/docs/topics/telnetconsole.rst +++ b/docs/topics/telnetconsole.rst @@ -145,7 +145,7 @@ Telnet settings These are the settings that control the telnet console's behaviour: -.. setting:: TELNETCONSOLE_HOST +.. setting:: TELNETCONSOLE_PORT TELNETCONSOLE_PORT ------------------ From 0f69e7a1915ccd2cc3c0107b452414e278edd79d Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 1 Nov 2010 02:38:15 -0200 Subject: [PATCH 60/67] Some changes to HTTP Cache middleware: * made it use the project data storage by default (closes #279) * added HTTPCACHE_ENABLED setting (False by default) to enable it * made HTTPCACHE_DIR = 'httpcache' by default (inside the project data storage) * simplified HTTPCACHE_EXPIRATION_SECS semantics: zero means don't expire, dropped support for negative numbers * other minor doc improvements --- docs/topics/downloader-middleware.rst | 41 ++++++++++++++----- .../contrib/downloadermiddleware/httpcache.py | 10 ++--- scrapy/settings/default_settings.py | 3 +- .../test_downloadermiddleware_httpcache.py | 11 ++--- scrapy/utils/project.py | 8 ++-- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/docs/topics/downloader-middleware.rst b/docs/topics/downloader-middleware.rst index eb7a33009..0887a5c40 100644 --- a/docs/topics/downloader-middleware.rst +++ b/docs/topics/downloader-middleware.rst @@ -230,8 +230,8 @@ HttpCacheMiddleware anything from the Internet. The HTTP cache is useful for testing spiders faster (without having to wait for - downloads every time) and for trying your spider offline, when you don't have - an Internet connection. + downloads every time) and for trying your spider offline, when an Internet + connection is not available. File system storage ~~~~~~~~~~~~~~~~~~~ @@ -266,15 +266,19 @@ Settings The :class:`HttpCacheMiddleware` can be configured through the following settings: -.. setting:: HTTPCACHE_DIR +.. setting:: HTTPCACHE_ENABLED -HTTPCACHE_DIR -^^^^^^^^^^^^^ +HTTPCACHE_ENABLED +^^^^^^^^^^^^^^^^^ -Default: ``''`` (empty string) +.. versionadded:: 0.11 -The directory to use for storing the (low-level) HTTP cache. If empty, the HTTP -cache will be disabled. +Default: ``False`` + +Whether the HTTP cache will be enabled. + +.. versionchanged:: 0.11 + Before 0.11, :setting:`HTTPCACHE_DIR` was used to enable cache. .. setting:: HTTPCACHE_EXPIRATION_SECS @@ -283,9 +287,24 @@ HTTPCACHE_EXPIRATION_SECS Default: ``0`` -Number of seconds to use for HTTP cache expiration. Requests that were cached -before this time will be re-downloaded. If zero, cached requests will always -expire. A negative number means requests will never expire. +Expiration time for cached requests, in seconds. + +Cached requests older than this time will be re-downloaded. If zero, cached +requests will never expire. + +.. versionchanged:: 0.11 + Before 0.11, zero meant cached requests always expire. + +.. setting:: HTTPCACHE_DIR + +HTTPCACHE_DIR +^^^^^^^^^^^^^ + +Default: ``'httpcache'`` + +The directory to use for storing the (low-level) HTTP cache. If empty, the HTTP +cache will be disabled. If a relative path is given, is taken relative to the +project data dir. For more info see: :ref:`topics-project-structure`. .. setting:: HTTPCACHE_IGNORE_HTTP_CODES diff --git a/scrapy/contrib/downloadermiddleware/httpcache.py b/scrapy/contrib/downloadermiddleware/httpcache.py index f7a83e657..e27db5d80 100644 --- a/scrapy/contrib/downloadermiddleware/httpcache.py +++ b/scrapy/contrib/downloadermiddleware/httpcache.py @@ -14,12 +14,15 @@ from scrapy.utils.request import request_fingerprint from scrapy.utils.http import headers_dict_to_raw, headers_raw_to_dict from scrapy.utils.httpobj import urlparse_cached from scrapy.utils.misc import load_object +from scrapy.utils.project import data_path from scrapy import conf class HttpCacheMiddleware(object): def __init__(self, settings=conf.settings): + if not settings.getbool('HTTPCACHE_ENABLED'): + raise NotConfigured self.storage = load_object(settings['HTTPCACHE_STORAGE'])(settings) self.ignore_missing = settings.getbool('HTTPCACHE_IGNORE_MISSING') self.ignore_schemes = settings.getlist('HTTPCACHE_IGNORE_SCHEMES') @@ -58,10 +61,7 @@ class HttpCacheMiddleware(object): class FilesystemCacheStorage(object): def __init__(self, settings=conf.settings): - cachedir = settings['HTTPCACHE_DIR'] - if not cachedir: - raise NotConfigured - self.cachedir = cachedir + self.cachedir = data_path(settings['HTTPCACHE_DIR']) self.expiration_secs = settings.getint('HTTPCACHE_EXPIRATION_SECS') def open_spider(self, spider): @@ -123,7 +123,7 @@ class FilesystemCacheStorage(object): if not exists(metapath): return # not found mtime = os.stat(rpath).st_mtime - if 0 <= self.expiration_secs < time() - mtime: + if 0 < self.expiration_secs < time() - mtime: return # expired with open(metapath, 'rb') as f: return pickle.load(f) diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index aaf445c7f..015b1d911 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -148,7 +148,8 @@ FEED_EXPORTERS_BASE = { 'xml': 'scrapy.contrib.exporter.XmlItemExporter', } -HTTPCACHE_DIR = '' +HTTPCACHE_ENABLED = False +HTTPCACHE_DIR = 'httpcache' HTTPCACHE_IGNORE_MISSING = False HTTPCACHE_STORAGE = 'scrapy.contrib.downloadermiddleware.httpcache.FilesystemCacheStorage' HTTPCACHE_EXPIRATION_SECS = 0 diff --git a/scrapy/tests/test_downloadermiddleware_httpcache.py b/scrapy/tests/test_downloadermiddleware_httpcache.py index ae6339208..af54383f6 100644 --- a/scrapy/tests/test_downloadermiddleware_httpcache.py +++ b/scrapy/tests/test_downloadermiddleware_httpcache.py @@ -22,6 +22,7 @@ class HttpCacheMiddlewareTest(unittest.TestCase): def _get_settings(self, **new_settings): settings = { + 'HTTPCACHE_ENABLED': True, 'HTTPCACHE_DIR': self.tmpdir, 'HTTPCACHE_EXPIRATION_SECS': 1, 'HTTPCACHE_IGNORE_HTTP_CODES': [], @@ -46,17 +47,11 @@ class HttpCacheMiddlewareTest(unittest.TestCase): time.sleep(2) # wait for cache to expire assert storage.retrieve_response(self.spider, request2) is None - def test_storage_expire_immediately(self): + def test_storage_never_expire(self): storage = self._get_storage(HTTPCACHE_EXPIRATION_SECS=0) assert storage.retrieve_response(self.spider, self.request) is None storage.store_response(self.spider, self.request, self.response) - time.sleep(0.1) # required for win32 - assert storage.retrieve_response(self.spider, self.request) is None - - def test_storage_never_expire(self): - storage = self._get_storage(HTTPCACHE_EXPIRATION_SECS=-1) - assert storage.retrieve_response(self.spider, self.request) is None - storage.store_response(self.spider, self.request, self.response) + time.sleep(0.5) # give the chance to expire assert storage.retrieve_response(self.spider, self.request) def test_middleware(self): diff --git a/scrapy/utils/project.py b/scrapy/utils/project.py index 596d8380f..53ffad794 100644 --- a/scrapy/utils/project.py +++ b/scrapy/utils/project.py @@ -22,13 +22,11 @@ def project_data_dir(project='default'): makedirs(d) return d -def expand_data_path(path): +def data_path(path): """If path is relative, return the given path inside the project data dir, otherwise return the path unmodified """ - if isabs(path): - return path - return join(project_data_dir(), path) + return path if isabs(path) else join(project_data_dir(), path) def sqlite_db(path, nonwritable_fallback=True): """Get the SQLite database to use. If path is relative, returns the given @@ -41,7 +39,7 @@ def sqlite_db(path, nonwritable_fallback=True): if not inside_project() or path == ':memory:': db = ':memory:' else: - db = expand_data_path(path) + db = data_path(path) if not is_writable(db) and nonwritable_fallback: warnings.warn("%r is not writable - using in-memory SQLite instead" % db) db = ':memory:' From 369a149d60e3deb2f0c54c078950b6316bf06837 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 3 Nov 2010 17:16:08 -0200 Subject: [PATCH 61/67] fixed bug with deploy command in windows environments: WindowsError: [Error 32] The process cannot access the file because it is being used by another process --- scrapy/commands/deploy.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index afbb2bc41..aa2a4e9c5 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -81,12 +81,16 @@ class Command(ScrapyCommand): return target, project = _get_target_project(args) version = _get_version(opts) + tmpdir = None if opts.egg: egg = open(opts.egg, 'rb') else: _log("Bulding egg of %s-%s" % (project, version)) - egg = _build_egg() + egg, tmpdir = _build_egg() _upload_egg(target, egg, project, version) + egg.close() + if tmpdir: + shutil.rmtree(tmpdir) def _log(message): sys.stderr.write("%s\n" % message) @@ -182,13 +186,10 @@ def _build_egg(): settings = get_config().get('settings', 'default') _create_default_setup_py(settings=settings) d = tempfile.mkdtemp() - try: - f = tempfile.TemporaryFile(dir=d) - check_call([sys.executable, 'setup.py', 'bdist_egg', '-d', d], stdout=f) - egg = glob.glob(os.path.join(d, '*.egg'))[0] - return open(egg, 'rb') - finally: - shutil.rmtree(d) + f = tempfile.TemporaryFile(dir=d) + check_call([sys.executable, 'setup.py', 'bdist_egg', '-d', d], stdout=f) + egg = glob.glob(os.path.join(d, '*.egg'))[0] + return open(egg, 'rb'), d def _create_default_setup_py(**kwargs): with open('setup.py', 'w') as f: From 7ba972d8cf833902b29082dc4802604f8d34b9c6 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 4 Nov 2010 16:27:47 -0200 Subject: [PATCH 62/67] get_spider_list_from_eggfile(): fail if unable to extract spider list --- scrapyd/eggutils.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scrapyd/eggutils.py b/scrapyd/eggutils.py index c507f0be5..d5bda5197 100644 --- a/scrapyd/eggutils.py +++ b/scrapyd/eggutils.py @@ -18,8 +18,11 @@ def get_spider_list_from_eggfile(eggfile, project): env = os.environ.copy() env['SCRAPY_PROJECT'] = project env['SCRAPY_EGGFILE'] = f.name - proc = Popen(pargs, stdout=PIPE, cwd=tmpdir, env=env) - out = proc.communicate()[0] + proc = Popen(pargs, stdout=PIPE, stderr=PIPE, cwd=tmpdir, env=env) + out, err = proc.communicate() + if proc.returncode: + msg = err.splitlines()[-1] if err else "unknown error" + raise RuntimeError(msg) return out.splitlines() finally: shutil.rmtree(tmpdir) From de4909faca75143b5c5b4d95af7fd226bf09489d Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Thu, 4 Nov 2010 18:56:11 -0200 Subject: [PATCH 63/67] get_spider_list_from_eggfile(): more improvements to error messages, and support passing eggruner module as argument --- scrapyd/eggutils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scrapyd/eggutils.py b/scrapyd/eggutils.py index d5bda5197..a05a45ce7 100644 --- a/scrapyd/eggutils.py +++ b/scrapyd/eggutils.py @@ -4,7 +4,7 @@ import os, sys, shutil, pkg_resources from subprocess import Popen, PIPE from tempfile import NamedTemporaryFile, mkdtemp -def get_spider_list_from_eggfile(eggfile, project): +def get_spider_list_from_eggfile(eggfile, project, eggrunner='scrapyd.eggrunner'): # FIXME: we use a temporary directory here to avoid permissions problems # when running as system service, as "scrapy list" command tries to write # the scrapy.db sqlite database in current directory @@ -14,15 +14,15 @@ def get_spider_list_from_eggfile(eggfile, project): shutil.copyfileobj(eggfile, f) f.flush() eggfile.seek(0) - pargs = [sys.executable, '-m', 'scrapyd.eggrunner', 'list'] + pargs = [sys.executable, '-m', eggrunner, 'list'] env = os.environ.copy() env['SCRAPY_PROJECT'] = project env['SCRAPY_EGGFILE'] = f.name proc = Popen(pargs, stdout=PIPE, stderr=PIPE, cwd=tmpdir, env=env) out, err = proc.communicate() if proc.returncode: - msg = err.splitlines()[-1] if err else "unknown error" - raise RuntimeError(msg) + msg = err or out or 'unknown error' + raise RuntimeError(msg.splitlines()[-1]) return out.splitlines() finally: shutil.rmtree(tmpdir) From 31bbcc94760951a495a19d6e7db0fe7b8d5eaa0b Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Fri, 5 Nov 2010 11:24:33 -0200 Subject: [PATCH 64/67] Raise error when egg is corrupt in activate_egg(). Use a more descriptive name for temporary dirs in get_spider_list_from_eggfile(). Make scrapyd webservice pass egg_runner to get_spider_list_from_eggfile() --- scrapyd/eggutils.py | 7 +++++-- scrapyd/webservice.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/scrapyd/eggutils.py b/scrapyd/eggutils.py index a05a45ce7..d25969d68 100644 --- a/scrapyd/eggutils.py +++ b/scrapyd/eggutils.py @@ -8,7 +8,7 @@ def get_spider_list_from_eggfile(eggfile, project, eggrunner='scrapyd.eggrunner' # FIXME: we use a temporary directory here to avoid permissions problems # when running as system service, as "scrapy list" command tries to write # the scrapy.db sqlite database in current directory - tmpdir = mkdtemp() + tmpdir = mkdtemp(prefix='eggs-%s-' % project) try: with NamedTemporaryFile(suffix='.egg', dir=tmpdir) as f: shutil.copyfileobj(eggfile, f) @@ -32,7 +32,10 @@ def activate_egg(eggpath): to activate a Scrapy egg file. Don't use it from other code as it may leave unwanted side effects. """ - d = pkg_resources.find_distributions(eggpath).next() + try: + d = pkg_resources.find_distributions(eggpath).next() + except StopIteration: + raise ValueError("Unknown or corrupt egg") d.activate() settings_module = d.get_entry_info('scrapy', 'settings').module_name os.environ['SCRAPY_SETTINGS_MODULE'] = settings_module diff --git a/scrapyd/webservice.py b/scrapyd/webservice.py index 570aa70c3..cf1464876 100644 --- a/scrapyd/webservice.py +++ b/scrapyd/webservice.py @@ -68,7 +68,8 @@ class ListSpiders(WsResource): project = txrequest.args['project'][0] eggstorage = self.root.app.getComponent(IEggStorage) _, eggf = eggstorage.get(project) - spiders = get_spider_list_from_eggfile(eggf, project) + spiders = get_spider_list_from_eggfile(eggf, project, \ + eggrunner=self.root.egg_runner) return {"status": "ok", "spiders": spiders} class DeleteProject(WsResource): @@ -96,6 +97,7 @@ class Root(Resource): def __init__(self, config, app): Resource.__init__(self) self.debug = config.getboolean('debug', False) + self.eggrunner = config.get('egg_runner') self.app = app self.putChild('schedule.json', Schedule(self)) self.putChild('addversion.json', AddVersion(self)) From 5bdffadbe35f8f338e4618c93af018d79901994b Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Fri, 5 Nov 2010 11:48:12 -0200 Subject: [PATCH 65/67] Simplified get_spider_list_from_eggfile() function now that it doesn't need to chdir to a custom directory (Scrapy now works when it's unable to create the SQLite database) --- scrapyd/eggutils.py | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/scrapyd/eggutils.py b/scrapyd/eggutils.py index d25969d68..4a34029f1 100644 --- a/scrapyd/eggutils.py +++ b/scrapyd/eggutils.py @@ -2,30 +2,23 @@ from __future__ import with_statement import os, sys, shutil, pkg_resources from subprocess import Popen, PIPE -from tempfile import NamedTemporaryFile, mkdtemp +from tempfile import NamedTemporaryFile def get_spider_list_from_eggfile(eggfile, project, eggrunner='scrapyd.eggrunner'): - # FIXME: we use a temporary directory here to avoid permissions problems - # when running as system service, as "scrapy list" command tries to write - # the scrapy.db sqlite database in current directory - tmpdir = mkdtemp(prefix='eggs-%s-' % project) - try: - with NamedTemporaryFile(suffix='.egg', dir=tmpdir) as f: - shutil.copyfileobj(eggfile, f) - f.flush() - eggfile.seek(0) - pargs = [sys.executable, '-m', eggrunner, 'list'] - env = os.environ.copy() - env['SCRAPY_PROJECT'] = project - env['SCRAPY_EGGFILE'] = f.name - proc = Popen(pargs, stdout=PIPE, stderr=PIPE, cwd=tmpdir, env=env) - out, err = proc.communicate() - if proc.returncode: - msg = err or out or 'unknown error' - raise RuntimeError(msg.splitlines()[-1]) - return out.splitlines() - finally: - shutil.rmtree(tmpdir) + with NamedTemporaryFile(suffix='.egg') as f: + shutil.copyfileobj(eggfile, f) + f.flush() + eggfile.seek(0) + pargs = [sys.executable, '-m', eggrunner, 'list'] + env = os.environ.copy() + env['SCRAPY_PROJECT'] = project + env['SCRAPY_EGGFILE'] = f.name + proc = Popen(pargs, stdout=PIPE, stderr=PIPE, env=env) + out, err = proc.communicate() + if proc.returncode: + msg = err or out or 'unknown error' + raise RuntimeError(msg.splitlines()[-1]) + return out.splitlines() def activate_egg(eggpath): """Activate a Scrapy egg file. This is meant to be used from egg runners From 37c9d5feff6435d452f75fe82661ea88197e4b4d Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 8 Nov 2010 02:19:54 -0200 Subject: [PATCH 66/67] minor update to queue command doc --- scrapy/commands/queue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapy/commands/queue.py b/scrapy/commands/queue.py index b2105f779..f4a6d126e 100644 --- a/scrapy/commands/queue.py +++ b/scrapy/commands/queue.py @@ -14,7 +14,7 @@ class Command(runserver.Command): return "[options] " def short_desc(self): - return "Control execution queue" + return "Control the spider queue" def add_options(self, parser): ScrapyCommand.add_options(self, parser) From d988ca1ec2561f57e3165ea8d86035328f0f8746 Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Mon, 8 Nov 2010 17:01:06 -0200 Subject: [PATCH 67/67] Some changes to scrapy deploy command: * changed deploy section names to [deploy:target] * project is now passed through a -p|--project option * version can now be set in the target configuration * switched meaning of -l and -L options * updated documentation accordingly --- docs/topics/scrapyd.rst | 46 ++++++++++-------- scrapy/commands/deploy.py | 72 ++++++++++++++++------------- scrapy/templates/project/scrapy.cfg | 9 ++++ 3 files changed, 74 insertions(+), 53 deletions(-) diff --git a/docs/topics/scrapyd.rst b/docs/topics/scrapyd.rst index e55cf80fe..e78b5c76e 100644 --- a/docs/topics/scrapyd.rst +++ b/docs/topics/scrapyd.rst @@ -221,39 +221,38 @@ Show and define targets To see all available targets type:: - scrapy deploy -L + scrapy deploy -l -This will return a list of available targets and their URLs:: +This will return a list of available targets and their URLs. For example:: scrapyd http://localhost:6800/ -The ``scrapyd`` target is available by default. You can define more targets by -adding them to the ``scrapy.cfg`` file in your project or any other supported -location like ``~/.scrapy.cfg``, ``/etc/scrapy.cfg``, or -``c:\scrapy\scrapy.cfg``. +You can define targets by adding them to your project's ``scrapy.cfg`` file, +or any other supported location like ``~/.scrapy.cfg``, ``/etc/scrapy.cfg``, +or ``c:\scrapy\scrapy.cfg`` (in Windows). Here's an example of defining a new target ``scrapyd2`` with restricted access through HTTP basic authentication:: - [deploy_scrapyd2] - url = http://scrapyd.mydomain.com/api/scrapy/ + [deploy:scrapyd2] + url = http://scrapyd.mydomain.com/api/scrapyd/ username = john password = secret .. note:: The :command:`deploy` command also supports netrc for getting the credentials. -Now, if you type ``scrapy deploy -L`` you'd see:: +Now, if you type ``scrapy deploy -l`` you'll see:: scrapyd http://localhost:6800/ - scrapyd2 http://scrapyd.mydomain.com/api/scrapy/ + scrapyd2 http://scrapyd.mydomain.com/api/scrapyd/ See available projects ---------------------- -To see all available projets in certain target use:: +To see all available projets in a specific target use:: - scrapy deploy -l scrapyd + scrapy deploy -L scrapyd It would return something like this:: @@ -265,14 +264,14 @@ Deploying a project Finally, to deploy your project use:: - scrapy deploy scrapyd:project1 + scrapy deploy scrapyd -p project1 This will eggify your project and upload it to the target, printing the JSON response returned from the Scrapyd server. If you have a ``setup.py`` file in your project, that one will be used. Otherwise a ``setup.py`` file will be created automatically (based on a simple template) that you can edit later. -After running that command you will see something like this meaning your +After running that command you will see something like this, meaning your project was uploaded successfully:: Deploying myproject-1287453519 to http://localhost:6800/addversion.json @@ -283,23 +282,30 @@ By default ``scrapy deploy`` uses the current timestamp for generating the project version, as you can see in the output above. However, you can pass a custom version with the ``--version`` option:: - scrapy deploy scrapyd:project1 --version 54 + scrapy deploy scrapyd -p project1 --version 54 Also, if you use Mercurial for tracking your project source code, you can use ``HG`` for the version which will be replaced by the current Mercurial revision, for example ``r382``:: - scrapy deploy scrapyd:project1 --version HG + scrapy deploy scrapyd -p project1 --version HG Support for other version discovery sources may be added in the future. -Finally, if you don't want to specify the target and project every time you run -``scrapy deploy`` you can define the default ones in the ``scrapy.cfg`` file, -like this:: +Finally, if you don't want to specify the target, project and version every +time you run ``scrapy deploy`` you can define the defaults in the +``scrapy.cfg`` file. For example:: [deploy] - target = scrapyd + url = http://scrapyd.mydomain.com/api/scrapyd/ + username = john + password = secret project = project1 + version = HG + +This way, you can deploy your project just by using:: + + scrapy deploy .. _topics-egg-caveats: diff --git a/scrapy/commands/deploy.py b/scrapy/commands/deploy.py index aa2a4e9c5..a8c546de1 100644 --- a/scrapy/commands/deploy.py +++ b/scrapy/commands/deploy.py @@ -18,12 +18,6 @@ from scrapy.utils.multipart import encode_multipart from scrapy.utils.http import basic_auth_header from scrapy.utils.conf import get_config, closest_scrapy_cfg -_DEFAULT_TARGETS = { - 'scrapyd': { - 'url': 'http://localhost:6800/', - }, -} - _SETUP_PY_TEMPLATE = \ """# Automatically created by: scrapy deploy @@ -42,22 +36,24 @@ class Command(ScrapyCommand): requires_project = True def syntax(self): - return "[options] [ | -l | -L ]" + return "[options] [ [target] | -l | -L ]" def short_desc(self): - return "Deploy project in Scrapyd server" + return "Deploy project in Scrapyd target" def long_desc(self): return "Deploy the current project into the given Scrapyd server " \ - "(aka target) and project." + "(known as target)" def add_options(self, parser): ScrapyCommand.add_options(self, parser) + parser.add_option("-p", "--project", + help="the project name in the target") parser.add_option("-v", "--version", help="the version to deploy. Defaults to current timestamp") - parser.add_option("-L", "--list-targets", action="store_true", \ + parser.add_option("-l", "--list-targets", action="store_true", \ help="list available targets") - parser.add_option("-l", "--list-projects", metavar="TARGET", \ + parser.add_option("-L", "--list-projects", metavar="TARGET", \ help="list available projects on TARGET") parser.add_option("--egg", metavar="FILE", help="use the given egg, instead of building it") @@ -79,13 +75,16 @@ class Command(ScrapyCommand): projects = json.loads(f.read())['projects'] print os.linesep.join(projects) return - target, project = _get_target_project(args) - version = _get_version(opts) + target_name = _get_target_name(args) + target = _get_target(target_name) + project = _get_project(target, opts) + version = _get_version(target, opts) tmpdir = None if opts.egg: + _log("Using egg: %s" % opts.egg) egg = open(opts.egg, 'rb') else: - _log("Bulding egg of %s-%s" % (project, version)) + _log("Building egg of %s-%s" % (project, version)) egg, tmpdir = _build_egg() _upload_egg(target, egg, project, version) egg.close() @@ -93,20 +92,21 @@ class Command(ScrapyCommand): shutil.rmtree(tmpdir) def _log(message): - sys.stderr.write("%s\n" % message) + sys.stderr.write(message + os.linesep) -def _get_target_project(args): - if len(args) >= 1 and ':' in args[0]: - target_name, project = args[0].split(':', 1) +def _get_target_name(args): + if len(args) > 1: + raise UsageError("Too many arguments: %s" % ' '.join(args)) + elif args: + return args[0] elif len(args) < 1: - target_name = _get_option('deploy', 'target') - project = _get_option('deploy', 'project') - if not target_name or not project: - raise UsageError(" not given and defaults not found") - else: - raise UsageError("%r is not a " % args[0]) - target = _get_target(target_name) - return target, project + return 'default' + +def _get_project(target, opts): + project = opts.project or target.get('project') + if not project: + raise UsageError("Missing project") + return project def _get_option(section, option, default=None): cfg = get_config() @@ -115,10 +115,15 @@ def _get_option(section, option, default=None): def _get_targets(): cfg = get_config() - targets = _DEFAULT_TARGETS.copy() + baset = dict(cfg.items('deploy')) if cfg.has_section('deploy') else {} + targets = {} + if 'url' in baset: + targets['default'] = baset for x in cfg.sections(): - if x.startswith('deploy_'): - targets[x[7:]] = dict(cfg.items(x)) + if x.startswith('deploy:'): + t = baset.copy() + t.update(cfg.items(x)) + targets[x[7:]] = t return targets def _get_target(name): @@ -130,12 +135,13 @@ def _get_target(name): def _url(target, action): return urljoin(target['url'], action) -def _get_version(opts): - if opts.version == 'HG': +def _get_version(target, opts): + version = opts.version or target.get('version') + if version == 'HG': p = Popen(['hg', 'tip', '--template', '{rev}'], stdout=PIPE) return 'r%s' % p.communicate()[0] - elif opts.version: - return opts.version + elif version: + return version else: return str(int(time.time())) diff --git a/scrapy/templates/project/scrapy.cfg b/scrapy/templates/project/scrapy.cfg index 7c357dc0d..889516a42 100644 --- a/scrapy/templates/project/scrapy.cfg +++ b/scrapy/templates/project/scrapy.cfg @@ -1,2 +1,11 @@ +# Automatically created by: scrapy startproject +# +# For more information about the [deploy] section see: +# http://doc.scrapy.org/topics/scrapyd.html + [settings] default = ${project_name}.settings + +[deploy] +#url = http://localhost:6800/ +project = ${project_name}