Repository: serp-spider/search-engine-google Branch: master Commit: 9f889148e8b3 Files: 156 Total size: 15.4 MB Directory structure: gitextract_vwfvhtj1/ ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── build/ │ └── .gitignore ├── composer.json ├── phpcs.xml ├── phpunit.dist.xml ├── src/ │ ├── AdwordsResultItem.php │ ├── AdwordsResultType.php │ ├── AdwordsSectionResultSet.php │ ├── Exception/ │ │ ├── GoogleCaptchaException.php │ │ └── InvalidDOMException.php │ ├── GoogleClient.php │ ├── GoogleUrl.php │ ├── GoogleUrlArchive.php │ ├── GoogleUrlInterface.php │ ├── GoogleUrlTrait.php │ ├── NaturalResultType.php │ ├── Page/ │ │ ├── GoogleCaptcha.php │ │ ├── GoogleDom.php │ │ ├── GoogleError.php │ │ ├── GoogleSerp.php │ │ └── NotFound.php │ └── Parser/ │ ├── AbstractAdwordsParser.php │ ├── AbstractParser.php │ ├── Evaluated/ │ │ ├── AdwordsParser.php │ │ ├── AdwordsSectionParser.php │ │ ├── MobileAdwordsParser.php │ │ ├── MobileAdwordsSectionParser.php │ │ ├── MobileNaturalParser.php │ │ ├── NaturalParser.php │ │ └── Rule/ │ │ ├── Adwords/ │ │ │ ├── AdwordsItem.php │ │ │ ├── AdwordsItemMobile.php │ │ │ └── Shopping.php │ │ └── Natural/ │ │ ├── AnswerBox.php │ │ ├── Classical/ │ │ │ ├── ClassicalCardsResult.php │ │ │ ├── ClassicalCardsResultO9g5cc.php │ │ │ ├── ClassicalCardsResultZ1m.php │ │ │ ├── ClassicalCardsResultZINbbc.php │ │ │ ├── ClassicalCardsVideoResult.php │ │ │ ├── ClassicalResult.php │ │ │ └── ClassicalWithLargeVideo.php │ │ ├── ComposedTopStories.php │ │ ├── Divider.php │ │ ├── Flight.php │ │ ├── ImageGroup.php │ │ ├── ImageGroupCarousel.php │ │ ├── InTheNews.php │ │ ├── KnowledgeCard.php │ │ ├── Map.php │ │ ├── MapLegacy.php │ │ ├── MapMobile.php │ │ ├── PeopleAlsoAsk.php │ │ ├── SearchResultGroup.php │ │ ├── TopStoriesCarousel.php │ │ ├── TopStoriesVertical.php │ │ ├── TweetsCarousel.php │ │ ├── TweetsCarouselZ1m.php │ │ └── VideoGroup.php │ ├── ParserInterface.php │ └── ParsingRuleInterface.php ├── stubs/ │ └── RelatedSearch.php └── test/ ├── bin/ │ ├── ci.bash │ ├── phpcbf.bash │ ├── phpcs.bash │ └── test.bash ├── resources/ │ ├── pages-evaluated/ │ │ ├── 2018/ │ │ │ ├── 03/ │ │ │ │ ├── asian+massage.html │ │ │ │ ├── plumber+london.html │ │ │ │ ├── qui+est+homer+simpsons.html │ │ │ │ └── super+u+paris.html │ │ │ ├── 07/ │ │ │ │ └── foo+bar(page2).html │ │ │ ├── 09/ │ │ │ │ └── 65b6be0a-7619-4018-97c9-989cdec53319.html │ │ │ ├── 10/ │ │ │ │ ├── agence+web+nantes.html │ │ │ │ └── who+is+homer+simpson.html │ │ │ └── 11/ │ │ │ └── acheter+kobo.html │ │ ├── 2019/ │ │ │ ├── 05/ │ │ │ │ └── plombier+paris.html │ │ │ └── 07/ │ │ │ └── cheap+video+editing+software+mac.html │ │ ├── adwords/ │ │ │ └── simpsons+poster.html │ │ ├── alarmas+para+casa.html │ │ ├── captcha.html │ │ ├── cards-design.html │ │ ├── flights.html │ │ ├── github(with-vertical-top-stories).html │ │ ├── github.html │ │ ├── how+is+homer+simpsons.html │ │ ├── inde(top-stories).html │ │ ├── narendra+modi.html │ │ ├── page-with-bkgrouped-results.html │ │ ├── ransomware.html │ │ ├── shop-near-paris.html │ │ ├── simpsons(related).html │ │ ├── simpsons+donut.html │ │ ├── simpsons+movie+trailer.html │ │ ├── simpsons.html │ │ ├── simpsonsworld.html │ │ └── with-DOMText.html │ ├── pages-mobile/ │ │ ├── 2017/ │ │ │ ├── 11/ │ │ │ │ ├── buy+pen.html │ │ │ │ └── donald+trump.html │ │ │ └── 12/ │ │ │ ├── foo.html │ │ │ └── who+is+homer+simpsons.html │ │ ├── 2018/ │ │ │ ├── 03/ │ │ │ │ └── foo.html │ │ │ ├── 07/ │ │ │ │ └── simpsons-episode-1.html │ │ │ ├── 08/ │ │ │ │ └── new+construction+ct.html │ │ │ └── 11/ │ │ │ └── 01/ │ │ │ └── plombier+nantes.html │ │ ├── simpsons+donuts.html │ │ ├── simpsons+homer.html │ │ └── simpsons+world.html │ ├── pages-raw/ │ │ └── simpsons.html │ └── simple-dom.html └── suites/ ├── AdwordsResultItemTest.php ├── AdwordsSectionResultSetTest.php ├── GoogleClientTest.php ├── GoogleSerpTestCase.php ├── GoogleUrlTest.php ├── Page/ │ ├── GoogleCaptchaTest.php │ ├── GoogleDomTest.php │ └── GoogleSerpTest.php └── Parser/ └── Evaluated/ ├── AdwordsParserTest.php ├── NaturalParserTest.php └── natural-parser-data/ ├── 2018/ │ ├── 03/ │ │ ├── asian+massage.yml │ │ ├── plumber+london.yml │ │ ├── qui+est+homer+simpsons.yml │ │ └── super+u+paris.yml │ ├── 07/ │ │ └── foo+bar(page2).yml │ ├── 09/ │ │ └── 65b6be0a-7619-4018-97c9-989cdec53319.yml │ ├── 10/ │ │ ├── agence+web+nantes.yml │ │ └── who+is+homer+simpson.yml │ └── 11/ │ └── acheter+kobo.yml ├── 2019/ │ ├── 05/ │ │ └── plombier+paris.yml │ └── 07/ │ └── cheap+video+editing+software+mac.yml ├── github(with-vertical-top-stories).yml ├── inde(top-stories).yml ├── mobile/ │ ├── 2017/ │ │ ├── 11/ │ │ │ ├── buy+pen.yml │ │ │ └── mobile-donald+trump.yml │ │ └── 12/ │ │ ├── foo.yml │ │ └── who+is+homer+simpsons.yml │ └── 2018/ │ ├── 03/ │ │ └── foo.yml │ ├── 07/ │ │ └── simpsons-episode-1.yml │ ├── 08/ │ │ └── new-construction-ct.yml │ └── 11/ │ └── 01/ │ └── plombier+nantes.yml ├── mobile-simpsons+donuts.yml ├── mobile-simpsons+homer.yml ├── mobile-simpsons+world.yml ├── narendra+modi.yml ├── natural-cards.yml ├── naturals-data-with_bkgroups.yml ├── naturals-data.yml ├── ransomware.yml ├── simpsons+donuts.yml ├── simpsons+movie+trailer.yml └── simpsonsworld.yml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ ; This file is for unifying the coding style for different editors and IDEs. ; More information at http://editorconfig.org root = true [*] charset = utf-8 indent_size = 4 indent_style = space end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false [*.json] indent_size = 2 [*.yml] indent_size = 2 [*.css] indent_size = 2 [*.scss] indent_size = 2 ================================================ FILE: .gitattributes ================================================ /build export-ignore /script export-ignore /test export-ignore .codeclimate.yml export-ignore .editorconfig export-ignore .gitattributes export-ignore .gitignore export-ignore .travis.yml export-ignore phpunit.dist.xml export-ignore phpcs.xml export-ignore /test/resources/* linguist-vendored ================================================ FILE: .gitignore ================================================ composer.lock /vendor .idea ================================================ FILE: .travis.yml ================================================ language: php dist: trusty sudo: false matrix: include: - php: 5.5 env: PROCESS_CODECLIMATE=true - php: 5.6 - php: 7.0 - php: 7.1 - php: nightly - php: hhvm env: IGNORE_XDEBUG=true fast_finish: true allow_failures: - php: nightly before_script: - if [ -z "$IGNORE_XDEBUG" ];then phpenv config-rm xdebug.ini; fi - travis_retry composer self-update - travis_retry composer update --prefer-dist - if [ -n "$PROCESS_CODECLIMATE" ];then echo 'zend_extension=xdebug.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi script: ./test/bin/ci.bash summary env: global: secure: kBRY5+RxotmB1NwI1GVJ9ndgsANkyuvMSrYtaDqYFdLo5c5Eow0HE+g8hpTkUCGethUz+/b5UzXl/w+ocCl3n4T17MSceLy1cY0gCTG+drRV+vAn8SOHx6QWB2Zp2ixFtQrv6ivOHq8Rjh244jkyDZrnNRjMHUkdUteSOC10o1bBzNpZ2iNR/Tnzr1uU4MilRCq9u2/QtrPZppu2ki0/h0vtb8K0Zi84S8fWHP+Qf8hMgsGTnOl3jhQHwEA/C+OEHAt3V0cxHIZ/rV6CC6k1c91XvCk4kI0gk2C14DIax5TDtvxif+SmlB2nDjRYbeHyTLuiXxJAXttjQ7mWB4w0D3YtxxLLu3h7CPnZjp+BF6KVLfXWu1T2+/WD/snvGChqkwLB/Z2VsTbxzYlXbZSIp13xXDKJa16jH2tWl3mr6o0UsuZq46zBERemoL3LWzj1wy6o2XJvSrbir/AaLZI5OADYhK7ZST95aHnm9QykKQzGNWVBuvYBPjIOQIrqnRGZSBQWMqVZQLjhEr7TR2GenGRdE8gvh3gWbP2yO8sCUUZO7klDSIrnIgMjvawtDautixoqmH9wlXUZgX1H8K2mBWc7ZoxIaVFBUhrv7+fHKM3zoqg6cBXhhAtgYQu5YieaZv9gnl8B77arfriARMAsKsn0Wh/nZP40AwUAk+ZFSps= cache: directories: - $HOME/.composer/cache ================================================ FILE: CHANGELOG.md ================================================ # CHANGELOG ## 0.4.7 *2018-18-05* * Bug fix: * Fixed title for adwords results ## 0.4.6 *2018-30-10* * Feature: * Added adwords results for mobiles * Added map results for mobiles * Bug fix: * Fixed description for mobile classical * Fixed related searches for mobile * Other: * Added ``ext-dom`` in composer.json ## 0.4.5 *2018-30-10* * Bug fix: * Fixed local pack (#113) Thanks @Human018 * Fixed urls for ads results ## 0.4.4 *2018-10-22* * Bug fix: * Fixed people also ask update ## 0.4.3 *2018-09-17* * Bug fix: * Fix google dom update on classical results ## 0.4.2 *2018-08-05* * Bug fix: * fix mobile serps (#106) ## 0.4.1 *2018-07-05* * Bug fix: * fixed multiple mobile issues on mobile results * fixed parsing for number of results (#100) - thanks @migliori * fixed related searches on desktop - thanks @gudix ## 0.4.0 *2018-05-29* * Bug fix: * fixed the captcha exception. The right exception is now returned when a captcha is found * fixed invalid type hinting causing errors with hhvm * Google updates: * **bc break** removed support for image captcha as google now uses recaptcha * Other: * When an invalid classical result is found, throw an exception instead of returning invalid results causing fatal errors. ## 0.3.0 *2018-04-04* * Dependencies * **bc break** use version ``0.3.x`` of ``serps/core`` * Updates * **bc break** google url default domain is now ``"www.google.com`` instead of ``google.com``. This way we avoid extra redirects too the ``"www"`` subdomain. * Fix a bug with search result group parser that was triggering a php error. * Dom Updates * Fix parsing for classical results on mobiles. * Fix parsing for knowledge cards on mobiles. ## 0.2.5 *2018-03-29* * Bug fix: * Fix a bug with map results introduced in version 0.2.4 see [#94](https://github.com/serp-spider/search-engine-google/issues/94) ## 0.2.4 *2018-03-22* * Bug fix: * Fix google update for map results * Fix google update for "destination" data in classical results * Fix google update for People Also Ask * Fix google update for answer box [#90](https://github.com/serp-spider/search-engine-google/issues/90) ## 0.2.3 *2017-12-11* * Features: * Added parsing for people also ask results [#70](https://github.com/serp-spider/search-engine-google/issues/70) * Bug fix: * Fix some mobile card results not parsing [#83](https://github.com/serp-spider/search-engine-google/issues/83) ## 0.2.2 *2017-11-25* * Bug fix: * Parse ``bkWMgd`` groups (thanks to [Shiftas](https://github.com/Shiftas)) [#76](https://github.com/serp-spider/search-engine-google/issues/76) * Fix result count [#76](https://github.com/serp-spider/search-engine-google/issues/76) * Fix some mobile card results not parsing [#79](https://github.com/serp-spider/search-engine-google/issues/79) and [#78](https://github.com/serp-spider/search-engine-google/issues/78) * Fix twitter carousel parser for mobile [#81](https://github.com/serp-spider/search-engine-google/issues/81) * Fix related searches for mobile [#80](https://github.com/serp-spider/search-engine-google/issues/81) * Features: * Parsing for "composed top stories" and standardizing old "top stories" [#67](https://github.com/serp-spider/search-engine-google/issues/67) * Other: * Dependency to serps/core was updated from ~0.2.0 to ~0.2.4 ## 0.2.1 *2017-07-16* * Features: * Parsing for mobile knowledge results (fd95ffc07c137223e36fade739b4617c17fe6758) * Bug fix * Fixing tweet carousel recognition (4f681da0435454b5ff592c657789010ccf8361ee) * Fixing tweet carousel non linked to an user ## 0.2.0 *2017-05-01* * Breaking Changes: * Images data are returned MediaInterface [#35](https://github.com/serp-spider/search-engine-google/issues/35) * Drop support for raw parser [5f41ddeb6a9076b363a83071e0f27a0254f1e330](https://github.com/serp-spider/search-engine-google/commit/5f41ddeb6a9076b363a83071e0f27a0254f1e330) * ``Serps\SearchEngine\Google\GoogleDom`` now extends ``Serps\Core\Dom\WebPage`` [dafe67e](https://github.com/serp-spider/search-engine-google/commit/dafe67eeae3eb46bb570fdc3eadd22d4abe47b7d) * ``Serps\SearchEngine\Google\GoogleError`` now extends ``Serps\Core\Dom\WebPage`` and does not extend ``Serps\SearchEngine\Google\GoogleDom`` anymore [dafe67e](https://github.com/serp-spider/search-engine-google/commit/dafe67eeae3eb46bb570fdc3eadd22d4abe47b7d) * Class ``Serps\SearchEngine\Google\Css`` was removed and an equivalent is now provided from the core package in ``Serps\Core\Dom\Css`` [4e5b1a1](https://github.com/serp-spider/search-engine-google/commit/4e5b1a193abfe5093a48152b12878e7cef022b7b) * Vendor ``symfony/css-selector`` is not provided anymore, instead it moved in core package [4e5b1a1](https://github.com/serp-spider/search-engine-google/commit/4e5b1a193abfe5093a48152b12878e7cef022b7b) * ``GoogleClient::query($googleUrl, $proxy, $cookieJar)`` was refactored to ``GoogleClient::query($googleUrl, $browser)`` in order to provide a more fluent management of browser specifications [a6fe671](https://github.com/serp-spider/search-engine-google/commit/a6fe6711d6fac42977cfc30212e438d8ab933584) * ``GoogleClient::query`` does not auto set language header anymore, that's now done from the browser instance [a6fe671](https://github.com/serp-spider/search-engine-google/commit/a6fe6711d6fac42977cfc30212e438d8ab933584) * ``GoogleClient::request`` and ``GoogleClient::getRequestBuilder()`` were removed and are replaced with browser implementation [a6fe671](https://github.com/serp-spider/search-engine-google/commit/a6fe6711d6fac42977cfc30212e438d8ab933584) * class ``Serps\SearchEngine\Google\GoogleClient\RequestBuilder`` was removed * fix the typo in the interface name ``ParsingRuleInterace`` that is now ``ParsingRuleInterface`` * Method ``ParsingRuleInterace::match(GoogleDom $dom, \DOMElement $node)`` is now ``ParsingRuleInterace::match(GoogleDom $dom, \Serps\Core\Dom\DomElement $node)`` * the property ``is_carousel`` from top stories is now named ``isCarousel`` * Features: * Google cards results are now supported [#38](https://github.com/serp-spider/search-engine-google/pull/38) * Mobile page detection: GoogleSerp::isMobile() [564057ce0ee255cfa138440e033776b85f239acb](https://github.com/serp-spider/search-engine-google/commit/564057ce0ee255cfa138440e033776b85f239acb) * Mobile results have now their own parser * Parsing rule for mobile video groups [#41](https://github.com/serp-spider/search-engine-google/issues/41) * Parsing rule for mobile image groups * Bug fixes: * Large video have the CLASSICAL type as mentioned in the doc [#36](https://github.com/serp-spider/search-engine-google/issues/36) ================================================ FILE: CONTRIBUTING.md ================================================ CONTRIBUTING ============ Any contribution is welcome. Issue ----- If you encounter an issue with the library you are encouraged to report it and we can work together on solving it. Before submitting the issue please make sure you are using the latest version of serps/search-engine-google. If you are and if you still have the issue you can report it on the [issue tracker](https://github.com/serp-spider/search-engine-google/issues/new). When reporting an issue try to provide as much details as possible. If the issue is related to a page that cannont parse correctly, the following details will be very helpful to fix the issue: - The url that fails to parse - What is expected - What you are getting - You might attach the html of the page that does not parse - You might send screenshot of what is notparsing correctly Code contribution ----------------- ### Tests All contributions must be tested following as much as possible the current test structure. Look at current tests in ``test/suites`` for more details. ### Coding Standards The code follows the PSR-2 coding standards. We provided two useful commands to check and fix automatically code standards: - Checking standards: ``composer cscheck`` - Fixing standards: ``composer csfix`` ### Tools - run full test suit: ``composer test`` - run some tests only: ``composer test testName`` (``testName`` will be used in [phpunit --filter](https://phpunit.de/manual/current/en/textui.html#textui.examples.filter-patterns)) ================================================ FILE: LICENSE ================================================ Copyright (c) 2015-today, Soufiane GHZAL and contributors Usage of the works is permitted provided that this instrument is retained with the works, so that any entity that uses the works is notified of this instrument. DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. ================================================ FILE: README.md ================================================ SERPS - Search Engine: Google ============================= [![Build Status](https://travis-ci.org/serp-spider/search-engine-google.svg?branch=master)](https://travis-ci.org/serp-spider/search-engine-google) [![Test Coverage](https://codeclimate.com/github/serp-spider/search-engine-google/badges/coverage.svg)](https://codeclimate.com/github/serp-spider/search-engine-google/coverage) [![Latest Stable Version](https://poser.pugx.org/serps/search-engine-google/version)](https://packagist.org/packages/serps/search-engine-google) [![License](https://poser.pugx.org/serps/search-engine-google/license)](https://packagist.org/packages/serps/search-engine-google) This is the Google implementation for [SERPS](https://github.com/serp-spider/serps) Install ------- Install it through [composer](https://getcomposer.org/) with the package [serps/search-engine-google](https://packagist.org/packages/serps/search-engine-google) : ``composer require --prefer-dist 'serps/search-engine-google'`` Note: it is recommended to use ``--prefer-dist`` to avoid downloading html test files. Documentation ------------- Browse the [documentation](http://serp-spider.github.io/documentation/search-engine/google/) Disclaimer ----------- > Using our Services does not give you ownership of any intellectual property rights in > our Services or the content you access. > You may not use content from our Services unless you obtain permission from its owner or > are otherwise permitted by law > > Extract from [Google terms of services](https://www.google.com/policies/terms/) When using this software must respect terms of services of third parties like Google. Serps authors and contributors cannot be hold as liable for the use you make of this software. ================================================ FILE: build/.gitignore ================================================ * !.gitignore ================================================ FILE: composer.json ================================================ { "name": "serps/search-engine-google", "description": "Google Rules and client for SERPS", "type": "library", "keywords": ["SERPS", "Google"], "homepage": "https://github.com/serp-spider/search-engine-google", "license": "Fair", "minimum-stability": "dev", "prefer-stable": true, "authors": [ { "name": "Soufiane GHZAL", "homepage": "https://github.com/gsouf" } ], "autoload":{ "psr-4" : { "Serps\\SearchEngine\\Google\\": "src/" } }, "autoload-dev":{ "psr-4" : { "Serps\\Test\\SearchEngine\\Google\\": "test/suites" } }, "require": { "php": ">=5.5", "serps/core": "~0.3.0", "ext-dom": "*" }, "require-dev":{ "phpunit/phpunit": "~4.1", "symfony/yaml": ">=2.0", "squizlabs/php_codesniffer": "~3.2", "guzzlehttp/psr7": "^1.4", "serps/cli": "^1.1" }, "suggest": { "zendframework/zend-diactoros": "For http request", "guzzlehttp/psr7": "For http request" }, "scripts": { "phpunit": "test/bin/test.bash", "test": [ "@phpunit", "@cscheck" ], "csfix": "test/bin/phpcbf.bash", "cscheck": "test/bin/phpcs.bash emacs" }, "extra": { "branch-alias": { "dev-master": "0.3.0-dev" } } } ================================================ FILE: phpcs.xml ================================================ ./src/ ./test/suites ./test/* 0 ./test/* ================================================ FILE: phpunit.dist.xml ================================================ test/suites ./vendor ./doc ./script ./test ./src ================================================ FILE: src/AdwordsResultItem.php ================================================ location = $location; parent::__construct($itemData); } public function getTypes() { $types = parent::getTypes(); $types[] = $this->location; return $types; } public function is($types) { $types = func_get_args(); if (in_array($this->location, $types)) { return true; } return call_user_func_array(['parent', 'is'], $types); } } ================================================ FILE: src/AdwordsResultType.php ================================================ location = $location; parent::__construct(1); } /** * @param ResultDataInterface $item */ public function addItem(ResultDataInterface $item) { $this->items[] = new AdwordsResultItem( $this->location, $item ); } } ================================================ FILE: src/Exception/GoogleCaptchaException.php ================================================ defaultBrowser = $browser; } /** * @param GoogleUrlInterface $googleUrl * @param BrowserInterface|null $browser * @return GoogleSerp * @throws Exception * @throws PageNotFoundException * @throws InvalidResponseException * @throws PageNotFoundException * @throws GoogleCaptchaException */ public function query(GoogleUrlInterface $googleUrl, BrowserInterface $browser = null) { if ($googleUrl->getResultType() !== GoogleUrl::RESULT_TYPE_ALL) { throw new Exception( 'The requested url is not valid for the google client.' . 'Google client only supports general searches. See GoogleUrl::setResultType() for more infos.' ); } if (null === $browser) { $browser = $this->defaultBrowser; } if (!$browser) { throw new Exception('No browser given for query and no default browser was found'); } $response = $browser->navigateToUrl($googleUrl); $statusCode = $response->getHttpResponseStatus(); $effectiveUrl = GoogleUrlArchive::fromString($response->getEffectiveUrl()->__toString()); if (200 == $statusCode) { return new GoogleSerp($response->getPageContent(), $effectiveUrl); } else { if (404 == $statusCode) { throw new PageNotFoundException($response); } else { $errorDom = new GoogleError($response->getPageContent(), $effectiveUrl); if ($errorDom->isCaptcha()) { throw new GoogleCaptchaException(new GoogleCaptcha($errorDom)); } else { throw new InvalidResponseException( $response, sprintf( "The http response from %s has an invalid status code: '%d'", $response->getInitialUrl(), $statusCode ) ); } } } } } ================================================ FILE: src/GoogleUrl.php ================================================ setParam('lr', $lang); return $this; } /** * Set the page number of the page. Starting from 1 * @param int $pageNumber * @return $this */ public function setPage($pageNumber) { $pageNumber--; if ($pageNumber <= 0) { $this->removeParam('start'); } else { $this->setParam('start', $pageNumber * $this->getResultsPerPage()); } return $this; } /** * Changes the number of results per page. Between 1 and 100 * @param int $number number of results per page */ public function setResultsPerPage($number) { if ($number < 1) { $number = 1; } elseif ($number > 100) { // Google limits it too 100 $number = 100; } // page backup (see below) $currentPage = $this->getPage(); if ($number == 10) { $this->removeParam('num'); } else { $this->setParam('num', $number); } // need to refresh the page because it's based on the index of the first item $this->setPage($currentPage); } /** * Set the keywords to search * @param $search * @return $this */ public function setSearchTerm($search) { $this->setParam('q', $search); return $this; } /** * This allows to enable or disable google auto-correction * @param bool $enabled by default auto correction is enable, set it to false to disable it */ public function setAutoCorrectionEnabled($enabled) { if ($enabled) { $this->removeParam('nfpr'); } else { $this->setParam('nfpr', 1); } } /** * Sets the google result type. That's the result type in the top bar 'all', 'images', 'videos'... * You can use the special constant beginning with ``RESULT_TYPE_`` e.g: ``GoogleUrl::RESULT_TYPE_IMAGES`` * * @param $resultType */ public function setResultType($resultType) { if ($resultType == self::RESULT_TYPE_ALL) { $this->removeParam('tbm'); } else { $this->setParam('tbm', $resultType); } } } ================================================ FILE: src/GoogleUrlArchive.php ================================================ getResultsPerPage(); return 1 + $this->getParamValue('start', 0) / ($resultsPerPage > 0 ? $resultsPerPage : 10); } /** * @return string */ public function getLanguageRestriction() { return $this->getParamValue('lr', null); } /** * Get the number of results per pages * @return int the number of results per pages */ public function getResultsPerPage() { return $this->getParamValue('num', 10); } /** * Get the google result type. That's the result type in the top bar 'all', 'images', 'videos'... * You can use the special constant beginning with ``RESULT_TYPE_`` e.g: ``GoogleUrl::RESULT_TYPE_IMAGES`` * @return string */ public function getResultType() { return $this->getParamValue('tbm', GoogleUrl::RESULT_TYPE_ALL); } /** * Check whether or not the auto correction of search term is enabled * @return bool true if it enabled (it is by default) */ public function getAutoCorrectionEnabled() { return 1 == $this->getParamValue('nfpr'); } /** * Get the keywords to search * @return string */ public function getSearchTerm() { return $this->getParamRawValue('q'); } public function getArchive() { return new GoogleUrlArchive( $this->getHost(), $this->getPath(), $this->getScheme(), $this->getParams(), $this->getHash() ); } } ================================================ FILE: src/NaturalResultType.php ================================================ googleError = $googleError; } /** * @return GoogleError */ public function getErrorPage() { return $this->googleError; } public function getCaptchaType() { return self::CAPTCHA_TYPE_RECAPTCHAV2; } /** * Gets the captcha image. Be aware that each call to this method will regenerate the captcha image * and the previous generated image will be invalid * @return string * @throws Exception */ public function getData() { return null; } public function getDetectedIp() { $ipV4 = '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'; $ipV6 = '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'; $regexp = "/($ipV4|$ipV6)/"; $hasMatch = preg_match($regexp, $this->googleError->getDom()->C14N(), $match); if ($hasMatch) { return $match[1]; } else { return null; } } } ================================================ FILE: src/Page/GoogleDom.php ================================================ getParamValue('oe'); if (!$currentEncoding) { $currentEncoding = 'UTF-8'; } parent::__construct($domString, $url, $currentEncoding); } /** * Get a property from a google json node. * Google json nodes are invisible dom nodes that contain json text (found in mobile carousels for instance) * * @param string $propertyName name of the property to get * @param \DOMNode $node * @return mixed */ public function getJsonNodeProperty($propertyName, \DOMNode $node) { $hash = spl_object_hash($node); if (!isset($this->parsedJsonStore[$hash])) { $nodeValue = $node->nodeValue; $nodeValue = trim($nodeValue, '"'); $this->parsedJsonStore[$hash] = json_decode($nodeValue, true); } $item = $this->parsedJsonStore[$hash]; if ($item && is_array($item) && isset($item[$propertyName])) { return $item[$propertyName]; } else { return null; } } } ================================================ FILE: src/Page/GoogleError.php ================================================ cssQuery('#recaptcha')->count() > 0; } } ================================================ FILE: src/Page/GoogleSerp.php ================================================ dom->C14N(), $matches); if ($matches && isset($matches[1])) { return $matches[1]; } return null; } /** * @return \Serps\Core\Serp\IndexedResultSet */ public function getNaturalResults() { if ($this->javascriptIsEvaluated()) { if ($this->isMobile()) { $parser = new MobileNaturalParser(); } else { $parser = new NaturalParser(); } } else { throw new InvalidDOMException('Raw dom is not supported, please provide an evaluated version of the dom'); } return $parser->parse($this); } /** * @return \Serps\Core\Serp\CompositeResultSet * @throws Exception * @throws InvalidDOMException */ public function getAdwordsResults() { if ($this->javascriptIsEvaluated()) { if ($this->isMobile()) { $parser = new MobileAdwordsParser(); } else { $parser = new AdwordsParser(); } return $parser->parse($this); } else { throw new InvalidDOMException('Raw dom is not supported, please provide an evaluated version of the dom'); } } /** * Get the total number of results available for the search terms * @return int the number of results * @throws InvalidDOMException */ public function getNumberOfResults() { $item = $this->cssQuery('#resultStats'); if ($item->length != 1) { return null; } // number of results is followed by time, we want to targets the first node (text node) that is the number of // results $nodeValue = $item->getNodeAt(0)->getChildren()->getNodeAt(0)->getNodeValue(); if (!$nodeValue) { return null; } // WARNING: The number of result is explained in different format according to the country. Fon instance: // UK: 6,200,000 // FR: 6 200 000 // DE: 2.200.000 // IN: 62,00,000 // We have to use a global matcher $matched = preg_match_all('/([0-9]+[^0-9]?)+/u', $nodeValue, $countMatch); if (!$matched) { return null; } // get the last count, when we use pagination the first count is the page number // see https://github.com/serp-spider/search-engine-google/issues/100 $count = $countMatch[0][count($countMatch[0]) - 1]; return (int) preg_replace('/[^0-9]/', '', $count); } public function javascriptIsEvaluated() { $body = $this->getXpath()->query('//body'); if ($body->length != 1) { throw new Exception('No body found'); } $body = $body->item(0); /** @var $body \DOMElement */ $class = $body->getAttribute('class'); if ($class=='hsrp') { return false; } elseif (strstr($class, 'srp')) { return true; } else { throw new InvalidDOMException('Unable to check javascript status.'); } } /** * @return array|RelatedSearch[] */ public function getRelatedSearches() { $relatedSearches = []; if ($this->isMobile()) { $items = $this->cssQuery('#botstuff div:not(#bres) a.QsZ7bb'); if ($items->length == 0) { // TODO BC version to remove $items = $this->cssQuery('#botstuff div:not(#bres)>._Qot>div>a'); } if ($items->length > 0) { foreach ($items as $item) { /* @var $item \DOMElement */ $result = new \stdClass(); $result->title = $item->childNodes->item(0)->nodeValue; $result->url = $this->getUrl()->resolveAsString($item->getAttribute('href')); $relatedSearches[] = $result; } } } else { $items = $this->cssQuery('#brs ._e4b>a, #brs .card-section a'); // TODO ._ed4 is outdated if ($items->length > 0) { foreach ($items as $item) { /* @var $item \DOMElement */ $result = new \stdClass(); $result->title = $item->nodeValue; $result->url = $this->getUrl()->resolveAsString($item->getAttribute('href')); $relatedSearches[] = $result; } } } return $relatedSearches; } public function isMobile() { $item = $this->cssQuery('head meta[name="viewport"]'); return $item->length == 1; } } ================================================ FILE: src/Page/NotFound.php ================================================ parsers) { $this->parsers = $this->generateParsers(); } return $this->parsers; } /** * @inheritdoc */ public function parse(GoogleDom $googleDom) { $resultsSets = new CompositeResultSet(); $parsers = $this->getParsers(); foreach ($parsers as $parser) { $resultsSets->addResultSet( $parser->parse($googleDom) ); } return $resultsSets; } } ================================================ FILE: src/Parser/AbstractParser.php ================================================ rules) { $this->rules = $this->generateRules(); } return $this->rules; } /** * Parses the given google dom * @param GoogleDom $googleDom * @return IndexedResultSet */ public function parse(GoogleDom $googleDom) { $elementGroups = $this->getParsableItems($googleDom); $resultSet = $this->createResultSet($googleDom); return $this->parseGroups($elementGroups, $resultSet, $googleDom); } /** * Defines what resultset to use for results * @param GoogleDom $googleDom * @return IndexedResultSet */ protected function createResultSet(GoogleDom $googleDom) { $startingAt = (int) $googleDom->getUrl()->getParamValue('start', 0); return new IndexedResultSet($startingAt + 1); } /** * @param $elementGroups * @param IndexedResultSet $resultSet * @param $googleDom * @return IndexedResultSet */ protected function parseGroups(DomNodeList $elementGroups, IndexedResultSet $resultSet, $googleDom) { $rules = $this->getRules(); foreach ($elementGroups as $group) { if (!($group instanceof \DOMElement)) { continue; } foreach ($rules as $rule) { $match = $rule->match($googleDom, $group); if ($match instanceof \DOMNodeList) { $this->parseGroups(new DomNodeList($match, $googleDom), $resultSet, $googleDom); break; } elseif ($match instanceof DomNodeList) { $this->parseGroups($match, $resultSet, $googleDom); break; } else { switch ($match) { case ParsingRuleInterface::RULE_MATCH_MATCHED: $rule->parse($googleDom, $group, $resultSet); break 2; case ParsingRuleInterface::RULE_MATCH_STOP: break 2; } } } } return $resultSet; } } ================================================ FILE: src/Parser/Evaluated/AdwordsParser.php ================================================ pathToItems = $pathToItems; $this->location = $location; } /** * @inheritdoc */ protected function createResultSet(GoogleDom $googleDom) { return new AdwordsSectionResultSet($this->location); } /** * @inheritdoc */ protected function generateRules() { return [ new AdwordsItem(), new Shopping() ]; } /** * @inheritdoc */ protected function getParsableItems(GoogleDom $googleDom) { return $googleDom->xpathQuery($this->pathToItems); } } ================================================ FILE: src/Parser/Evaluated/MobileAdwordsParser.php ================================================ getXpath(); $xpathElementGroups = "//div[@id = 'ires']/*[@id = 'rso']/*"; return $xpathObject->query($xpathElementGroups); } } ================================================ FILE: src/Parser/Evaluated/NaturalParser.php ================================================ xpathQuery("//*[@id = 'rso']/*"); } } ================================================ FILE: src/Parser/Evaluated/Rule/Adwords/AdwordsItem.php ================================================ getAttribute('class') == 'ads-ad') { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'title' => function () use ($googleDOM, $node) { $aTag = $googleDOM->getXpath()->query('descendant::h3/a[2]', $node)->item(0); if (!$aTag) { $aTag = $googleDOM->getXpath()->query('descendant::h3', $node)->item(0); if (!$aTag) { return null; } } return $aTag->nodeValue; }, 'url' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query('descendant::h3/a[2]', $node)->item(0); // TODO remove if (!$aTag) { $aTag = $googleDOM->cssQuery('a', $node)->item(0); if (!$aTag) { throw new InvalidDOMException('Cannot find ads anchor'); } } return $googleDOM->getUrl()->resolveAsString($aTag->getAttribute('href')); }, 'visurl' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query( Css::toXPath('div.ads-visurl>cite'), $node )->item(0); if (!$aTag) { return null; } return $aTag->nodeValue; }, 'description' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query( Css::toXPath('div.ads-creative'), $node )->item(0); if (!$aTag) { return null; } return $aTag->nodeValue; }, ]; $resultSet->addItem(new BaseResult(AdwordsResultType::AD, $item)); } } ================================================ FILE: src/Parser/Evaluated/Rule/Adwords/AdwordsItemMobile.php ================================================ hasClass('ads-fr')) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } /** * @inheritdoc */ public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'title' => function () use ($googleDOM, $node) { $aTag = $googleDOM->cssQuery('a .MUxGbd.v0nnCb', $node)->item(0); if (!$aTag) { throw new InvalidDOMException('Cannot find title for mobile adwords.'); } return $aTag->nodeValue; }, 'url' => function () use ($node, $googleDOM) { $aTag = $googleDOM->cssQuery('a', $node)->item(0); if (!$aTag) { throw new InvalidDOMException('Cannot find ads anchor'); } return $googleDOM->getUrl()->resolveAsString($aTag->getAttribute('href')); }, 'visurl' => function () use ($node, $googleDOM) { return $googleDOM->cssQuery('.qzEoUe', $node)->getNodeAt(0)->getNodeValue(); }, 'description' => function () use ($node, $googleDOM) { return $googleDOM->cssQuery('div.BmP5tf>div.MUxGbd', $node) ->getNodeAt(0) ->getNodeValue(); }, ]; $resultSet->addItem(new BaseResult(AdwordsResultType::AD, $item)); } } ================================================ FILE: src/Parser/Evaluated/Rule/Adwords/Shopping.php ================================================ getAttribute('class'); if (strpos(' ' . $class . ' ', ' _oc ')) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'products' => function () use ($googleDOM, $node) { $items = []; $xpathCards = Css::toXPath('.pla-unit'); $productNodes = $googleDOM->getXpath()->query($xpathCards, $node); foreach ($productNodes as $productNode) { $items[] = $this->parseItem($googleDOM, $productNode); } return $items; } ]; $resultSet->addItem(new BaseResult(AdwordsResultType::SHOPPING_GROUP, $item)); } public function parseItem(GoogleDom $googleDOM, \DOMNode $node) { return new BaseResult(AdwordsResultType::SHOPPING_GROUP_PRODUCT, [ 'title' => function () use ($googleDOM, $node) { $aTag = $googleDOM->getXpath()->query(Css::toXPath('.pla-unit-title-link'), $node)->item(0); if (!$aTag) { return null; } return $aTag->nodeValue; }, 'url' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query(Css::toXPath('.pla-unit-title-link'), $node)->item(0); if (!$aTag) { return $googleDOM->getUrl()->resolve('/'); } return $googleDOM->getUrl()->resolveAsString($aTag->getAttribute('href')); }, 'image' => function () use ($node, $googleDOM) { $imgTag = $googleDOM->getXpath()->query( Css::toXPath('.pla-unit-img-container-link img'), $node )->item(0); if (!$imgTag) { return null; } return $imgTag->getAttribute('src'); }, 'target' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query( Css::toXPath('div._mC span.a'), $node )->item(0); if (!$aTag) { return null; } return $aTag->nodeValue; }, 'price' => function () use ($node, $googleDOM) { $priceTag = $googleDOM->getXpath()->query( Css::toXPath('._QD._pvi'), $node )->item(0); if (!$priceTag) { return null; } return $priceTag->nodeValue; } ]); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/AnswerBox.php ================================================ getAttribute('class') == 'g mnr-c g-blk' && ( $dom->cssQuery('.ifM9O', $node)->length == 1 || $dom->cssQuery('._Z7', $node)->length == 1 // TODO used for BC, remove in the future ) ) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } protected function parseNode(GoogleDom $dom, \DOMElement $node) { return [ 'title' => function () use ($dom, $node) { $aTag = $dom->cssQuery('.rc .r a', $node) ->item(0); if (!$aTag) { // TODO ERROR return; } if ($h3Tag = $dom->cssQuery('h3', $aTag)->item(0)) { return $h3Tag->getNodeValue(); } return $aTag->nodeValue; }, 'url' => function () use ($dom, $node) { $aTag = $dom->cssQuery('.rc .r a', $node) ->item(0); if (!$aTag) { // TODO ERROR return; } return $dom->getUrl()->resolveAsString($aTag->getAttribute('href')); }, 'destination' => function () use ($dom, $node) { $citeTag = $dom->cssQuery('.rc .s cite', $node) ->item(0); if (!$citeTag) { // TODO ERROR return; } return $citeTag->nodeValue; }, 'description' => function () use ($dom, $node) { // TODO "mod ._Tgc" kept for BC, remove in the future $citeTag = $dom->cssQuery('.mod ._Tgc, .mod .Y0NH2b', $node) ->item(0); if (!$citeTag) { // TODO ERROR return; } return $citeTag->nodeValue; }, ]; } public function parse(GoogleDom $dom, \DOMElement $node, IndexedResultSet $resultSet) { $item = new BaseResult( [NaturalResultType::ANSWER_BOX], $this->parseNode($dom, $node) ); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalCardsResult.php ================================================ hasClass('mnr-c')) { $hasgblk = $node->hasClass('g-blk'); // class g-blk is common to classical large, answer box, and some other cards results, // but not present on base classical results // class ._Hi is unique to large classical results if (( !$hasgblk || ($hasgblk && $dom->cssQuery('._Hi', $node)->length == 1) ) && $dom->cssQuery('.rc', $node)->length == 1 ) { return self::RULE_MATCH_MATCHED; } } return self::RULE_MATCH_NOMATCH; } /** * Is large dectection is not the same for cards and non cards classical results * @param GoogleDom $dom * @param \DomElement $node * @return bool */ protected function isLarge(GoogleDom $dom, \DomElement $node) { return $dom->cssQuery('._Hi', $node)->length == 1; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalCardsResultO9g5cc.php ================================================ cssQuery('.O9g5cc.xpd a.C8nzq', $node); // TODO consider removing .ZINbbc (replaced with .O9g5cc in august 2018) if ($res->length == 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $classicalData = $this->parseNode($dom, $node); $resultTypes = [NaturalResultType::CLASSICAL]; $item = new BaseResult($resultTypes, $classicalData); $resultSet->addItem($item); } protected function parseNode(GoogleDom $dom, DomNodeInterface $node) { return [ 'title' => function () use ($dom, $node) { return $dom ->cssQuery('a .MUxGbd', $node) ->getNodeAt(0) ->getNodeValue(); }, 'isAmp' => function () use ($dom, $node) { return $dom ->cssQuery('.ZseVEf', $node) ->length > 0; }, 'url' => function () use ($dom, $node) { return $dom ->cssQuery('a.C8nzq', $node) ->getNodeAt(0) ->getAttribute('href'); }, 'destination' => function () use ($dom, $node) { return $dom ->cssQuery('span.QHTnWc, span.qzEoUe', $node) // TODO ".QHTnWc" appears to be outdated ->getNodeAt(0) ->getNodeValue(); }, 'description' => function () use ($dom, $node) { // TODO remove BC with ".JTuIPc:not(a)>.MUxGbd" return $dom ->cssQuery('.JTuIPc:not(a)>.MUxGbd, div.BmP5tf>div.MUxGbd, div.LZ8hH>div.MUxGbd', $node) ->getNodeAt(0) ->getNodeValue(); } ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalCardsResultZ1m.php ================================================ childNodes->length == 1) { $childNode = $node->getChildren()->getNodeAt(0); // TODO _Z1m results appear to be outdated // check if has class _Z1m if ($childNode->hasClass('_Z1m')) { // check _a5r if ($node->childNodes->item(0)->childNodes->length == 1) { /** @var DomElement $subChildNode */ $subChildNode = $childNode->childNodes->item(0); if ($subChildNode->hasClass('_a5r')) { return self::RULE_MATCH_MATCHED; } } // check a._Olt._bCp if ($dom->cssQuery('a._Olt._bCp', $node)->length > 0) { return self::RULE_MATCH_MATCHED; } } } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $data = $this->parseNode($dom, $node->childNodes->item(0)); $resultTypes = [NaturalResultType::CLASSICAL]; $item = new BaseResult($resultTypes, $data); $resultSet->addItem($item); } protected function parseNode(GoogleDom $dom, DomElement $node) { return [ 'title' => function () use ($dom, $node) { return $dom ->cssQuery('._ees', $node) ->item(0) ->nodeValue; }, 'isAmp' => function () use ($dom, $node) { return $dom ->cssQuery('.amp_r', $node) ->length > 0; }, 'url' => function () use ($dom, $node) { return $dom ->cssQuery('a._Olt', $node) ->item(0) ->getAttribute('href'); }, 'destination' => function () use ($dom, $node) { return $dom ->cssQuery('span._Clt', $node) ->item(0) ->nodeValue; }, 'description' => function () use ($dom, $node) { $res = $dom ->cssQuery('div>div._bCp>div._H1m', $node); if ($res->length > 0) { return $res->item(0)->getNodeValue(); } else { return null; } } ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalCardsResultZINbbc.php ================================================ cssQuery('.ZINbbc.xpd a.C8nzq', $node); if ($res->length == 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $classicalData = $this->parseNode($dom, $node); $resultTypes = [NaturalResultType::CLASSICAL]; $item = new BaseResult($resultTypes, $classicalData); $resultSet->addItem($item); } protected function parseNode(GoogleDom $dom, DomNodeInterface $node) { return [ 'title' => function () use ($dom, $node) { return $dom ->cssQuery('a .pIpgAc', $node) ->getNodeAt(0) ->getNodeValue(); }, 'isAmp' => function () use ($dom, $node) { return $dom ->cssQuery('.ZseVEf', $node) ->length > 0; }, 'url' => function () use ($dom, $node) { return $dom ->cssQuery('a.C8nzq', $node) ->getNodeAt(0) ->getAttribute('href'); }, 'destination' => function () use ($dom, $node) { return $dom ->cssQuery('span.QHTnWc, span.qzEoUe', $node) // TODO ".QHTnWc" appears to be outdated ->getNodeAt(0) ->getNodeValue(); }, 'description' => function () use ($dom, $node) { $res = $dom ->cssQuery('.JTuIPc', $node); if ($res->length > 1) { return $dom->cssQuery('.pIpgAc', $res->getNodeAt(1))->getNodeAt(0)->getNodeValue(); } else { return null; } } ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalCardsVideoResult.php ================================================ cssQuery('.A995L', $node)->length) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } else { return $match; } } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $resultTypes = [NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL_VIDEO]; $item = new BaseResult($resultTypes, [ 'title' => function () use ($dom, $node) { return $dom->cssQuery('h3 a', $node)->getNodeAt(0)->getNodeValue(); }, 'url' => function () use ($dom, $node) { return $dom->getUrl()->resolveAsString( $dom->cssQuery('h3 a', $node)->getNodeAt(0)->getAttribute('href') ); }, 'destination' => function () use ($dom, $node) { return $dom->cssQuery('.RXIhdf', $node)->getNodeAt(0)->getNodeValue(); }, 'description' => '', 'isAmp' => false, 'videoLarge' => false, 'videoCover' => function () use ($dom, $node) { return MediaFactory::createMediaFromSrc( $dom->cssQuery('.A995L a img', $node)->getNodeAt(0)->getAttribute('src') ); } ]); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalResult.php ================================================ getAttribute('class') == 'g') { if ($dom->cssQuery('.rc', $node)->length == 1) { return self::RULE_MATCH_MATCHED; } } return self::RULE_MATCH_NOMATCH; } protected function parseNode(GoogleDom $dom, \DomElement $node) { // find the title/url /* @var $aTag \DOMElement */ $aTag = $dom ->xpathQuery("descendant::*[(self::div or self::h3) and @class='r'][1]/a", $node) ->item(0); if (!$aTag) { throw new InvalidDOMException('Cannot parse a classical result.'); } /* @var $h3Tag \DOMElement */ $h3Tag = $dom ->xpathQuery('descendant::h3', $node) ->item(0); if (!$h3Tag) { throw new InvalidDOMException('Cannot parse a classical result.'); } $destinationTag = $dom ->cssQuery('div.f cite, div.TbwUpd cite', $node) ->getNodeAt(0); if (is_a($destinationTag, Serps\Core\Dom\NullDomNode::class)) { throw new InvalidDOMException('Cannot parse a classical result.'); } $descriptionTag = $dom ->xpathQuery("descendant::span[@class='st']", $node) ->item(0); return [ 'title' => $h3Tag->nodeValue, 'url' => $dom->getUrl()->resolveAsString($aTag->getAttribute('href')), 'destination' => $destinationTag->getNodeValue(), // trim needed for mobile results coming with an initial space 'description' => $descriptionTag ? trim($descriptionTag->nodeValue) : null, 'isAmp' => function () use ($dom, $node) { return $dom ->cssQuery('.amp_r', $node) ->length > 0; }, ]; } /** * If isLarge() matched, this will parse the content of site links * @param GoogleDom $dom * @param \DomElement $node * @return \Closure */ protected function parseSiteLink(GoogleDom $dom, \DomElement $node) { return function () use ($dom, $node) { $items = $dom->cssQuery('.mslg .sld', $node); $siteLinksData = []; foreach ($items as $item) { $siteLinksData[] = new BaseResult(NaturalResultType::CLASSICAL_SITELINK, [ 'title' => function () use ($dom, $item) { return $dom->cssQuery('h3.r a', $item) ->getNodeAt(0) ->getNodeValue(); }, 'description' => function () use ($dom, $item) { return $dom->cssQuery('.st', $item) ->getNodeAt(0) ->getNodeValue(); }, 'url' => function () use ($dom, $item) { return $dom->cssQuery('h3.r a', $item) ->getNodeAt(0) ->getAttribute('href'); }, ]); } return $siteLinksData; }; } /** * Check if has site links. Might be overriden by subparser like ClassicalCard * @param GoogleDom $dom * @param \DomElement $node * @return bool */ protected function isLarge(GoogleDom $dom, \DomElement $node) { return $dom->cssQuery('.nrgt', $node)->length == 1; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $data = $this->parseNode($dom, $node); $resultTypes = [NaturalResultType::CLASSICAL]; // CLASSICAL RESULT MIGHT BE ENLARGED WITH SITELINKS if ($this->isLarge($dom, $node)) { $data['sitelinks'] = $this->parseSiteLink($dom, $node); $resultTypes[] = NaturalResultType::CLASSICAL_LARGE; } // classical result can have a video thumbnail $thumb = $dom->getXpath() ->query("descendant::g-img[@class='_ygd']/img", $node) ->item(0); if ($thumb) { $resultTypes[] = NaturalResultType::CLASSICAL_ILLUSTRATED; $data['thumb'] = function () use ($thumb) { if ($thumb) { return MediaFactory::createMediaFromSrc($thumb->getAttribute('src')); } else { return null; } }; } $videoDuration = $dom->cssQuery('.vdur', $node); if ($videoDuration->length == 1) { $resultTypes[] = NaturalResultType::CLASSICAL_VIDEO; $data['videoLarge'] = false; } $item = new BaseResult($resultTypes, $data); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Classical/ClassicalWithLargeVideo.php ================================================ getAttribute('class') == 'g mnr-c g-blk' && $dom->cssQuery('.knowledge-block__video-nav-block', $node)->length == 1 ) { return self::RULE_MATCH_MATCHED; } else { return self::RULE_MATCH_NOMATCH; } } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $xpath = $dom->getXpath(); $aTag = $xpath->query("descendant::h3[@class='r'][1]/a", $node)->item(0); if (!$aTag) { return false; } $destinationTag = $xpath ->query("descendant::div[@class='f kv _SWb']/cite", $node) ->item(0); $data = [ 'title' => $aTag->nodeValue, 'url' => $dom->getUrl()->resolveAsString($aTag->getAttribute('href')), 'destination' => $destinationTag ? $destinationTag->nodeValue : null, 'description' => null, 'videoLarge' => true, 'thumb' => null, 'videoCover' => function () use ($dom, $node) { $imageTag = $dom ->cssQuery('._ELb img', $node) ->item(0); if ($imageTag) { return MediaFactory::createMediaFromSrc($imageTag->getAttribute('src')); // TODO 1p gif ? } else { return null; } } ]; $resultSet->addItem(new BaseResult([NaturalResultType::CLASSICAL_VIDEO, NaturalResultType::CLASSICAL], $data)); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/ComposedTopStories.php ================================================ cssQuery('._Fzo ._HSj', $node)->length == 1 && $dom->cssQuery('.dbsr', $node)->length > 0 // Dont use _yyh, _JTg or _bfj class because it's common to all carousel ) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = new BaseResult( [NaturalResultType::TOP_STORIES, NaturalResultType::TOP_STORIES_COMPOSED], $this->parseNode($dom, $node) ); $resultSet->addItem($item); } private function parseNode(GoogleDom $dom, $node) { return [ 'isCarousel' => true, 'isVertical' => true, 'news' => function () use ($dom, $node) { $news = $this->parseVerticalResults($dom, $node); $news = array_merge($news, $this->parseCarouselResults($dom, $node)); $resultSet = new ResultSet(); $resultSet->addItems($news); return $resultSet; }, ]; } private function parseVerticalResults(GoogleDom $dom, DomElement $node) { $news = []; $nodes = $dom->cssQuery('.dbsr', $node); foreach ($nodes as $newsNode) { $news[] = new BaseResult(NaturalResultType::TOP_STORIES_NEWS_VERTICAL, [ 'title' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('._eNq>span', $newsNode)->item(0); return $el->nodeValue; }, 'url' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('._rNq>a', $newsNode)->item(0); return $el->getAttribute('href'); } ]); } return $news; } private function parseCarouselResults(GoogleDom $dom, DomElement $node) { $news = []; $nodes = $dom->cssQuery('._HSj ._ERj', $node); foreach ($nodes as $newsNode) { $news[] = new BaseResult(NaturalResultType::TOP_STORIES_NEWS_CAROUSEL, [ 'title' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('._IRj', $newsNode)->item(0); return $el->nodeValue; }, 'url' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('g-inner-card._KBh>a', $newsNode)->item(0); return $el->getAttribute('href'); } ]); } return $news; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Divider.php ================================================ tagName || 'rgsep' == $node->getAttribute('class')) { return self::RULE_MATCH_STOP; } } public function parse(GoogleDom $googleDOM, \DomElement $group, IndexedResultSet $resultSet) { } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Flight.php ================================================ getAttribute('id')) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $googleDOM, \DomElement $group, IndexedResultSet $resultSet) { $resultSet->addItem(new BaseResult(NaturalResultType::FLIGHTS, [])); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/ImageGroup.php ================================================ hasAttribute('id') && $node->getAttribute('id') == 'imagebox_bigimages') { return self::RULE_MATCH_MATCHED; } else { return self::RULE_MATCH_NOMATCH; } } public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'images' => [], 'isCarousel' => false, 'moreUrl' => function () use ($node, $googleDOM) { $aTag = $googleDOM->getXpath()->query('descendant::div[@class="_Icb _kk _wI"]/a', $node)->item(0); if (!$aTag) { return $googleDOM->getUrl()->resolve('/'); } return $googleDOM->getUrl()->resolveAsString($aTag->getAttribute('href')); } ]; // TODO: detect no image (google dom update) $imageNodes = $googleDOM->cssQuery('.rg_ul>div._ZGc a', $node); foreach ($imageNodes as $imgNode) { $item['images'][] = $this->parseItem($googleDOM, $imgNode); } $resultSet->addItem(new BaseResult(NaturalResultType::IMAGE_GROUP, $item)); } /** * @param GoogleDOM $googleDOM * @param \DOMElement $imgNode * @return array */ private function parseItem(GoogleDom $googleDOM, \DOMElement $imgNode) { $data = [ 'sourceUrl' => function () use ($imgNode, $googleDOM) { $img = $googleDOM->getXpath()->query('descendant::img', $imgNode)->item(0); if (!$img) { return $googleDOM->getUrl()->resolve('/'); } return $googleDOM->getUrl()->resolveAsString($img->getAttribute('title')); }, 'targetUrl' => function () use ($imgNode, $googleDOM) { return $googleDOM->getUrl()->resolveAsString($imgNode->getAttribute('href')); }, 'image' => function () use ($imgNode, $googleDOM) { $img = $googleDOM->getXpath()->query('descendant::img', $imgNode)->item(0); if (!$img) { return ''; } return MediaFactory::createMediaFromSrc($img->getAttribute('src')); }, ]; return new BaseResult(NaturalResultType::IMAGE_GROUP_IMAGE, $data); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/ImageGroupCarousel.php ================================================ cssQuery('._ekh image-viewer-group g-scrolling-carousel', $node)->length == 1) { return self::RULE_MATCH_MATCHED; } else { return self::RULE_MATCH_NOMATCH; } } public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'images' => function () use ($node, $googleDOM) { $items = []; $imageNodes = $googleDOM->cssQuery('.rg_ul>._sqh g-inner-card', $node); foreach ($imageNodes as $imageNode) { $items[] = $this->parseItem($googleDOM, $imageNode); } return $items; }, 'isCarousel' => true, 'moreUrl' => function () use ($node, $googleDOM) { $a = $googleDOM->cssQuery('g-tray-header ._Nbi a'); $a = $a->item(0); if ($a instanceof \DOMElement) { return $googleDOM->getUrl()->resolveAsString($a->getAttribute('href')); } return null; } ]; $resultSet->addItem(new BaseResult(NaturalResultType::IMAGE_GROUP, $item)); } /** * @param GoogleDOM $googleDOM * @param \DOMElement $imgNode * @return array * */ private function parseItem(GoogleDom $googleDOM, \DOMElement $imgNode) { $data = [ 'sourceUrl' => function () use ($imgNode, $googleDOM) { $node = $googleDOM->cssQuery('.rg_meta', $imgNode)->item(0); if (!$node) { return null; } $url = $googleDOM->getJsonNodeProperty('ru', $node); return $url; }, 'targetUrl' => function () use ($imgNode, $googleDOM) { // not available for mobile results return null; }, 'image' => function () use ($imgNode, $googleDOM) { // TODO: maybe parse from javascript source $img = $googleDOM->cssquery('.iuth>img')->item(0); if (!$img) { return null; } return MediaFactory::createMediaFromSrc($img->getattribute('src')); }, ]; return new BaseResult(NaturalResultType::IMAGE_GROUP_IMAGE, $data); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/InTheNews.php ================================================ firstChild; if (!$child || !($child instanceof \DOMElement)) { return self::RULE_MATCH_NOMATCH; } if ($child->getAttribute('class') == 'mnr-c _yE') { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $googleDOM, \DomElement $group, IndexedResultSet $resultSet) { $item = [ 'news' => [] ]; $xpathCards = "div/div[contains(concat(' ',normalize-space(@class),' '),' card-section ')]"; $cardNodes = $googleDOM->getXpath()->query($xpathCards, $group); foreach ($cardNodes as $cardNode) { $item['news'][] = $this->parseItem($googleDOM, $cardNode); } $resultSet->addItem(new BaseResult(NaturalResultType::IN_THE_NEWS, $item)); } /** * @param GoogleDOM $googleDOM * @param \DomElement $node * @return array */ protected function parseItem(GoogleDom $googleDOM, \DomElement $node) { $card = []; $xpathTitle = "descendant::a[@class = '_Dk']"; $aTag = $googleDOM->getXpath()->query($xpathTitle, $node)->item(0); if ($aTag) { $card['title'] = $aTag->nodeValue; $card['url'] = $aTag->getAttribute('href'); $card['description'] = function () use ($googleDOM, $node) { $span = $googleDOM->getXpath()->query("descendant::span[@class='_dwd st s std']", $node); if ($span && $span->length > 0) { return $span->item(0)->nodeValue; } return null; }; } return new BaseResult('', $card); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/KnowledgeCard.php ================================================ hasClass('mnr-c') && $node->hasClass('kno-kp')) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $googleDOM, \DomElement $node, IndexedResultSet $resultSet) { $data = [ 'title' => function () use ($googleDOM, $node) { $item = $googleDOM->cssQuery('._OKe ._Q1n ._sdf'); if (!$item->length) { $item = $googleDOM->cssQuery('.d1rFIf>.kno-ecr-pt>span'); } return $item->getNodeAt(0)->getNodeValue(); }, 'shortDescription' => function () use ($googleDOM, $node) { $item = $googleDOM->cssQuery('._OKe ._Q1n ._gdf', $node); // appears to be outdated if (!$item->length) { $item = $googleDOM->cssQuery('.sthby', $node); } return $item->getNodeAt(0)->getNodeValue(); } ]; $resultSet->addItem($a = new BaseResult(NaturalResultType::KNOWLEDGE, $data)); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/Map.php ================================================ cssQuery('.AEprdc.vk_c', $node)->length == 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'localPack' => function () use ($node, $dom) { $localPackNodes = $dom->cssQuery('.ccBEnf>div', $node); $data = []; foreach ($localPackNodes as $localPack) { $data[] = new BaseResult(NaturalResultType::MAP_PLACE, $this->parseItem($localPack, $dom)); } return $data; }, 'mapUrl' => function () use ($node, $dom) { $mapATag = $dom->cssQuery('#lu_map', $node)->item(0)->parentNode; if ($mapATag) { return $dom->getUrl()->resolveAsString($mapATag->getAttribute('href')); } return null; } ]; $resultSet->addItem(new BaseResult(NaturalResultType::MAP, $item)); } private function parseItem($localPack, GoogleDom $dom) { return [ 'title' => function () use ($localPack, $dom) { return $dom->cssQuery('.dbg0pd', $localPack)->getNodeAt(0)->getNodeValue(); }, 'url' => function () use ($localPack, $dom) { // we search for explicit with href to the website. // if not found the url is sometimes in a tag $nodes = $dom->cssQuery('a.L48Cpd', $localPack); if ($nodes->length > 0) { return $nodes->getNodeAt(0)->getAttribute('href'); } else { return $dom->cssQuery('link[href]', $localPack) ->getNodeAt(0) ->getAttribute('href'); } }, 'street' => function () use ($localPack, $dom) { $v = $dom->cssQuery( '.rllt__details>div:nth-child(3)>span', $localPack )->getNodeAt(0)->getNodeValue(); if ($v) { return $v; } else { return $dom->cssQuery( '.rllt__details>div:nth-child(1)>span', $localPack )->getNodeAt(0)->getNodeValue(); } }, 'stars' => function () use ($localPack, $dom) { $rating = $dom->cssQuery('.BTtC6e', $localPack)->getNodeAt(0)->getNodeValue(); // transforms "4,4" to 4.4 return $rating ? (float)str_replace(',', '.', $rating) : null; }, 'review' => function () use ($localPack, $dom) { $review = $dom->cssQuery( '.BTtC6e', $localPack )->getNodeAt(0); if ($review instanceof DomElement) { $value = $review->parentNode->getNodeValue(); } else { return null; } if ($value && preg_match('/(\([0-9 ,\.]+\))/', $value, $matches)) { // transform '(1 000)' or '(1,000)', etc... to 1000 return (int) preg_replace('/[^0-9]/', '', $matches[1]); } return null; }, 'phone' => function () use ($localPack, $dom) { $item = $dom->cssQuery( '.rllt__details>div:nth-child(3)', $localPack )->item(0); if (!$item) { $item = $dom->cssQuery( '.rllt__details>div:nth-child(1)', $localPack )->item(0); } if ($item) { if ($item->childNodes->length > 1 && $item->childNodes->item(1) instanceof \DOMText) { return trim($item->childNodes->item(1)->nodeValue, ' ·'); } } return null; }, ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/MapLegacy.php ================================================ cssQuery('._RBh', $node)->length > 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $xPath = $dom->getXpath(); $item = [ 'localPack' => function () use ($xPath, $node, $dom) { $localPackNodes = $xPath->query('descendant::div[@class="_gt"]', $node); $data = []; foreach ($localPackNodes as $localPack) { $data[] = new BaseResult(NaturalResultType::MAP_PLACE, $this->parseItem($localPack, $dom)); } return $data; }, 'mapUrl' => function () use ($xPath, $node, $dom) { $mapATag = $dom->cssQuery('#lu_map', $node)->item(0)->parentNode; if ($mapATag) { return $dom->getUrl()->resolveAsString($mapATag->getAttribute('href')); } return null; } ]; $resultSet->addItem(new BaseResult(NaturalResultType::MAP, $item)); } private function parseItem($localPack, GoogleDom $dom) { return [ 'title' => function () use ($localPack, $dom) { $item = $dom->cssQuery('._rl', $localPack)->item(0); if ($item) { return $item->nodeValue; } return null; }, 'url' => function () use ($localPack, $dom) { $item = $dom->getXpath()->query('descendant::a', $localPack)->item(1); if ($item) { return $item->getAttribute('href'); } return null; }, 'street' => function () use ($localPack, $dom) { $item = $dom->cssQuery( '._iPk>span.rllt__details>div:nth-child(3)>span', $localPack )->item(0); if ($item) { return $item->nodeValue; } return null; }, 'stars' => function () use ($localPack, $dom) { $item = $dom->cssQuery('._PXi', $localPack)->item(0); if ($item) { return $item->nodeValue; } return null; }, 'review' => function () use ($localPack, $dom) { $item = $dom->cssQuery( '._iPk>span.rllt__details>div:nth-child(1)', $localPack )->item(0); if ($item) { if ($item->childNodes->length > 0 && !($item->childNodes->item(0) instanceof \DOMText)) { return null; } else { return trim(explode('·', $item->nodeValue)[0]); } } return null; }, 'phone' => function () use ($localPack, $dom) { $item = $dom->cssQuery( '._iPk>span.rllt__details>div:nth-child(3)', $localPack )->item(0); if ($item) { if ($item->childNodes->length > 1 && $item->childNodes->item(1) instanceof \DOMText) { return trim($item->childNodes->item(1)->nodeValue, ' ·'); } } return null; }, ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/MapMobile.php ================================================ cssQuery('img.wfAGXd', $node)->length == 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'localPack' => function () use ($node, $dom) { $localPackNodes = $dom->cssQuery('.PX16ld', $node); $data = []; foreach ($localPackNodes as $localPack) { $data[] = new BaseResult(NaturalResultType::MAP_PLACE, $this->parseItem($localPack, $dom)); } return $data; }, 'mapUrl' => function () use ($node, $dom) { return null; } ]; $resultSet->addItem(new BaseResult(NaturalResultType::MAP, $item)); } private function parseItem($localPack, GoogleDom $dom) { return [ 'title' => function () use ($localPack, $dom) { return $dom->cssQuery('.kR1eme', $localPack)->getNodeAt(0)->getNodeValue(); }, 'url' => function () use ($localPack, $dom) { $nodes = $dom->cssQuery('a', $localPack); $href = $nodes ->getNodeAt(0) ->getAttribute('href'); if ($href) { return $dom->getUrl()->resolveAsString($href); } }, 'street' => function () use ($localPack, $dom) { // TODO return null; }, 'stars' => function () use ($localPack, $dom) { $rating = $dom->cssQuery('.BTtC6e', $localPack)->getNodeAt(0)->getNodeValue(); // transforms "4,4" to 4.4 return $rating ? (float)str_replace(',', '.', $rating) : null; }, 'review' => function () use ($localPack, $dom) { $review = $dom->cssQuery( '.BTtC6e', $localPack )->getNodeAt(0); if ($review instanceof DomElement) { $value = $review->parentNode->getNodeValue(); } else { return null; } if ($value && preg_match('/(\([0-9 ,\.]+\))/', $value, $matches)) { // transform '(1 000)' or '(1,000)', etc... to 1000 return (int) preg_replace('/[^0-9]/', '', $matches[1]); } return null; }, 'phone' => function () use ($localPack, $dom) { return null; }, ]; } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/PeopleAlsoAsk.php ================================================ hasClasses(['kno-kp', 'mnr-c'])) { $childNodes = new DomNodeList($node->childNodes, $dom); if ($childNodes->hasAnyClass(['cUnQKe', '_thf'])) { // TODO "_thf" kept for BC, remove in future return self::RULE_MATCH_MATCHED; } } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $data = [ 'questions' => function () use ($dom, $node) { $items = []; $nodes = $dom->cssQuery('.related-question-pair', $node); foreach ($nodes as $questionNode) { $items[] = new BaseResult(NaturalResultType::PAA_QUESTION, [ 'question' => function () use ($questionNode, $dom) { return $questionNode->getNodeValue(); } ]); } return $items; } ]; $resultSet->addItem($a = new BaseResult(NaturalResultType::PEOPLE_ALSO_ASK, $data)); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/SearchResultGroup.php ================================================ hasAnyClass(['srg', '_NId', 'bkWMgd'])) { return $node->childNodes; } else { return self::RULE_MATCH_NOMATCH; } } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/TopStoriesCarousel.php ================================================ cssQuery('h3._MRj', $node)->length == 1 && $dom->cssQuery('g-scrolling-carousel._Ncr', $node)->length == 1 // Dont use _JTg or _bfj class because it's common to all carousel ) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } private function parseNode(GoogleDom $dom, $node) { return [ 'isCarousel' => true, 'isVertical' => false, 'news' => function () use ($dom, $node) { $news = []; $nodes = $dom->cssQuery('._Ocr>._Pcr', $node); foreach ($nodes as $newsNode) { $news[] = new BaseResult(NaturalResultType::TOP_STORIES_NEWS_CAROUSEL, [ 'title' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('._IRj', $newsNode)->item(0); return $el->nodeValue; }, 'url' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('g-inner-card._KBh>a', $newsNode)->item(0); return $el->getAttribute('href'); } ]); } $resultSet = new ResultSet(); $resultSet->addItems($news); return $resultSet; } ]; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = new BaseResult( [NaturalResultType::TOP_STORIES], $this->parseNode($dom, $node) ); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/TopStoriesVertical.php ================================================ cssQuery('h3._MRj', $node)->length == 1 && $dom->cssQuery('g-scrolling-carousel._Ncr', $node)->length == 0 ) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } private function parseNode(GoogleDom $dom, $node) { return [ 'isCarousel' => false, 'isVertical' => true, 'news' => function () use ($dom, $node) { $news = []; $nodes = $dom->cssQuery('._KBh', $node); foreach ($nodes as $newsNode) { $news[] = new BaseResult(NaturalResultType::TOP_STORIES_NEWS_VERTICAL, [ 'title' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('a', $newsNode)->item(0); return $el->nodeValue; }, 'url' => function () use ($dom, $newsNode) { $el = $dom->cssQuery('a', $newsNode)->item(0); return $el->getAttribute('href'); } ]); } $resultSet = new ResultSet(); $resultSet->addItems($news); return $resultSet; } ]; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = new BaseResult( [NaturalResultType::TOP_STORIES], $this->parseNode($dom, $node) ); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/TweetsCarousel.php ================================================ cssQuery('.g ._BOf', $node)->length) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $xpath = $dom->getXpath(); /* @var $aTag \DOMElement */ $aTag=$xpath ->query("descendant::h3[@class='r'][1]//a", $node) ->item(0); if ($aTag) { $title = $aTag->nodeValue; preg_match('/@([A-Za-z0-9_]{1,15})/', $title, $match); $data = [ 'title' => $title, 'url' => $aTag->getAttribute('href'), 'user' => isset($match[0]) ? $match[0] : null ]; $item = new BaseResult(NaturalResultType::TWEETS_CAROUSEL, $data); $resultSet->addItem($item); } } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/TweetsCarouselZ1m.php ================================================ childNodes->length == 1) { $childNode = $node->getChildren()->getNodeAt(0); $subChildNode = $childNode->getChildren()->getNodeAt(0); if ($childNode->hasClass('_Z1m') && $subChildNode->hasClass('_ujp')) { return self::RULE_MATCH_MATCHED; } } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = new BaseResult(NaturalResultType::TWEETS_CAROUSEL, [ 'url' => function () use ($dom, $node) { $res = $dom->cssQuery('._Z1m>._ujp>a', $node); if ($res->length == 1) { return $res->item(0)->getAttribute('href'); } else { throw new InvalidDOMException('Cannot parse url for twitter carousel.'); } }, 'title' => function () use ($dom, $node) { return $dom ->cssQuery('._ees', $node) ->item(0) ->nodeValue; }, 'destination' => function () use ($dom, $node) { return $dom ->cssQuery('span._Clt', $node) ->item(0) ->nodeValue; }, 'user' => function (BaseResult $result) { $url = $result->getDataValue('url'); $match = preg_match('~twitter.com/([^/?#]+)~', $url, $matches); if ($match) { return '@' . $matches[1]; } return null; } ]); $resultSet->addItem($item); } } ================================================ FILE: src/Parser/Evaluated/Rule/Natural/VideoGroup.php ================================================ cssQuery('._Fzo', $node)->length == 1) { return self::RULE_MATCH_MATCHED; } return self::RULE_MATCH_NOMATCH; } public function parse(GoogleDom $dom, \DomElement $node, IndexedResultSet $resultSet) { $item = [ 'videos' => function () use ($node, $dom) { $items = []; $nodes = $dom->cssQuery('._ERj', $node); foreach ($nodes as $node) { $items[] = new BaseResult(NaturalResultType::VIDEO_GROUP_VIDEO, [ 'image' => function () use ($node, $dom) { $data = $dom->cssQuery('g-img img', $node)->getNodeAt(0)->getAttribute('src'); return MediaFactory::createMediaFromSrc($data); }, 'title' => function () use ($node, $dom) { return $dom->cssQuery('._IRj', $node)->getNodeAt(0)->getNodeValue(); }, 'url' => function () use ($node, $dom) { return $dom->cssQuery('g-inner-card a', $node)->getNodeAt(0)->getAttribute('href'); } ]); } return $items; } ]; $resultSet->addItem(new BaseResult(NaturalResultType::VIDEO_GROUP, $item)); } } ================================================ FILE: src/Parser/ParserInterface.php ================================================ asian massage - Google Search
About 50,500,000 results (0.80 seconds) 
A privacy reminder from Google
Remind me later
Review
================================================ FILE: test/resources/pages-evaluated/2018/03/plumber+london.html ================================================ plumber london - Recherche Google
Environ 2 710 000 résultats (0,33 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Annonces

  1. Annoncewww.plumber.direct/
    Repairs, Service & Installations. Over 30 Years Experience - Give us a Call Now!
    Competitive Prices · 24/7 Assistance · 1 Hour Response Service · Fully Qualified Plumbers
  2. Annoncewww.thelocalplumbers.co.uk/
    +44 7889 408007
    Tanks, Taps, Toilet Flushes, Leaks, Immersion Heaters, Cylinders, Shower Repairs
    Ballvalves & Overflows · Dripping Taps · Bath / Shower Mixer Taps · Leaky Hot Water Cylinders
  3. Annoncewww.cmhlocal.co.uk/Heating
    No Call Out Charge. All Work Guaranteed. Domestic & Commercial.
    Emergency Response · Fast And Reliable · Affordable Service
    Highlights: Multiple Payment Options Available, 24/7 Emergency Service Available...
  4. Annoncewww.allercoplumbingandheatingnw.co.uk/
    Reliable & Fast Plumbing Services. Call Us For An Estimate Today!
    Fully Qualified · Fast & Efficient · 24/7 Emergency Service

Annonces

  1. Annoncewww.airtasker.co.uk/Plumber/London
    It's Free To Post! Receive Offers To Do Your Task From Rated and Trusted People.
    Get Quotes Online · Tell us your Budget · Post a Job · Get the Best Price
  2. Annoncewww.central-london-plumbers.co.uk/
    Affordable Quality Service Available 24/7. Call For A Free Estimate!
    Free Quote · Experienced Plumbers · 1 Hour Response Time
    Highlights: Available 24 hours & 7 Days A Week, Free Quote Available
  3. Annoncewww.hamiltongroup.co.uk/London/Plumbers
    Based in London - We Offer Fast & Reliable Services, 24/7. Call Now!
    Plumbing -
    dès 95,00 £GB/h
    -
    No Call-Out Fee
    · Plus
    Drainage (Jetting) -
    dès 100,00 £GB/h
    No Call-Out Fee
    Electrical -
    dès 95,00 £GB/h
    No Call-Out Fee
    Boiler Service -
    dès 95,00 £GB/h
    No Call-Out Fee
    Heating & Gas -
    dès 95,00 £GB/h
    No Call-Out Fee
    LondonOuvert aujourd'hui · Ouvert 24h/24
    vendredi
    Ouvert 24h/24
    samedi
    Ouvert 24h/24
    dimanche
    Ouvert 24h/24
    lundi
    Ouvert 24h/24
    mardi
    Ouvert 24h/24
    mercredi
    Ouvert 24h/24
    jeudi
    Ouvert 24h/24
================================================ FILE: test/resources/pages-evaluated/2018/03/qui+est+homer+simpsons.html ================================================ qui est homer simpsons - Recherche Google
Environ 6 080 000 résultats (0,42 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Recherches associées à qui est homer simpsons

Résultat de recherche d'images pour "qui est homer simpsons"
{"bc":1,"id":"Az8hwABX3-H8SM:","ml":{"278":{"bh":160,"bw":200},"366":{"bh":160,"bw":200},"454":{"bh":160,"bw":200}},"oh":1024,"ou":"http://1.bp.blogspot.com/-b66DQHFQuqs/UOl-mEpfyyI/AAAAAAAADds/VbLQxXMM464/s1600/les+simpson+homer+r%C3%A9plique+pinais+doh.jpeg","ow":1280,"pt":"1.bp.blogspot.com/-b66DQHFQuqs/UOl-mEpfyyI/AAAAAAA...","rh":"chroniquesenserie.com","rid":"upgIVkDluRhKMM","rt":0,"ru":"http://www.chroniquesenserie.com/2013/01/les-simpson-top-10-des-meilleures.html","th":160,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSCt2yfOROVOqlLmiJYNQ-KzI2JIrVZIdQRcRev-mIV8fDTjL6gSwCFE1YH","tw":200}
Résultat de recherche d'images pour "qui est homer simpsons"
{"cr":6,"id":"Ri_K1FJnYWm-9M:","ml":{"278":{"bh":95,"bw":77},"366":{"bh":75,"bw":50},"454":{"bh":80,"bw":46}},"oh":391,"ou":"https://vignette.wikia.nocookie.net/simpsons/images/3/33/Homer.png/revision/latest?cb\u003d20110703093455\u0026path-prefix\u003dfr","ow":239,"pt":"Homer Simpson | Wiki Les Simpson | FANDOM powered by Wikia","rh":"fr.simpsons.wikia.com","rid":"EBDvBGMjtwkqPM","rt":0,"ru":"http://fr.simpsons.wikia.com/wiki/Homer_Simpson","s":"","sc":1,"st":"Wiki Les Simpson","th":126,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTfhLA8jRYoALmwCLHC2DHwPprS6gUkvss8ujcXUVR6bjlvc3O7W2e6QA","tw":77}
Résultat de recherche d'images pour "qui est homer simpsons"
{"cl":15,"cr":12,"ct":6,"id":"plWBo6g7Rx7J0M:","ml":{"278":{"bh":64,"bw":77},"366":{"bh":75,"bw":114},"454":{"bh":80,"bw":78}},"oh":768,"ou":"http://gonzai.com/wp-content/uploads/2013/01/Homer_holding_baby_Lisa.png","ow":1036,"pt":"HOMER SIMPSON Il était un père","rh":"gonzai.com","rid":"0QyrIcE9VpPsgM","rt":0,"ru":"http://gonzai.com/homer-simpson-il-etait-un-pere/","s":"","st":"Gonzaï","th":121,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQbv5MRd3oavqrEEQwnicxc7cHjbTatpz39quyEhg8SCCDE68n9fr38T4gM","tw":163}
Homer Simpson
Personnage fictif
Homer Jay Simpson est le principal personnage fictif de la série télévisée d'animation Les Simpson et le père de la famille du même nom. Wikipédia
Naissance : après 1956
Origine : États-Unis
================================================ FILE: test/resources/pages-evaluated/2018/03/super+u+paris.html ================================================ super u paris - Recherche Google
Environ 17 200 000 résultats (0,59 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Recherches associées à super u paris

================================================ FILE: test/resources/pages-evaluated/2018/07/foo+bar(page2).html ================================================ foo bar - Recherche Google
Page 2 sur environ 27 400 000 résultats (0,26 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Recherches associées à foo bar

================================================ FILE: test/resources/pages-evaluated/2018/09/65b6be0a-7619-4018-97c9-989cdec53319.html ================================================ mobile device management - Google-Suche

Titel der Google-Suchseite

Ungefähr 521.000.000 Ergebnisse (0,30 Sekunden) 

Anzeigen

  1. Manage assets and their apps with ease. Take a free trial to find out! Windows. Recognised by EMA Radar. BYOD. iOS. Best MDM 2016. On-Premises and Cloud. Android. Seamless App Distribution. A 360 MDM Support. Foolproof Security.
    Free -
    ab 0,00 $
    -
    Upto 25 Devices
    · Mehr
    Standard Edition -
    ab 64,00 $/Monat
    Cloud & On-Premises
    Professional Edition -
    ab 119,00 $/Monat
    Cloud & On-Premises

    Andere suchten auch nach

  2. Manage Android & iOS Devices, Apps & Content with Easy to use MDM solution. Free Web Training.

    Andere suchten auch nach

  3. SecurePIM bietet DSGVO-konforme Lösungen für sicheres mobiles Arbeiten.

    Andere suchten auch nach

  4. Wandeln Sie Mit Dell EMC Ihren Arbeitsplatz Digital Um. Mehr Informationen Hier.

    Andere suchten auch nach

Anzeigen

  1. Datenaustaustausch wird mit BlackBerry sicherer und einfacherer weltweit. Dateien sicher verwalten, Geschäftsprozesse mobilisieren, Kommunikation sicher machen. Deutschsprachiger Support. Dienstleistungen: Full Managed Hosting, On Demand Service, Wartung und Beratung.
  2. 4,2 Bewertung für hp.com
    Steigern Sie die Produktivität Ihrer Mitarbeiter & die IT-Effizienz mit HP DaaS. Helpdesk-Service. Flottenmanagement. Priority Support. Mit eigenem HP Agent.
  3. Ein Rund-um-Sorglos Paket für Ihre mobile Endgeräte. Informieren Sie sich jetzt! Individuelle Beratung. 360° Betreuung. 24h Stunden Service. Effiziente Lösungen. Rundum-Service. Ausstattung: Kostenlose Getränke, private Internetnutzung, coole Kollegen, gute Verkehrsanbindung.

Ähnliche Suchanfragen zu mobile device management

Ergänzende Ergebnisse

Wissensergebnis

Bildergebnis für mobile device management
{"cb":3,"ct":3,"id":"DuE9YukPyasSJM:","ml":{"278":{"bh":153,"bw":199},"366":{"bh":153,"bw":199},"454":{"bh":153,"bw":199}},"oh":900,"ou":"https://www.vater-gruppe.de/fotos/MDM-Vater.jpg?m\u003d1478780375","ow":1175,"pt":"www.vater-gruppe.de/fotos/MDM-Vater.jpg?m\u003d14787803...","rh":"vater-gruppe.de","rid":"uzeENUrx2VKtoM","rt":0,"ru":"https://www.vater-gruppe.de/portfolio/software/mdm-sophos.php","sc":1,"th":153,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSDfLlF8F1dqmEStbqdW2NoNyxxl7rSFjl2lkzSqQrm3NRNyjjN3f18i8Dh0Q","tw":199}
Bildergebnis für mobile device management
{"cr":3,"id":"s3BHdbx0D0xGPM:","ml":{"278":{"bh":76,"bw":78},"366":{"bh":76,"bw":81},"454":{"bh":76,"bw":127}},"oh":456,"ou":"https://assets.pcmag.com/media/images/558946-the-best-mobile-device-management-mdm-solutions.jpg?thumb\u003dy\u0026width\u003d810\u0026height\u003d456","ow":810,"pt":"assets.pcmag.com/media/images/558946-the-best-mobi...","rh":"pcmag.com","rid":"h9exvgImya384M","rt":0,"ru":"https://www.pcmag.com/article/342695/the-best-mobile-device-management-mdm-software","sc":1,"st":"PCMag.com","th":104,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSNJntFFPrv7gElsE10AyRJI0CpXCHZKsDaCezF3r5jDKCOCu6GTSdpPF0H","tw":185}
Bildergebnis für mobile device management
{"id":"y2u1QC1ijqnc4M:","ml":{"278":{"bh":76,"bw":78},"366":{"bh":76,"bw":84},"454":{"bh":76,"bw":126}},"oh":1000,"ou":"https://www.zoho.com/images/mdm-ss.jpg","ow":1730,"pt":"www.zoho.com/images/mdm-ss.jpg","rh":"zoho.com","rid":"3o7qVS8Qy2_RpM","rt":0,"ru":"https://www.zoho.com/mdm-cloud.html","sc":1,"st":"Zoho","th":104,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRL5SPElKl2jvgyg_KOjWoSBgjpDhMlHTnZYr5b2U7wu2wTC_wVF0Icg1IB","tw":180}
Mobile-Device-Management
Mobile-Device-Management ist ein Begriff aus der Informationstechnik und steht für die zentralisierte Verwaltung von Mobilgeräten wie Smartphones, Sub-Notebooks, PDAs oder Tablet-Computer durch einen oder mehrere Administratoren mit Hilfe von Software und Hardware. Wikipedia

Fußzeilenlinks

================================================ FILE: test/resources/pages-evaluated/2018/10/agence+web+nantes.html ================================================ agence web nantes - Recherche Google

Liens d'accessibilité

Passer directement au contenu principalAide sur l'accessibilité
Commentaires sur l'accessibilité
Environ 45 300 000 résultats (0,49 secondes) 

Annonces

  1. Réalisation, Refonte et Conseils pour votre Site Internet : Contactez-Nous ! Site E-Commerce Magento. Experts Certifiés Magento. Expert Site E-Commerce. Devis Gratuit.
    5 boulevard ampère, Carquefou02 40 52 78 30Fermé · Horaires
    lundi
    09:00 – 18:00
    mardi
    09:00 – 18:00
    mercredi
    09:00 – 18:00
    jeudi
    (Toussaint)
    09:00 – 18:00
    Les horaires peuvent être modifiés.
    vendredi
    09:00 – 18:00
    samedi
    Fermé
    dimanche
    Fermé

    Recherches associées

  2. Agence d’expertises web qui rassemble toutes les compétences du web. Experts SEO, SEA & SMO.

    Recherches associées

Annonces

  1. Une équipe De Développeurs Pointus Créant Des Apps Et Sites De Grande Qualité! Livraison rapide des projets. Qualité supérieure. Tarifs compétitifs. Consultation gratuits. Types: Applications Android, Applications iOS, Applications Web.
  2. Notre agence vous accompagne dans la mise en place de votre stratégie webmarketing. Nous vous aidons à atteindre vos objectifs. Equipe dynamique et certifiée. Agence Certifiée. Expert Adwords.
    6 Place Montaigne, NantesFermé · Horaires
    lundi
    09:00 – 18:00
    mardi
    09:00 – 18:00
    mercredi
    09:00 – 18:00
    jeudi
    (Toussaint)
    09:00 – 18:00
    Les horaires peuvent être modifiés.
    vendredi
    09:00 – 17:00
    samedi
    Fermé
    dimanche
    Fermé
  3. Création de site internet dans les Bouches du Rhône. Port offert dès 100 €. Service client 0486220500.

Recherches associées à agence web nantes

Liens de pied de page

================================================ FILE: test/resources/pages-evaluated/2018/10/who+is+homer+simpson.html ================================================ who is homer simpson - Recherche Google

Liens d'accessibilité

Passer directement au contenu principalAide sur l'accessibilité
Commentaires sur l'accessibilité
Environ 25 500 000 résultats (0,31 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Remarques sur les résultats filtrés

Certains résultats peuvent avoir été supprimés conformément à la loi européenne sur la protection des données. En savoir plus

Recherches associées à who is homer simpson

Résultats complémentaires

Résultat du Knowledge Graph

Résultat de recherche d'images pour "who is homer simpson"
{"bc":1,"id":"Ri_K1FJnYWm-9M:","ml":{"278":{"bh":186,"bw":113},"366":{"bh":186,"bw":113},"454":{"bh":186,"bw":113}},"oh":391,"ou":"https://vignette.wikia.nocookie.net/simpsons/images/3/33/Homer.png/revision/latest?cb\u003d20110703093455\u0026path-prefix\u003dfr","ow":239,"pt":"vignette.wikia.nocookie.net/simpsons/images/3/33/H...","rh":"fr.simpsons.wikia.com","rid":"EBDvBGMjtwkqPM","rt":0,"ru":"http://fr.simpsons.wikia.com/wiki/Homer_Simpson","th":186,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSpwdike4mwzCTzWMrUDW38jm4xHwA0VMTSvLVIo1HtcVH8Lhd0Hnwj4Gg","tw":113}
Résultat de recherche d'images pour "who is homer simpson"
{"cb":3,"cl":12,"cr":21,"ct":6,"id":"6SSjfjMI8kaKFM:","ml":{"278":{"bh":108,"bw":97},"366":{"bh":95,"bw":73},"454":{"bh":94,"bw":48}},"oh":1008,"ou":"https://www.lifewire.com/thmb/vDB3ply4rHJG_BDWeD0AbuRu-EU\u003d/768x0/filters:no_upscale():max_bytes(150000):strip_icc()/Simpsons_09_Homer_V2F_hires1-56e1eccc5f9b5854a9f89a63.jpg","ow":768,"pt":"www.lifewire.com/thmb/vDB3ply4rHJG_BDWeD0AbuRu-EU\u003d...","rh":"lifewire.com","rid":"1LCirECo3-HoVM","rt":0,"ru":"https://www.lifewire.com/what-is-homer-simpsons-email-address-1171211","sc":1,"st":"Lifewire","th":127,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSR7euHeyYZQrafxuZxwUlepH8Lp6lx179KrfIoNffj9j0B_DUthXyUSw","tw":97}
Résultat de recherche d'images pour "who is homer simpson"
{"id":"5BnyH8Z3rvZ_hM:","ml":{"278":{"bh":108,"bw":66},"366":{"bh":95,"bw":54},"454":{"bh":94,"bw":54}},"oh":626,"ou":"http://www.simpsonspark.com/images/persos/contributions/homer-simpson-20509.jpg","ow":359,"pt":"www.simpsonspark.com/images/persos/contributions/h...","rh":"simpsonspark.com","rid":"Ys5DJmjl34SXiM","rt":0,"ru":"http://www.simpsonspark.com/personnages/homer-simpson.php","sc":1,"st":"The Simpsons Park","th":115,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRlhFns_ph_Sh-_LIvO_OgVax76EZ4WBTlQjt8btYqpV9YagjAWXCeIAc8","tw":66}
Résultat de recherche d'images pour "who is homer simpson"
{"cb":9,"cl":3,"cr":3,"id":"qi0oQP6PnujjCM:","ml":{"278":{"bh":77,"bw":77},"366":{"bh":95,"bw":123},"454":{"bh":94,"bw":111}},"oh":300,"ou":"https://vignette.wikia.nocookie.net/simpsons/images/d/d3/Mom....jpg/revision/latest?cb\u003d20120315224136","ow":379,"pt":"vignette.wikia.nocookie.net/simpsons/images/d/d3/M...","rh":"simpsons.wikia.com","rid":"lqQyg3JpjopZxM","rt":0,"ru":"http://simpsons.wikia.com/wiki/Mona_Simpson","st":"Simpsons Wiki - Fandom","th":118,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTVI3HPtCXalMVoYdQwpLH1mx-PY5yLBq25mfAb7NNOBsOxXlqcTkw2rFw","tw":149}
Résultat de recherche d'images pour "who is homer simpson"
{"id":"9F2rE9xAAvSA-M:","ml":{"278":{"bh":77,"bw":86},"366":{"bh":90,"bw":115},"454":{"bh":94,"bw":124}},"oh":1250,"ou":"https://static2.srcdn.com/wordpress/wp-content/uploads/homer-simpson-looking-stupid-e1463454351635.jpg","ow":2500,"pt":"static2.srcdn.com/wordpress/wp-content/uploads/hom...","rh":"screenrant.com","rid":"SUByaoUL9-NIwM","rt":0,"ru":"https://screenrant.com/the-simpsons-homer-simpson-dumbest-things/","sc":1,"st":"Screen Rant","th":104,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTTmknAFXy4XBoV8teB6b0-g5V27_onn0zgHihugl3fu1EXzLsO7FEz7pVO","tw":208}
Résultat de recherche d'images pour "who is homer simpson"
{"id":"R3UC6SHKupjfzM:","ml":{"366":{"bh":90,"bw":64},"454":{"bh":91,"bw":61}},"oh":482,"ou":"https://static.comicvine.com/uploads/original/3/33224/662473-simpson__mit_bier_auf_couch_.png","ow":360,"pt":"static.comicvine.com/uploads/original/3/33224/6624...","rh":"comicvine.gamespot.com","rid":"V6Hh4Zen-jba0M","rt":0,"ru":"https://comicvine.gamespot.com/homer-simpson/4005-3399/","sc":1,"st":"Comic Vine","th":96,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcT4Vvjc6Y9TqExw9lKRJkEtLRbIaEK_sRvn4bSyNXmSSPwWK_B3T-IkFg","tw":72}
Résultat de recherche d'images pour "who is homer simpson"
{"id":"TvzYUVdZLJvsbM:","ml":{"366":{"bh":90,"bw":71},"454":{"bh":91,"bw":67}},"oh":204,"ou":"http://www.anecdote-du-jour.com/wp-content/images/2009/02/homer-simpson-mg.jpg","ow":169,"pt":"www.anecdote-du-jour.com/wp-content/images/2009/02...","rh":"anecdote-du-jour.com","rid":"Ai2p3oQe-EvWpM","rt":0,"ru":"http://www.anecdote-du-jour.com/les-initiales-de-matt-groening-dessinees-dans-le-visage-d-homer-simpson/","sc":1,"st":"Anecdote du jour","th":91,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQWxRreh3g5E4rvGyApc9E1Cc-pIDOFGzsDappLLbh3WZejykxZM9kXXic","tw":76}
Résultat de recherche d'images pour "who is homer simpson"
{"cr":6,"ct":3,"id":"WH5AcoP0oLw6RM:","ml":{"454":{"bh":91,"bw":102}},"oh":312,"ou":"https://vignette.wikia.nocookie.net/simpsons/images/2/26/Homer_young.PNG/revision/latest?cb\u003d20100316090902","ow":414,"pt":"vignette.wikia.nocookie.net/simpsons/images/2/26/H...","rh":"simpsons.wikia.com","rid":"MrZgP0MdUAZAkM","rt":0,"ru":"http://simpsons.wikia.com/wiki/Homer_Simpson","st":"Simpsons Wiki - Fandom","th":91,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcToSMGMamP7AgQzaTp-u1AVO5g7lKcSpmXI_mPOdaygpFEJYcNxs8Hz5cw","tw":121}
Résultat de recherche d'images pour "who is homer simpson"
{"id":"2lNYzy_d1t16nM:","ml":{"454":{"bh":91,"bw":107}},"oh":538,"ou":"https://consequenceofsound.files.wordpress.com/2017/04/homer-simpson-feature1.png?w\u003d807","ow":807,"pt":"consequenceofsound.files.wordpress.com/2017/04/hom...","rh":"consequenceofsound.net","rid":"kNSAq6PtaPjaaM","rt":0,"ru":"https://consequenceofsound.net/2017/04/doh-the-search-for-the-next-homer-simpson/","sc":1,"st":"Consequence of Sound","th":91,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQzmnjfMkq3CeF0IXvgjUT0IJX1NIKTjn7JTnbIbeaQLtMHKbWl-l1Kuds7","tw":137}
Homer Simpson
Personnage fictif
Homer Jay Simpson est le principal personnage fictif de la série télévisée d'animation Les Simpson et le père de la famille du même nom. Il est doublé par Dan Castellaneta dans la version originale, Philippe Peythieu dans la version française et Hubert Gagnon dans la version québécoise. Wikipédia
Naissance : après 1956
Cheveux : autrefois châtains

Liens de pied de page

================================================ FILE: test/resources/pages-evaluated/2018/11/acheter+kobo.html ================================================ acheter kobo - Recherche Google
Annonce sponsorisée

Afficher les acheter kobo


  1. Plus de 5 millions de titres. Toutes les nouveautés au meilleur prix. Tous les genres de livres. Lecture numérique commode. Appli Kobo™ gratuite. Soldes meilleures ventes.


La lecture à portée de main avec la liseuse numérique Kobo by fnac ! Plus de 3 muillions d'eBooks disponibles à la fnac.
Plus de 6 références Tous les Kobo Fnac avec la livraison en 1 jour avec Fnac+. Retrouvez aussi tous nos produits de notre univers ...
Acheter des eBooks sur kobo.com; Acheter un eBook dans la Librairie Kobo; Ajouter plusieurs articles à votre panier; Utilisation de la ...

Entreprise canadienne fondée en 2009, Kobo est l'un des services de lecture numérique les plus dynamiques au monde avec plus de 5 ...
Ecran tactile 7,8" E Ink Carta Display; Comfortlight Pro: éclairage intégré et ajustable; Mémoire interne 8 Go; Jusqu'à 1 mois ...
En France, le moyen le plus simple d'acheter une liseuse Kobo est de passer par la Fnac ( soit la boutique en ligne, soit en allant ...
Quelle liseuse acheter par rapport à mon utilisation ? Quelle autonomie ? Quelle ... Kobo Aura H20. Classement, Meilleur choix Kobo.
La marque KOBO vous donne rendez-vous, selon les périodes, pour les soldes*, des promos et ventes flash incroyables sur ...
Accéder à Les liseuses Kobo · Kobo Aura 2ème édition, Kobo Clara HD, Kobo Aura H2O 2ème édition, Kobo Aura One, Kobo ...
Accéder à Où acheter une liseuse Kobo ? · Vous pouvez donc en acheter une dans ... Kobo Aura 2ème édition, Kobo Clara ...

Autres questions posées

================================================ FILE: test/resources/pages-evaluated/2019/05/plombier+paris.html ================================================ plombier paris - Recherche Google

Liens d'accessibilité

Passer directement au contenu principalAide sur l'accessibilité
Commentaires sur l'accessibilité
Environ 21 100 000 résultats (0,50 secondes) 
Rappel concernant les règles de confidentialité de Google
Me le rappeler plus tard
Lire

Annonces

  1. En Urgence ou sur Rendez-Vous. Commandez votre intervention rapidement en ligne ! Les prix...

    Recherches associées

  2. Dépannages en Urgence mais Aussi vos Installations Contactez Nous. Services: un dégât des eaux?, une fuite,un WC bouchée?, assistance 01.43.15.42.26.
    Fuite -
    86,00 €
    -
    Déplacement & Réparation
    · Plus
    Canalisations -
    89,00 €
    Dégorgement Canalisation
    Ballon d'Eau Chaude -
    350,00 €
    Pour un Remplacement
    Changement de WC -
    350,00 €
    Installation

    Recherches associées

  3. Jouez et tentez de gagner des Travaux d'une valeur de 5000€ ! Jeu sans obligation d'achat. Profitez d'un Accompagnement de A à Z sur la Réalisation de Vos Travaux ! Chantiers en Exclusivité.

    Recherches associées

  4. Plombier Paris intervient pour vos dépannages, installations et devis. Débouchage - Recherche de fuite - Chauffe-eau - Chaudière - Réparation. Artisan qualifié. Devis Gratuit. Urgence ou RDV. Nos tarifs. Marques: Atlantic, Thermor, Ariston, De Dietrich, Chaffoteaux, Elm Leblanc.

    Recherches associées

Annonces

  1. Plombier Pas CHER se déplace pour installation et dépannage. Devis gratuit - Contactez-nous par téléphone - Ouvert du lundi au samedi de 7h30 à 20h00. Dépannage & Installation. Confiance. Assurance décennale. Artisan. Services: Débouchage WC, Recherche de fuite.
  2. Assainissement, entretien, dégorgement et débouchage de vos canalisations à partir de 90€. Tarifs fixes. Prestations de qualité. Interventions 24/24. Particuliers ET Professionnels. Branchements sanitaires. Inspection caméra tuyaux. Fosse septique. Curage. Pompe de relevage. Camion pompe.
  3. Devis gratuit Tout travaux de plomberie:Recherche et réparation fuites d'eau, débouchages, réparation, installation ou rénovation de sanitaires, salle de bains devis gratuit.
    22 Avenue Faidherbe, Les LilasOuvert aujourd'hui · 08:00 – 20:00
    samedi
    08:00 – 20:00
    dimanche
    08:00 – 20:00
    lundi
    08:00 – 20:00
    mardi
    08:00 – 20:00
    mercredi
    08:00 – 20:00
    jeudi
    08:00 – 20:00
    vendredi
    08:00 – 20:00

Recherches associées à plombier paris

Liens de pied de page

================================================ FILE: test/resources/pages-evaluated/2019/07/cheap+video+editing+software+mac.html ================================================ cheap video editing software mac - Google Search

Accessibility Links

Skip to main contentAccessibility help
Accessibility feedback
About 159,000,000 results (0.77 seconds) 
Sponsored
Movavi Video Editor 15 Plus
Special offerSpecial offer
Corel Videostudio Ultimate X8 Retail Box
$69.99
My Choice Soft...
Special offerSpecial offer
Movavi SplitMovie for Mac - on Official Movavi Site
Special offerSpecial offer
Related search
Beginner editing software

Searches related to cheap video editing software mac

Footer Links

================================================ FILE: test/resources/pages-evaluated/adwords/simpsons+poster.html ================================================ simpsons poster - Google Search
Screen-reader users, click here to turn off Google Instant.
About 483,000 results (0.43 seconds) 
Sponsored
Based on your search query, we think you are trying to find a product. Clicking in this box will show you results from providers who can fulfill your request. Google may be compensated by some of these providers. Provider updates to information may be delayed, therefore users should check the provider's site for the most up-to-date information. Some products may be advertised by merchants in other countries. The prices for these products are estimated based on current exchange rates, which can vary before purchase.

Shop for simpsons poster on Google

Affiche Simpsons-Cast Names Reproduction, 91x61cm.
EUR9.99
AllPosters.fr
Special offerSpecial offer
Poster Les Simpson Reproduction, 91x61cm.
EUR9.99
AllPosters.fr
Special offerSpecial offer
Poster Simpson - Comics
EUR6.50
Rockagogo.c...
Poster Simpson - Comics
EUR6.50
Rockagogo.com
Poster - The Simpsons - Enlightenment
EUR6.99
EMP Mailord...
Poster - The Simpsons - Enlightenment
EUR6.99
EMP Mailorder France
Poster Simpson - Sofa
EUR6.50
Rockagogo.c...
Poster Simpson - Sofa
EUR6.50
Rockagogo.com

  1. Art Posters On Sale Today - allposters.com.au‎

    Adwww.allposters.com.au/OfficialSite
    This ad is based on your:
    current search terms
    recent searches on Google
    Visit Google’s Why This Ad page to learn more or opt out.
    Save 30% Or More When You Buy Now. Plus Easy Returns & Fast Shipping!
  2. Simpsons poster - Plus de 250.000 Affiches en Stock‎

    Adwww.europosters.fr/
    This ad is based on your current search terms.
    Visit Google’s Why This Ad page to learn more or opt out.
    Petits Prix & Encadrement Possible!

  1. Votre Simpsons Poster‎

    Adwww.allposters.fr/
    This ad is based on your current search terms.
    Visit Google’s Why This Ad page to learn more or opt out.
    4.5 rating for allposters.fr
    Vos Posters de Séries TV à Prix Bas 500.000 Posters, Cadres Disponibles
  2. The Simpsons Posters on eBay‎

    Adwww.ebay.com.au/
    This ad is based on your:
    current search terms
    recent searches on Google
    Visit Google’s Why This Ad page to learn more or opt out.
    Fantastic prices on The Simpsons Posters Feed your passion on eBay!
================================================ FILE: test/resources/pages-evaluated/alarmas+para+casa.html ================================================ alarmas para casa - Buscar con Google
Los usuarios de lectores de pantalla pueden desactivar Google Instant haciendo clic aquí.
Aproximadamente 665.000 resultados (0,29 segundos) 
Un recordatorio de privacidad de Google
Recordarme más tarde
Leer

  1. Prosegur Alarmas Casa - Consigue ahora 2 meses Gratis‎

    Anunciowww.prosegur.es/
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    900 016 821
    Tu Alarma para casa desde 1€/día.
    Gestión desde móvil · Alarma Videoverificación · La Alarma para tu Casa
    Servicios: Triple Seguridad, Conexión sin enchufe, Custodia de llaves
  2. Alarmas para casa - Oferta 200€ Dto. ¡Sólo este mes‎

    Anunciowww.alarmahogarprosegur.com/
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    Prosegur Soluciones, tu Alarma.
    Aviso a la Policía · Triple Seguridad · Instalación sin cables
    Servicios: Triple Seguridad, Instalación sin cables, Control desde el móvil
  3. Sistema de Alarma: Casa - La única Protección Proactiva‎

    Anunciowww.getmyfox.com/alarma_casa
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    Inalámbrica, Se instalasa en 5 min
    5% Dto hasta el 28/03 · Garantía de 2 años · Envío gratuito HAPPY2016
    prevención de las intrusiones antes de que se produzcancasadomo.com
  4. Sistema Alarma Hogar - Grandes descuentos en bricolaje‎

    Anunciowww.amazon.es/sistema+alarma+hogar
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    Envío gratis con Amazon Premium

  1. Alarmas WIFI sin cuotas‎

    Anunciowww.alarmashouse.es/
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    638 80 15 16
    Proteja su casa desde 49 Euros Kits alarma GSM - WiFi - Línea Fija
  2. Alarmas sin cuotas‎

    Anunciowww.muysegura.es/
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    600 83 74 74
    La alarma autoinstalable más vendida del mundo
  3. Alarmas SIN CUOTA mensual‎

    Anunciowww.verialar.es/alarmaseconomicas
    Este anuncio se basa en tus:
    términos de búsqueda actuales
    búsquedas recientes en Google
    Visita la página ¿Por qué este anuncio? de Google para obtener más información o inhabilitar esta opción.
    Tu alarma por solo 65€ sin cuotas y sin contrato de permanencia
    ================================================ FILE: test/resources/pages-evaluated/captcha.html ================================================ https://www.google.fr/search?q=azd&oq=azd&aqs=chrome.0.69i59l2j69i60j69i57j69i60.293j0j7&client=ubuntu&sourceid=chrome&ie=UTF-8






    About this page

    Our systems have detected unusual traffic from your computer network. This page checks to see if it's really you sending the requests, and not a robot. Why did this happen?

    IP address: 188.94.206.49
    Time: 2018-05-29T11:11:44Z
    URL: https://www.google.fr/search?q=azd&oq=azd&aqs=chrome.0.69i59l2j69i60j69i57j69i60.293j0j7&client=ubuntu&sourceid=chrome&ie=UTF-8
    ================================================ FILE: test/resources/pages-evaluated/cards-design.html ================================================ florida usa - Google zoeken
    Gebruikers van schermlezers kunnen hier klikken om Google Instant uit te schakelen.
    ×

    Kom je hier vaker? Stel Google in als je startpagina.

    Prima
    Ongeveer 261.000.000 resultaten (0,55 seconden) 
    Een privacyherinnering van Google
    In overeenstemming met wetgeving ten aanzien van gegevensbescherming vragen we u even de tijd te nemen de belangrijkste punten van ons Privacybeleid door te nemen. Dit beslaat alle Google-services en beschrijft hoe we gegevens gebruiken en welke mogelijkheden u heeft. U moet dit vandaag nog doen.
    Mij later herinneren
    Nu bekijken
    Afbeeldingsresultaat voor florida usa
    {"bc":1,"id":"SP7mJE5u2B85qM:","oh":500,"ou":"https://upload.wikimedia.org/wikipedia/commons/f/f7/Flag_of_Florida.svg","ow":750,"pt":"https://upload.wikimedia.org/wikipedia/commons/f/f...","rh":"nl.wikipedia.org","ru":"https://nl.wikipedia.org/wiki/Florida_(staat)","th":151,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSjstTifbEvg_22uLvp4NWxvKAt75X_bW5uoI2pnJRuZW_qFYcMJDDkeXKdpg","tw":227}
    Kaart van Florida
    Florida
    Staat in de Verenigde Staten
    Florida is een staat van de Verenigde Staten. Florida ligt in het zuidoosten van het land en heeft een subtropisch klimaat. Veel gepensioneerde Amerikanen vestigen zich mede daarom in Florida. Wikipedia
    Oppervlakte: 170.304 km²
    Bevolking: 19,89 miljoen (2014)
    ================================================ FILE: test/resources/pages-evaluated/flights.html ================================================ flights - Recherche Google
    Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
    Environ 511 000 000 résultats (0,44 secondes) 
    ================================================ FILE: test/resources/pages-evaluated/github(with-vertical-top-stories).html ================================================ github - Recherche Google
    Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
    Environ 146 000 000 résultats (0,53 secondes) 
    Rappel concernant les règles de confidentialité de Google
    Me le rappeler plus tard
    Lire

    Annonce

    1. github.com - Introducing GitHub Business - Sign Up Your Team Today‎

      Annoncewww.github.com/
      Cette annonce est basée sur vos termes de recherche actuels.
      Pour en savoir plus ou désactiver les annonces personnalisées, accédez à la page Pourquoi cette annonce ? de Google.
      Enterprise-grade security, centralized permissions, simple compliance. Try now.
      SAML Single Sign-On · Team Sync · User Provisioning · Flexible Hosting Options · 45 Day Free Trial
      Types: Developer Plan, Team Plan, Business Plan

    Recherches associées à github

    Résultat de recherche d'images pour "github"
    {"bc":1,"id":"6a77C1rPQj8LVM:","ml":{"278":{"bh":24,"bw":92,"o":0},"366":{"bh":31,"bw":122,"o":0},"454":{"bh":39,"bw":151,"o":0}},"oh":209,"ou":"https://assets-cdn.github.com/images/modules/logos_page/GitHub-Logo.png","ow":800,"pt":"https://assets-cdn.github.com/images/modules/logos...","rh":"github.com","ru":"https://github.com/logos","th":39,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcSdRcvgq6_BWYZoIsPpnAuElMGfUWZtNNnKvYmFnvmMnzyBsrTX9UBeERQ","tw":151}
    GitHub Inc.
    Développeuse de logiciels
    GitHub est un service web d'hébergement et de gestion de développement de logiciels, utilisant le logiciel de gestion de versions Git. Ce site est développé en Ruby on Rails et Erlang par Chris Wanstrath, PJ Hyett et Tom Preston-Werner. Wikipédia
    Création : 2008
    ================================================ FILE: test/resources/pages-evaluated/github.html ================================================ github - Recherche Google
    Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
    Environ 136 000 000 résultats (0,27 secondes) 
    ================================================ FILE: test/resources/pages-evaluated/how+is+homer+simpsons.html ================================================ how is homer simpsons - Google Search
    Screen-reader users, click here to turn off Google Instant.
    About 992,000 results (0.52 seconds) 
    A privacy reminder from Google
    Remind me later
    Review
      Image result for how is homer simpsons
      {"cr":6,"id":"Ri_K1FJnYWm-9M:","ml":{"278":{"bh":160,"bw":91,"o":0},"366":{"bh":160,"bw":91,"o":0},"454":{"bh":160,"bw":97,"o":0}},"oh":391,"ou":"https://upload.wikimedia.org/wikipedia/en/0/02/Homer_Simpson_2006.png","ow":239,"pt":"https://upload.wikimedia.org/wikipedia/en/0/02/Hom...","rh":"en.wikipedia.org","ru":"https://en.wikipedia.org/wiki/Homer_Simpson","th":160,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTgLXsmLydNtw7eAq5pcMjTNfdH8ryqfwNxDDF8uQBBpPEM4ioJ9mm1cfw","tw":97}
      Homer Simpson
      Fictional Character
      Homer Jay Simpson is the protagonist of the American animated television series The Simpsons as the patriarch of the eponymous family. Wikipedia
      ================================================ FILE: test/resources/pages-evaluated/inde(top-stories).html ================================================ inde - Recherche Google
      Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
      Environ 143 000 000 résultats (0,54 secondes) 
      Rappel concernant les règles de confidentialité de Google
      Me le rappeler plus tard
      Lire

      Recherches associées à inde

      Résultat de recherche d'images pour "inde"
      {"bc":1,"id":"c41szN6ZF6zXdM:","ml":{"278":{"bh":61,"bw":91,"o":1},"366":{"bh":121,"bw":182,"o":0},"454":{"bh":151,"bw":227,"o":0}},"oh":900,"ou":"https://upload.wikimedia.org/wikipedia/commons/4/41/Flag_of_India.svg","ow":1350,"pt":"https://upload.wikimedia.org/wikipedia/commons/4/4...","rh":"fr.wikipedia.org","ru":"https://fr.wikipedia.org/wiki/Inde","th":151,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTtZABUpdx8gpPOWr7sYWs5838DlWFUiOtdFftGOU0z0CFGIEU5Bn0Lw5mwlw","tw":227}
      Inde
      Pays en Asie du Sud
      L'Inde, en forme longue la République de l'Inde est un pays du sud de l'Asie qui occupe la majeure partie du sous-continent indien. L'Inde est le deuxième pays le plus peuplé et le septième pays le plus grand du monde. Wikipédia
      Date de fondation : 15 août 1947
      Population : 1,252 milliard (2013) Banque mondiale
      Devise : Roupie indienne
      ================================================ FILE: test/resources/pages-evaluated/narendra+modi.html ================================================ narendra modi - Google Search
      Screen-reader users, click here to turn off Google Instant.
      About 16,800,000 results (0.61 seconds) 
      A privacy reminder from Google
      Remind me later
      Review
      Some results may have been removed under data protection law in Europe. Learn more

      Searches related to narendra modi

      Image result for narendra modi
      {"id":"do0zPVLaGAQObM:","ml":{"278":{"bh":186,"bw":186,"o":0},"366":{"bh":186,"bw":186,"o":0},"454":{"bh":186,"bw":186,"o":0}},"oh":400,"ou":"https://lh6.googleusercontent.com/-zL2hGAaDwmU/AAAAAAAAAAI/AAAAAAADSGs/syPFeJfr2-A/s0-c-k-no-ns/photo.jpg","ow":400,"pt":"https://lh6.googleusercontent.com/-zL2hGAaDwmU/AAA...","rh":"plus.google.com","ru":"https://plus.google.com/111867601943112287803","th":186,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQuG7SAaKByLUtRvUF6FyOKvV0EDVg_0ATawyvMmv94HD4DF90Qco05U3dDFw","tw":186}
      Image result for narendra modi
      {"cl":3,"cr":3,"ct":3,"id":"_f8EOpRAoyDPpM:","ml":{"278":{"bh":90,"bw":91,"o":0},"366":{"bh":94,"bw":93,"o":0},"454":{"bh":92,"bw":96,"o":0}},"oh":1358,"ou":"http://pmindia.gov.in/wp-content/uploads/2014/06/High1.jpg","ow":1500,"pt":"Photo Gallery | Prime Minister of India","rh":"pmindia.gov.in","ru":"http://www.pmindia.gov.in/en/image-gallery/","s":"","st":"PMIndia","th":122,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRAUEDoIMF8YJJC3aRX47wjbHdE6NhBzfZqXtFGoSL6B0x2up8WHKmUo94","tw":135}
      Image result for narendra modi
      {"cb":3,"cl":3,"cr":3,"ct":3,"id":"pBgvXjKjJJ6ceM:","ml":{"278":{"bh":95,"bw":91,"o":0},"366":{"bh":94,"bw":85,"o":0},"454":{"bh":92,"bw":87,"o":0}},"oh":300,"ou":"https://lh3.googleusercontent.com/-UAu_0KbEMuHuMlccGwZtAo-bdM3Uo5Zr3RdEJUnDZsABV6tDUDe0ttdk-mtawAV6OY\u003dw300","ow":300,"pt":"Narendra Modi - Android Apps on Google Play","rh":"play.google.com","ru":"https://play.google.com/store/apps/details?id\u003dcom.narendramodiapp","s":"","st":"Google Play","th":125,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQNrDfpVkGaZF5_aMFqDUT0Ii7z1JyqxwUYltodXfqA3R8m-6RMcpCXDg","tw":125}
      Narendra Modi
      Prime Minister of India
      Narendra Damodardas Modi is an Indian politician who is the 14th and current Prime Minister of India, in office since May 2014. He was the Chief Minister of Gujarat from 2001 to 2014, and is the Member of Parliament for Varanasi. Wikipedia
      Born: 17 September 1950 (age 66 years), Vadnagar, India
      ================================================ FILE: test/resources/pages-evaluated/page-with-bkgrouped-results.html ================================================ кала нера - Поиск в Google
      Пользователи программ чтения с экрана: нажмите здесь, чтобы отключить Живой поиск Google.
      Результатов: примерно 121 000 (0,41 сек.) 

      Реклама

      1. Кала-Нера - Отели - Большой выбор. Удобный поиск - Booking.com‎

        Рекламаwww.booking.com/Кала-Нера
        Эта реклама соответствует вашему запросу.
        Чтобы получить более подробную информацию или отказаться от персональной рекламы, перейдите на эту страницу.
        4,5 рейтинг booking.com
        Бронируйте отели в Кала-Нера
        Типы: Отели, Апартаменты, Виллы, Хостелы, Курортные отели, Постель и завтрак

      Реклама

      1. Studios – Holiday Lettings - Holiday Rentals Kala Nera‎

        Рекламаwww.holidaylettings.co.uk/rentals
        Эта реклама соответствует вашему запросу.
        Чтобы получить более подробную информацию или отказаться от персональной рекламы, перейдите на эту страницу.
        4,5 рейтинг holidaylettings.co.uk
        Find, Book & Enjoy The Best Rentals Book Securely or Enquire Online Now
        A TripAdvisor Company · Over 548,000 Properties · Online Booking · 15 Years' Experience
        Types: Apartment, House, Villa, Cottage, B&B, Townhouse, Studio, Farmhouse, Gite, Condo
      Картинки по запросу кала нера
      {"cb":15,"id":"FFYENie7gn-0pM:","ml":{"278":{"bh":160,"bw":121,"o":0},"366":{"bh":160,"bw":122,"o":0},"454":{"bh":160,"bw":122,"o":0}},"oh":420,"ou":"http://www.aroundkalanera.com/kala-nera-pelion-greece1.jpg","ow":320,"pt":"www.aroundkalanera.com/kala-nera-pelion-greece1.jpg","rh":"aroundkalanera.com","ru":"http://www.aroundkalanera.com/","th":160,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTNf4BSgpM19GlP_6gac2S0o6PwWGIdhQTjhfpGh0_KCyfzv8_yGRvpzZ8","tw":122}
      Kala Nera
      Погода: 9°C, ветер СЗ, 2 м/с, влажность 87 %
      Местное время: четверг 02:53
      Гостиницы: Средняя стоимость номера в трехзвездочной гостинице – 3 976 ₽. Смотреть гостиницы
      ================================================ FILE: test/resources/pages-evaluated/ransomware.html ================================================ ransomware - Google Search
      Screen-reader users, click here to turn off Google Instant.
      About 15,100,000 results (0.61 seconds) 

      Searches related to ransomware

      ================================================ FILE: test/resources/pages-evaluated/shop-near-paris.html ================================================ shop near paris - Google Search
      Screen-reader users, click here to turn off Google Instant.
      About 162,000,000 results (0.70 seconds) 
      A privacy reminder from Google
      Remind me later
      Review
      Nantes - From your Internet address - Use precise location
       - Learn more   
      ================================================ FILE: test/resources/pages-evaluated/simpsons(related).html ================================================ simpsons - Google Search
      Screen-reader users, click here to turn off Google Instant.
      About 40,200,000 results (0.55 seconds) 
      A privacy reminder from Google
      Remind me later
      Review
      Image result for simpsons
      {"id":"W5jTQx0O3nxKqM:","ml":{"278":{"bh":186,"bw":124,"o":0},"366":{"bh":186,"bw":124,"o":0},"454":{"bh":186,"bw":124,"o":0}},"oh":1440,"ou":"http://www.gstatic.com/tv/thumb/tvbanners/11752965/p11752965_b_v8_ab.jpg","ow":960,"rh":"google.com","ru":"http://google.com/search?tbm\u003disch\u0026q\u003dThe%20Simpsons","th":186,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQ0HIuLFGa7zQFdQWd6XQkEmm3T4nrbyIZY_sKZAE-mf7zL44G2v6tMZavj","tw":124}
      Image result for simpsons
      {"id":"gTFxy8aM7EvbPM:","ml":{"278":{"bh":97,"bw":60,"o":0},"366":{"bh":97,"bw":94,"o":0},"454":{"bh":96,"bw":79,"o":0}},"oh":315,"ou":"https://upload.wikimedia.org/wikipedia/en/0/0d/Simpsons_FamilyPicture.png","ow":268,"rh":"en.wikipedia.org","ru":"https://en.wikipedia.org/wiki/The_Simpsons","th":134,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcQR11qhysM_JuV1naGVOhOj3pPOTGZT7h0PQf9lRo7IY2Q_XHQCQHaNj-2p","tw":114}
      Image result for simpsons
      {"id":"T6kyvfKa9bl7NM:","ml":{"278":{"bh":97,"bw":92,"o":0},"366":{"bh":97,"bw":146,"o":0},"454":{"bh":96,"bw":124,"o":0}},"oh":1536,"ou":"http://cs.ucsb.edu/~zhelfinstein/simpsons/image.jpg","ow":2560,"rh":"cs.ucsb.edu","ru":"http://cs.ucsb.edu/~zhelfinstein/simpsons/","th":109,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSbZ6UTkdQciXM4XurtBm-UDYxAOlrNUZToLgJ8RbfWIozYKnhJep6Ea_4","tw":181}
      Image result for simpsons
      {"id":"wkcAtPiUA8I4pM:","ml":{"278":{"bh":88,"bw":153,"o":0},"366":{"bh":88,"bw":120,"o":0},"454":{"bh":96,"bw":124,"o":0}},"oh":187,"ou":"https://upload.wikimedia.org/wikipedia/en/c/ca/Simpsons_cast.png","ow":533,"rh":"en.wikipedia.org","ru":"https://en.wikipedia.org/wiki/The_Simpsons","th":104,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQEXY3Ye72_ko7f98zyCw4SfM891EK0IVzm0dIf90PMXm54tsxhH5hnNCva","tw":296}
      Image result for simpsons
      {"id":"6cgIFaZwULMWHM:","ml":{"366":{"bh":88,"bw":120,"o":0},"454":{"bh":89,"bw":109,"o":0}},"oh":1660,"ou":"http://static.independent.co.uk/s3fs-public/thumbnails/image/2015/11/25/12/hfuwpcupirfetn8guqtyhq7h1j02kwfij44ieojq6o8mllxfgn7mgl6khteuz2ey.png","ow":2213,"rh":"independent.co.uk","ru":"http://www.independent.co.uk/arts-entertainment/music/news/the-simpsons-once-referenced-alan-rickman-and-david-bowie-in-brilliantly-british-clip-a6813961.html","th":90,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQuesWB0wQ7psGpagU9s9jRxiarwhRVYqx7yoKojg5b3Isbp6U7o0BfNtk","tw":120}
      Image result for simpsons
      {"id":"tOlGfU-8hT85FM:","ml":{"454":{"bh":89,"bw":109,"o":0}},"oh":372,"ou":"https://i.guim.co.uk/img/media/88f6b98714035656cb18fb282507b60e82edb0d7/0_54_2560_1536/master/2560.jpg?w\u003d620\u0026q\u003d55\u0026auto\u003dformat\u0026usm\u003d12\u0026fit\u003dmax\u0026s\u003d5532054d70d7de4422433af79f598b8c","ow":620,"rh":"theguardian.com","ru":"https://www.theguardian.com/tv-and-radio/2016/feb/17/homer-in-the-flesh-the-simpsons-announce-their-first-live-show","th":89,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSYk4MdOFf9xrC_GMiYnlJJPX4a9MbozxGvGSi6_s0G_sBp232H8FPFZNg","tw":148}
      Image result for simpsons
      {"id":"Gkapn2ZY7Ls4OM:","ml":{"454":{"bh":89,"bw":109,"o":0}},"oh":350,"ou":"http://www.gunaxin.com/wp-content/uploads/2011/05/simpsons.jpg","ow":753,"rh":"media.gunaxin.com","ru":"http://media.gunaxin.com/fifty-simpsons-facts-you-might-not-have-known/90298","th":89,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcTrrlll765luGsy0zvjHs7d9rZTj7XNucJHGiVEML_4ppFhhPHrezQ9NhIl","tw":191}
      The Simpsons
      American sitcom
      This long-running animated comedy focuses on the eponymous family in the town of Springfield in an unnamed U.S. state. The head of the Simpson family, Homer, is not a typical family man. A nuclear-plant employee, he does his best to lead his family but often finds that they are leading him. The family includes loving, blue-haired matriarch Marge, troublemaking son Bart, overachieving daughter Lisa and baby Maggie. Other Springfield residents include the family's religious neighbor, Ned Flanders, family physician Dr. Hibbert, Moe the bartender and police chief Clancy Wiggum.… More
      22. Orange Is the New Yellow
      Season 27 - May 22, 2016
      21. Simprovised
      Season 27 - May 15, 2016
      20. To Courier with Love
      Season 27 - May 8, 2016
      19. Fland Canyon
      Season 27 - Apr 24, 2016
      18. How Lisa Got Her Marge Back
      Season 27 - Apr 10, 2016
      17. The Burns Cage
      Season 27 - Apr 3, 2016
      16. The Marge-ian Chronicles
      Season 27 - Mar 13, 2016
      15. Lisa the Veterinarian
      Season 27 - Mar 6, 2016
      14. Gal of Constant Sorrow
      Season 27 - Feb 21, 2016
      13. Love Is in the N2-O2-Ar-CO2-Ne-He-CH4
      Season 27 - Feb 14, 2016
      12. Much Apu About Something
      Season 27 - Jan 17, 2016
      11. Teenage Mutant Milk-Caused Hurdles
      Season 27 - Jan 10, 2016
      10. The Girl Code
      Season 27 - Jan 3, 2016
      9. Barthood
      Season 27 - Dec 13, 2015
      8. Paths of Glory
      Season 27 - Dec 6, 2015
      7. Lisa With an 'S'
      Season 27 - Nov 22, 2015
      6. Friend With Benefit
      Season 27 - Nov 8, 2015
      5. Treehouse of Horror XXVI
      Season 27 - Oct 25, 2015
      4. Halloween of Horror
      Season 27 - Oct 18, 2015
      3. Puffless
      Season 27 - Oct 11, 2015
      2. Cue Detective
      Season 27 - Oct 4, 2015
      1. Every Man's Dream
      Season 27 - Sep 27, 2015
      22. Mathlete's Feat
      Season 26 - May 17, 2015
      21. Bull-E
      Season 26 - May 10, 2015
      20. Let's Go Fly a Coot
      Season 26 - May 3, 2015
      19. The Kids Are All Fight
      Season 26 - Apr 26, 2015
      18. Peeping Mom
      Season 26 - Apr 19, 2015
      17. Waiting for Duffman
      Season 26 - Mar 15, 2015
      16. Sky Police
      Season 26 - Mar 8, 2015
      15. The Princess Guide
      Season 26 - Mar 1, 2015
      14. My Fare Lady
      Season 26 - Feb 15, 2015
      13. Walking Big & Tall
      Season 26 - Feb 8, 2015
      12. The Musk Who Fell to Earth
      Season 26 - Jan 25, 2015
      11. Bart's New Friend
      Season 26 - Jan 11, 2015
      10. The Man Who Came to Be Dinner
      Season 26 - Jan 4, 2015
      9. I Won't Be Home for Christmas
      Season 26 - Dec 7, 2014
      8. Covercraft
      Season 26 - Nov 23, 2014
      7. Blazed and Confused
      Season 26 - Nov 16, 2014
      6. Simpsorama
      Season 26 - Nov 9, 2014
      5. Opposites A-Frack
      Season 26 - Nov 2, 2014
      4. Treehouse of Horror XXV
      Season 26 - Oct 19, 2014
      3. Super Franchise Me
      Season 26 - Oct 12, 2014
      2. The Wreck of the Relationship
      Season 26 - Oct 5, 2014
      1. Clown in the Dumps
      Season 26 - Sep 28, 2014
      22. Yellow Badge of Cowardge
      Season 25 - May 18, 2014
      21. Pay Pal
      Season 25 - May 11, 2014
      20. Brick Like Me
      Season 25 - May 4, 2014
      19. What to Expect When Bart's Expecting
      Season 25 - Apr 27, 2014
      18. Days of Future Future
      Season 25 - Apr 13, 2014
      17. Luca$
      Season 25 - Apr 6, 2014
      16. You Don't Have to Live Like a Referee
      Season 25 - Mar 30, 2014
      Sainte-Luce-sur-Loire - From your Internet address - Use precise location
       - Learn more   
      ================================================ FILE: test/resources/pages-evaluated/simpsons+donut.html ================================================ simpsons donut - Google Search
      Screen-reader users, click here to turn off Google Instant.
      About 537,000 results (0.60 seconds) 
      Sponsored
      Based on your search query, we think you are trying to find a product. Clicking in this box will show you results from providers who can fulfill your request. Google may be compensated by some of these providers. Provider updates to information may be delayed, therefore users should check the provider's site for the most up-to-date information. Some products may be advertised by merchants in other countries. The prices for these products are estimated based on current exchange rates, which can vary before purchase.
      Shop on Google
      Shop for simpsons d... on Google
      Shop for simpsons donut on Google
      La Bouée Géante Donut
      EUR17.06
       - 
      Amazon.fr
      36% price drop
      ================================================ FILE: test/resources/pages-evaluated/simpsons+movie+trailer.html ================================================ simpsons movie trailer - Recherche Google
      Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
      soufiane
      Environ 10 200 000 résultats (0,39 secondes) 

        Recherches associées à simpsons movie trailer


        ================================================ FILE: test/resources/pages-evaluated/simpsons.html ================================================ simpsons - Google Search
        Screen-reader users, click here to turn off Google Instant.
        About 65,200,000 results (0.50 seconds) 
          Image result for simpsons
          {"id":"W5jTQx0O3nxKqM:","ml":{"278":{"bh":186,"bw":124,"o":0},"366":{"bh":186,"bw":124,"o":0},"454":{"bh":186,"bw":124,"o":0}},"oh":1440,"ou":"http://www.gstatic.com/tv/thumb/tvbanners/11752965/p11752965_b_v8_ab.jpg","ow":960,"rh":"google.com","ru":"http://google.com/search?tbm\u003disch\u0026q\u003dThe%20Simpsons","th":186,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQ0HIuLFGa7zQFdQWd6XQkEmm3T4nrbyIZY_sKZAE-mf7zL44G2v6tMZavj","tw":124}
          Image result for simpsons
          {"id":"gTFxy8aM7EvbPM:","ml":{"278":{"bh":97,"bw":60,"o":0},"366":{"bh":97,"bw":94,"o":0},"454":{"bh":96,"bw":79,"o":0}},"oh":315,"ou":"https://upload.wikimedia.org/wikipedia/en/0/0d/Simpsons_FamilyPicture.png","ow":268,"rh":"en.wikipedia.org","ru":"https://en.wikipedia.org/wiki/The_Simpsons","th":134,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcQR11qhysM_JuV1naGVOhOj3pPOTGZT7h0PQf9lRo7IY2Q_XHQCQHaNj-2p","tw":114}
          Image result for simpsons
          {"id":"T6kyvfKa9bl7NM:","ml":{"278":{"bh":97,"bw":92,"o":0},"366":{"bh":97,"bw":146,"o":0},"454":{"bh":96,"bw":124,"o":0}},"oh":1536,"ou":"http://cs.ucsb.edu/~zhelfinstein/simpsons/image.jpg","ow":2560,"rh":"cs.ucsb.edu","ru":"http://cs.ucsb.edu/~zhelfinstein/simpsons/","th":109,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSbZ6UTkdQciXM4XurtBm-UDYxAOlrNUZToLgJ8RbfWIozYKnhJep6Ea_4","tw":181}
          Image result for simpsons
          {"id":"nW_rHQQtyI670M:","ml":{"278":{"bh":88,"bw":153,"o":0},"366":{"bh":88,"bw":120,"o":0},"454":{"bh":96,"bw":124,"o":0}},"oh":534,"ou":"https://pmcdeadline2.files.wordpress.com/2014/09/the-simpsons.jpg","ow":950,"rh":"deadline.com","ru":"http://deadline.com/2015/05/the-simpsons-renewed-season-27-28-1201420605/","th":104,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQg38GosHvZ15gMNw6fQewyRxrVKvTp1G9AZF4nYb3vSrE0qVGxO4oUVeqd","tw":185}
          Image result for simpsons
          {"id":"6cgIFaZwULMWHM:","ml":{"366":{"bh":88,"bw":120,"o":0},"454":{"bh":89,"bw":115,"o":0}},"oh":1660,"ou":"http://static.independent.co.uk/s3fs-public/thumbnails/image/2015/11/25/12/hfuwpcupirfetn8guqtyhq7h1j02kwfij44ieojq6o8mllxfgn7mgl6khteuz2ey.png","ow":2213,"rh":"independent.co.uk","ru":"http://www.independent.co.uk/arts-entertainment/music/news/the-simpsons-once-referenced-alan-rickman-and-david-bowie-in-brilliantly-british-clip-a6813961.html","th":90,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQuesWB0wQ7psGpagU9s9jRxiarwhRVYqx7yoKojg5b3Isbp6U7o0BfNtk","tw":120}
          Image result for simpsons
          {"id":"wkcAtPiUA8I4pM:","ml":{"454":{"bh":89,"bw":115,"o":0}},"oh":187,"ou":"https://upload.wikimedia.org/wikipedia/en/c/ca/Simpsons_cast.png","ow":533,"rh":"en.wikipedia.org","ru":"https://en.wikipedia.org/wiki/The_Simpsons","th":89,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTJvzBIA2zgj5bqa7yuxjeMvKIOtuJvSLGPpX9L7qFYkhKKjrxA58I0T5f1","tw":254}
          Image result for simpsons
          {"cl":6,"cr":9,"id":"GNXuHZgYC9BkAM:","ml":{"454":{"bh":89,"bw":97,"o":0}},"oh":387,"ou":"http://i.telegraph.co.uk/multimedia/archive/03136/Simpsons-Family_3136665b.jpg","ow":620,"rh":"telegraph.co.uk","ru":"http://www.telegraph.co.uk/culture/the-simpsons/11289466/25-things-you-never-knew-about-the-simpsons.html","th":89,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcSkPATefINGRocoSrxQGXqc1COjVeceb1KPq8v55IgitueIFy8BEKcwV8GP","tw":143}
          The Simpsons
          American sitcom
          This long-running animated comedy focuses on the eponymous family in the town of Springfield in an unnamed U.S. state. The head of the Simpson family, Homer, is not a typical family man. A nuclear-plant employee, he does his best to lead his family but often finds that they are leading him. The family includes loving, blue-haired matriarch Marge, troublemaking son Bart, overachieving daughter Lisa and baby Maggie. Other Springfield residents include the family's religious neighbor, Ned Flanders, family physician Dr. Hibbert, Moe the bartender and police chief Clancy Wiggum.… More
          First episode date: December 17, 1989
          18. How Lisa Got Her Marge Back
          Season 27 - Apr 10, 2016
          17. The Burns Cage
          Season 27 - Apr 3, 2016
          16. The Marge-ian Chronicles
          Season 27 - Mar 13, 2016
          15. Lisa the Veterinarian
          Season 27 - Mar 6, 2016
          14. Gal of Constant Sorrow
          Season 27 - Feb 21, 2016
          13. Love Is in the N2-O2-Ar-CO2-Ne-He-CH4
          Season 27 - Feb 14, 2016
          12. Much Apu About Something
          Season 27 - Jan 17, 2016
          11. Teenage Mutant Milk-Caused Hurdles
          Season 27 - Jan 10, 2016
          10. The Girl Code
          Season 27 - Jan 3, 2016
          9. Barthood
          Season 27 - Dec 13, 2015
          8. Paths of Glory
          Season 27 - Dec 6, 2015
          7. Lisa With an 'S'
          Season 27 - Nov 22, 2015
          6. Friend With Benefit
          Season 27 - Nov 8, 2015
          5. Treehouse of Horror XXVI
          Season 27 - Oct 25, 2015
          4. Halloween of Horror
          Season 27 - Oct 18, 2015
          3. Puffless
          Season 27 - Oct 11, 2015
          2. Cue Detective
          Season 27 - Oct 4, 2015
          1. Every Man's Dream
          Season 27 - Sep 27, 2015
          22. Mathlete's Feat
          Season 26 - May 17, 2015
          21. Bull-E
          Season 26 - May 10, 2015
          20. Let's Go Fly a Coot
          Season 26 - May 3, 2015
          19. The Kids Are All Fight
          Season 26 - Apr 26, 2015
          18. Peeping Mom
          Season 26 - Apr 19, 2015
          17. Waiting for Duffman
          Season 26 - Mar 15, 2015
          16. Sky Police
          Season 26 - Mar 8, 2015
          15. The Princess Guide
          Season 26 - Mar 1, 2015
          14. My Fare Lady
          Season 26 - Feb 15, 2015
          13. Walking Big & Tall
          Season 26 - Feb 8, 2015
          12. The Musk Who Fell to Earth
          Season 26 - Jan 25, 2015
          11. Bart's New Friend
          Season 26 - Jan 11, 2015
          10. The Man Who Came to Be Dinner
          Season 26 - Jan 4, 2015
          9. I Won't Be Home for Christmas
          Season 26 - Dec 7, 2014
          8. Covercraft
          Season 26 - Nov 23, 2014
          7. Blazed and Confused
          Season 26 - Nov 16, 2014
          6. Simpsorama
          Season 26 - Nov 9, 2014
          5. Opposites A-Frack
          Season 26 - Nov 2, 2014
          4. Treehouse of Horror XXV
          Season 26 - Oct 19, 2014
          3. Super Franchise Me
          Season 26 - Oct 12, 2014
          2. The Wreck of the Relationship
          Season 26 - Oct 5, 2014
          1. Clown in the Dumps
          Season 26 - Sep 28, 2014
          22. Yellow Badge of Cowardge
          Season 25 - May 18, 2014
          21. Pay Pal
          Season 25 - May 11, 2014
          20. Brick Like Me
          Season 25 - May 4, 2014
          19. What to Expect When Bart's Expecting
          Season 25 - Apr 27, 2014
          18. Days of Future Future
          Season 25 - Apr 13, 2014
          17. Luca$
          Season 25 - Apr 6, 2014
          16. You Don't Have to Live Like a Referee
          Season 25 - Mar 30, 2014
          15. The War of Art
          Season 25 - Mar 23, 2014
          14. The Winter of His Content
          Season 25 - Mar 16, 2014
          13. The Man Who Grew Too Much
          Season 25 - Mar 9, 2014
          12. Diggs
          Season 25 - Mar 9, 2014
          Homer Simpson (Dan Castellaneta)
          Homer Simpson
          Dan Castellaneta
          Bart Simpson (Nancy Cartwright)
          Bart Simpson
          Nancy Cartwright
          Marge Simpson (Julie Kavner)
          Marge Simpson
          Julie Kavner
          Mr. Burns (Harry Shearer)
          Mr. Burns
          Harry Shearer
          Lisa Simpson (Yeardley Smith)
          Lisa Simpson
          Yeardley Smith
        Nantes - From your Internet address - Use precise location
         - Learn more   
        ================================================ FILE: test/resources/pages-evaluated/simpsonsworld.html ================================================ simpsonsworld - Recherche Google
        Si vous utilisez un lecteur d'écran, cliquez ici pour désactiver la recherche instantanée Google.
        Environ 193 000 résultats (0,33 secondes) 

        Essayez avec cette orthographe : simpsons world

        Rappel concernant les règles de confidentialité de Google
        Me le rappeler plus tard
        Lire

        Recherches associées à simpsonsworld

        ================================================ FILE: test/resources/pages-evaluated/with-DOMText.html ================================================ canada glasgow - Google Search
        Screen-reader users, click here to turn off Google Instant.
        ×

        Google works better with Chrome

        Yes, get Chrome now
        About 49,600,000 results (0.63 seconds) 

        Searches related to canada glasgow

        Sponsored
        Based on your search query, we think you are trying to find a product. Clicking in this box will show you results from providers who can fulfill your request. Google may be compensated by some of these providers.
        Prices do not include shipping costs. Additional shipping costs may apply.
        ================================================ FILE: test/resources/pages-mobile/2017/11/buy+pen.html ================================================ buy pen - Google Search
        New Zealand's premiere retailer of fountain pens, inks and papers! With over 200 inks in stock and the worlds top ...
        People also search for
        Browse our full range of luxury pens, including fountain & ball pens from brands like Mont Blanc, Cross & Parker. Buy ...
        People also search for
        (Buy). (Just missed: It's awesome to see some of these pens make other lists on this page as well. Good pens will rule in ...
        People also search for
        Results 1 - 25 of 44 · Pilot Dr. Grip Red Ballpoint Pen Refill Medium Tip 1366351 Unit: EACH (Order 12 to receive one ...
        People also search for
        Results 1 - 24 of 18193 · Amazon.in - Buy Pens, Pencils & Writing Supplies Online at Low Prices in India at Amazon.in.
        People also search for
        The finest UK online pen shop: 16000+ products at great prices. Secure ordering. Expert knowledge. Best customer ...
        People also search for
        Fine writing instruments, office supplies and art products imported from Japan and Europe. Bestselling brands include ...
        People also search for
        Shop pens for sale - search our specials, promos and deals! Buy pens online and save at Pen Chalet!
        People also search for
        https://www.priceme.co.nz › Pen-Refills-I...
        Products 1 - 48 of 207 - Compare Pen Refills & Ink prices and read reviews on PriceMe. Buy online from the best shops in ...
        Our pen range focuses on quality, value, choice. We offer top brands such as Parker and niche brands such as Otto Hut.
        People also search for
        Found in related search
        "what types of pens are there"
        ================================================ FILE: test/resources/pages-mobile/2017/11/donald+trump.html ================================================ donald trump - Google Search
        Top stories
        People also search for
        Donald Trump
        45th U.S. President
        Image result for donald trump
        {"cb":21,"cl":6,"clt":"n","cr":6,"id":"4NO0z2NLW3FtJM:","oh":1008,"ou":"https://upload.wikimedia.org/wikipedia/commons/0/0e/Donald_Trump_Pentagon_2017.jpg","ow":732,"pt":"https://upload.wikimedia.org/wikipedia/commons/0/0...","rh":"en.wikipedia.org","rid":"oUQ97aEz8anNMM","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Donald_Trump","s":"","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQYXYzeviQtazGbO9WzjmoKsvt7mhBfVoEGn1UytUkzds8HrYNGeWZ_4Lg","tw":104}
        Image result for donald trump
        {"cb":6,"cl":21,"clt":"n","cr":9,"id":"mviNm0r25RO5hM:","oh":3204,"ou":"http://static6.businessinsider.com/image/55918b77ecad04a3465a0a63/nbc-fires-donald-trump-after-he-calls-mexicans-rapists-and-drug-runners.jpg","ow":4272,"pt":"NBC dumps Donald Trump - Business Insider","rh":"businessinsider.com","rid":"u5KvH8wffqinOM","rmt":0,"rt":0,"ru":"http://www.businessinsider.com/nbc-donald-trump-2015-6","s":"","st":"Business Insider","th":145,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTYN8RnF4McymswiaufBpamU-9bOkEmljfEgGRrpxIzEU8TiDbS653YO_kx","tw":194}
        Image result for donald trump
        {"cb":3,"cl":15,"clt":"n","id":"P1eN6F450zU-sM:","oh":2147,"ou":"https://timedotcom.files.wordpress.com/2017/07/donald-trump-nobody-scared.jpg","ow":3000,"pt":"Donald Trump Doesn\u0027t Scare Washington Any More","rh":"time.com","rid":"ZfkOKJn8yAY7KM","rmt":0,"rt":0,"ru":"http://time.com/4878779/trump-healthcare-sessions-russia/","s":"","st":"Time Magazine","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTcQ_s9vfVOhUbZIPFgJ1gw2lO4MFQ5xBK7BzAW8Hh4vQfJdy1iAeLaQc8vEw","tw":201}
        Image result for donald trump
        {"cb":6,"cl":6,"clt":"n","cr":6,"ct":6,"id":"4jJSSDDjk-oScM:","oh":300,"ou":"https://www.biography.com/.image/c_fill%2Ccs_srgb%2Cg_face%2Ch_300%2Cq_80%2Cw_300/MTQxNzI4NTg2OTU1NDk5MDE3/donald_trump_photo_michael_stewartwireimage_gettyimages_169093538_croppedjpg.jpg","ow":300,"pt":"President Donald J. Trump - Biography.com","rh":"biography.com","rid":"DcKsvS2TtQo45M","rmt":0,"rt":0,"ru":"https://www.biography.com/people/donald-trump-9511238","s":"Donald Trump","st":"Bio.com","th":168,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcReDZI6BDMyhRx7wofetdok8FULaVj05eJMoVaYoAsxR5Ol0Rm5k18EL0qQ","tw":168}
        Image result for donald trump
        {"cb":9,"cl":21,"clt":"n","cr":12,"id":"AP2xObcmi3yMnM:","oh":537,"ou":"http://c3.nrostatic.com/sites/default/files/styles/original_image_with_cropping/public/uploaded/donald-trump-pragmatist-not-conservative.jpg?itok\u003dqZ3401jJ","ow":920,"pt":"Donald Trump: Pragmatist Not Conservative | National Review","rh":"nationalreview.com","rid":"HJ7MH2hqeMbBLM","rmt":0,"rt":0,"ru":"http://www.nationalreview.com/article/442221/donald-trump-pragmatist-not-conservative","s":"","st":"National Review","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTVNalpzbxKvtrd2bFHMlPkf4gWKILDwArTknJcnmUGDwRcTsgLC1TpX_IC","tw":247}
        Image result for donald trump
        {"cb":12,"cl":18,"clt":"n","cr":18,"dhl":1,"id":"3McUP8a5KsQlhM:","oh":2537,"ou":"http://static4.businessinsider.com/image/566efa6172f2c15b028b56ae/donald-trumps-support-just-soared-to-a-new-high.jpg","ow":3383,"pt":"POLL: Trump\u0027s support jumps to 41% - Business Insider","rh":"businessinsider.com","rid":"yP6FehT7lHHMDM","rmt":0,"rt":0,"ru":"http://www.businessinsider.com/poll-donald-trump-monmouth-2015-12","s":"","st":"Business Insider","th":145,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSrjbMMaNIyqXyu6CwawU3EEfwqtChuITO253UE59V3HrzmLfS0fFJfpRE5mg","tw":194}
        Image result for donald trump
        {"cb":6,"cl":18,"clt":"n","cr":9,"id":"9goIX11Lf6XduM:","oh":360,"ou":"http://static6.uk.businessinsider.com/image/56c7401fdd0895916d8b45f6-480/donald-trump.jpg","ow":480,"pt":"Celebrities who endorse Donald Trump - Business Insider","rh":"uk.businessinsider.com","rid":"ogz85I2EdVqnNM","rmt":0,"rt":0,"ru":"http://uk.businessinsider.com/donald-trump-celebrity-endorsements-2-2016-7","s":"Donald Trump","st":"Business Insider","th":145,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQl5QwxK3DA0WvTB73o3iCWY8XqzDNPOieRDOMq-u2a1YTnhT4cX3G9mRlegw","tw":194}
        Image result for donald trump
        {"cb":21,"cl":12,"clt":"n","cr":12,"id":"Ug1Ps2oOonzUzM:","oh":1666,"ou":"http://euromaidanpress.com/wp-content/uploads/2017/07/trump.jpg","ow":2500,"pt":"Russia, Ukraine, and the Trump scandals -Euromaidan Press |","rh":"euromaidanpress.com","rid":"-CdN6qHVXp1LhM","rmt":0,"rt":0,"ru":"http://euromaidanpress.com/2017/07/15/russia-ukraine-and-the-trump-scandals/","s":"Photo: TheDuran.com","st":"Euromaidan Press","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRPy2pyqmGUT_17_EdXuumUh89nwpNal2c6K5uQITOMk2tpOOni1WuUpdEJ8Q","tw":216}
        Image result for donald trump
        {"cl":15,"clt":"n","cr":15,"id":"yvFg3h-mcJTEHM:","oh":259,"ou":"http://i2.cdn.turner.com/cnnnext/dam/assets/160118134132-donald-trump-nigel-parry-large-169.jpg","ow":460,"pt":"Let\u0027s get a Trump Wallpaper Dump going! : The_Donald","rh":"reddit.com","rid":"8HDryIzm2yJNfM","rmt":0,"rt":0,"ru":"https://www.reddit.com/r/The_Donald/comments/4lg0vt/lets_get_a_trump_wallpaper_dump_going/","s":"The best you\u0027ll get","st":"Reddit","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTp12mmkb84ZZf1AVlSasBtU0nXRlorwOuvdwU68y-CO67s10g1kHLMLPGD","tw":256}
        Image result for donald trump
        {"cb":12,"cl":18,"clt":"n","cr":12,"id":"OPelo1b8TjaEnM:","oh":537,"ou":"http://www.businesspundit.com/wp-content/uploads/2016/06/Donald-Trump-and-the-press-credentials-game.jpg","ow":920,"pt":"donald trump Archives - Business Pundit","rh":"businesspundit.com","rid":"FLn8eVlE291rWM","rmt":0,"rt":0,"ru":"http://www.businesspundit.com/tag/donald-trump/","s":"","st":"Business Pundit","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcROPLfZbSxOFhgD3CpQJgy00PUM1tW1ilFeIT4nHH-YDq7sPv2HE96em__Z","tw":247}
        Image result for donald trump
        {"cb":6,"cl":12,"clt":"n","cr":18,"id":"wrTJAXTi7FuSDM:","oh":321,"ou":"https://i2-prod.mirror.co.uk/incoming/article7898631.ece/ALTERNATES/s482b/Donald-Trump.jpg","ow":482,"pt":"Donald Trump - latest news \u0026 analysis of US Presidential candidate ...","rh":"mirror.co.uk","rid":"66qolN23ICm_oM","rmt":0,"rt":0,"ru":"http://www.mirror.co.uk/all-about/donald-trump","s":"Donald Trump - latest news \u0026 analysis of US Presidential candidate - Mirror Online","st":"Daily Mirror","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSnaynUKO9Ld0hFL5qZU5OGRpWquD8mIkqhh9qEFyQK192888ys50SUxY1b","tw":216}
        Donald John Trump is the 45th and current President of the United States, in office since January 20, 2017. Before entering politics, he was a businessman and television personality. Trump was born in the New York City borough of Queens. Wikipedia
        Net worth: 3.1 billion USD (2017) Forbes
        Spouse: Melania Trump (m. 2005), Marla Maples (m. 1993–1999), MORE
        Donald J. Trump is the very definition of the American success story, continually setting the standards of excellence while expanding his ...

        I will be interviewed by @IngrahamAngle on @FoxNews at 10:00. Enjoy!
        55 minutes ago
        The @TuckerCarlson opening statement about our once cherished and great FBI was so sad to watch. James Comey's leadership was a disaster!
        58 minutes ago
        ....This is real collusion and dishonesty. Major violation of Campaign Finance Laws and Money Laundering - where is our Justice Department?
        2 hours ago
        Donna Brazile just stated the DNC RIGGED the system to illegally steal the Primary from Bernie Sanders. Bought and paid for by Crooked H....
        2 hours ago
        Great Tax Cut rollout today. The lobbyists are storming Capital Hill, but the Republicans will hold strong and do what is right for America!
        2 hours ago
        Wikipedia › wiki › Donald_Trump
        Donald John Trump (born June 14, 1946) is the 45th and current President of the United States, in office since January 20, 2017. Before ...
        CNBC › donald-trump
        President Donald Trump's underlying message on North Korea is fundamentally the right one, according to former U.N. ...
        Donald J Trump for President
        Help continue our promise to Make America Great Again!
        Facebook › DonaldTrump
        Donald J. Trump, New York, NY. 22786828 likes · 1131505 talking about this. This is the official Facebook page for Donald J. Trump.
        ================================================ FILE: test/resources/pages-mobile/2017/12/foo.html ================================================ foo - Recherche Google
        Foo Fighters
        Groupe de rock
        Résultat de recherche d'images pour "foo"
        {"cb":6,"id":"Kuy50UGL7vk9TM:","oh":220,"ou":"https://images.sk-static.com/images/media/img/col3/20160826-182531-571022.jpg","ow":220,"pt":"https://images.sk-static.com/images/media/img/col3...","rh":"songkick.com","rid":"OLuldb0hpdCEPM","rmt":0,"rt":0,"ru":"https://www.songkick.com/artists/29315-foo-fighters","s":"","th":116,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTtb0CcVbbiZnTQjbLQPowIT820iAi-vnjQczC2sHYQ1-kmaMXYREcvxQ","tw":115}
        En savoir plus sur Foo Fighters
        foo \fu\ invariable. (Anglicisme informatique) (Programmation informatique) Variable métasyntaxique en programmation informatique.
        Recherches associées
        Vidéos
        foo : historiquement fu, pour fucked up, ou peut-être forward observation officer, connus pendant la Seconde Guerre mondiale notamment pour les inscriptions laissées derrière les lignes ennemies foo was here ; selon une autre interprétation, ...
        Recherches associées
        Foo Fighters est un groupe de rock américain, formé à Seattle, Washington. Il est formé en 1994 durant la dissolution de Nirvana, à la suite de la mort de son leader Kurt Cobain. Dave Grohl, le batteur du groupe, se lance alors dans son projet, ...
        Recherches associées

        15 sept. 2017 · Le nouvel album des Foo Fighters est selon le leader Dave Grohl leur "plus grand" à ce jour. "Concrete and Gold" célèbre surtout le mariage des extrêmes, celui de la brutalité et de la dentelle, du heavy rock et de la pop.
        Foo Fighters. 11999315 likes · 43015 talking about this. Get Sonic Highways: iTunes - http://smarturl.it/FFSH Direct / Vinyl -...
        Recherches associées
        14 sept. 2017 · Mais qu'importe ! Nous allons assister ce soir à un show unique : un concert secret des Foo Fighters, venus spécialement en Europe pour fêter avec quelques privilégiés la sortie de leur nouvel album, Concrete and Gold.
        Recherches associées
        18 sept. 2017 · Foo Fighters : La collaboration tant attendue des Foo Fighters avec Justin Timberlake est enfin dévoilée. Intitulée Make It Right, on peut la retrouver sur le nouvel album du groupe de Dave Grohl.
        Recherches associées
        Écoutez Foo Fighters sur Deezer. Avec Deezer, musique en streaming, découvrez plus de 43 millions de titres, créez vos propres playlists, téléchargez- les et partagez vos titres préférés avec vos amis.
        Recherches associées
        15 oct. 2017 · L'ancien batteur de Nirvana est depuis plus de vingt ans à la tête des Foo Fighters, avec un succès qui ne se dément pas. Pour nous, il revient sur so...
        Recherches associées
        ================================================ FILE: test/resources/pages-mobile/2017/12/who+is+homer+simpsons.html ================================================ who is homer simpson - Google Search
        Homer Simpson
        Fictional character
        Image result for who is homer simpson
        {"bc":1,"id":"Ri_K1FJnYWm-9M:","oh":391,"ou":"https://upload.wikimedia.org/wikipedia/en/0/02/Homer_Simpson_2006.png","ow":239,"pt":"https://upload.wikimedia.org/wikipedia/en/0/02/Hom...","rh":"en.wikipedia.org","rid":"h3QYNWMXpCxZeM","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Homer_Simpson","s":"","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTEfDGolOWI92nuvw3fPwCCywndXr-KjO_RTp-6NS0Nag2eh6C9gKoMfFI","tw":88}
        Image result for who is homer simpson
        {"id":"LUyP6TgE2c5CbM:","oh":1688,"ou":"https://media.gq.com/photos/57672ef65db2e8cb18c9e9a8/master/pass/homer-simpson-driving.jpg","ow":3000,"pt":"Counterpoint: Homer Simpson Is the Best TV Dad of All Time | GQ","rh":"gq.com","rid":"e1_ooCVhscgGVM","rmt":0,"rt":0,"ru":"https://www.gq.com/story/homer-simpson-is-the-best-dad-on-television","s":"","st":"GQ","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQlQ5u2Ozk4VRrK8uHwzDTi14DyM9McDz3cczovtK7S57qVDXQOiiSkguDC","tw":256}
        Image result for who is homer simpson
        {"id":"txf45XkUBFgzvM:","oh":724,"ou":"https://i.ytimg.com/vi/9D420SOmL6U/maxresdefault.jpg","ow":1280,"pt":"Homer Simpson: An economic analysis - YouTube","rh":"youtube.com","rid":"T2hy746a6gdYGM","rmt":3,"rt":0,"ru":"https://www.youtube.com/watch?v\u003d9D420SOmL6U","s":"","st":"YouTube","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQTY4N8U5V2rWFHcBOlMQYCDQydl6L60eHH9WOI6U0fEaShiLZbMTcytVyGwQ","tw":255}
        Image result for who is homer simpson
        {"id":"ry8PuOi26RqgOM:","oh":201,"ou":"https://upload.wikimedia.org/wikipedia/en/f/fd/Evolution_of_Homer.jpg","ow":370,"pt":"Homer Simpson - Wikipedia","rh":"en.wikipedia.org","rid":"h3QYNWMXpCxZeM","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Homer_Simpson","s":"Evolution_of_Homer.jpg","st":"Wikipedia","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQeu4ug9QunvQBHd6igkgS7ZukAk1MUXe1_JAFud8d45SGnKQ09zOK9wseyvA","tw":265}
        Image result for who is homer simpson
        {"id":"OV0EHIRtJyKfDM:","oh":1080,"ou":"http://cdn.skim.gs/images/homer-simpson-doughnuts/what-homer-simpson-taught-us-about-doughnuts","ow":1920,"pt":"15 Things Homer Simpson taught us about doughnuts","rh":"sheknows.com","rid":"48UHaPs_HHMC4M","rmt":0,"rt":0,"ru":"http://www.sheknows.com/food-and-recipes/articles/1085066/what-homer-simpson-taught-us-about-doughnuts","s":"All the things we\u0027ve learned about doughnuts from Homer Simpson","st":"SheKnows","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQzO2_AFLbHCc57GMjML3kpEMFFhLL2WA9hngxqZLMx7sAccXfRKTFs7pQv","tw":256}
        Image result for who is homer simpson
        {"id":"2504qPhbrwi1ZM:","oh":1008,"ou":"https://i.pinimg.com/736x/38/3a/58/383a58ca477cf05fa7e5049c08e93092--simpsons-funny-quotes-los-simpsons.jpg","ow":736,"pt":"Best 25+ Homer simpson donuts ideas on Pinterest | Homer donuts ...","rh":"pinterest.com","rid":"HJMZoZluyYdU2M","rmt":0,"rt":0,"ru":"https://www.pinterest.com/explore/homer-simpson-donuts/","s":"Homer Simpson\u0027s Brain - it could be mine!","st":"Pinterest","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQX3rrMv8qef6kqj_zr49Ug-aGNNMt31oIo-5FPbSe2Rj9Y4Orlt-2FsDLm","tw":105}
        Image result for who is homer simpson
        {"id":"R3UC6SHKupjfzM:","oh":482,"ou":"https://static.comicvine.com/uploads/original/3/33224/662473-simpson__mit_bier_auf_couch_.png","ow":360,"pt":"Homer Simpson (Character) - Comic Vine","rh":"comicvine.gamespot.com","rid":"V6Hh4Zen-jba0M","rmt":0,"rt":0,"ru":"https://comicvine.gamespot.com/homer-simpson/4005-3399/","s":"Origins. Homer Simpson ...","st":"Comic Vine - GameSpot","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQ1qU3lZmBDhHj50sR7zDuDSgY97xDmBFDTzGfSpAtYhgrILreCZWdvzHY","tw":108}
        Image result for who is homer simpson
        {"id":"U1-UnJxth6rdBM:","oh":480,"ou":"https://fthmb.tqn.com/FU71bS7KjyK_NNSa7LcHpmS8h1Y\u003d/768x0/filters:no_upscale()/simpsons1920-58b5a0013df78cdcd87a03bc.jpg","ow":768,"pt":"How old is Homer/Marge/Bart/Lisa/Maggie Simpson?","rh":"thoughtco.com","rid":"yAR8k123kKZ4hM","rmt":0,"rt":0,"ru":"https://www.thoughtco.com/age-of-homer-marge-bart-lisa-135494","s":"","st":"ThoughtCo","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTI8wk5tFvTEfW2IQ-K3xAPEQNdinj90hwU2HPPL0O5v4wluiE2jsFZYJif","tw":230}
        Image result for who is homer simpson
        {"cl":15,"cr":21,"id":"cNKBdWLb8Kxi0M:","oh":653,"ou":"https://vignette.wikia.nocookie.net/simpsons/images/c/c2/HerbPowell.png/revision/latest?cb\u003d20100514235926","ow":452,"pt":"Herbert Powell | Simpsons Wiki | FANDOM powered by Wikia","rh":"simpsons.wikia.com","rid":"BEXSokqsg84ehM","rmt":0,"rt":0,"ru":"http://simpsons.wikia.com/wiki/Herbert_Powell","s":"Herbert Powell","st":"Simpsons Wiki - Fandom","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTOgussgG3PAwgzfoXp_H14wLEVcJpcbsDHSvHg5LPVhkQ3jtDQk_7jqG1A","tw":100}
        Image result for who is homer simpson
        {"cl":21,"cr":18,"id":"G4nDz9x21hzTLM:","oh":500,"ou":"http://vignette1.wikia.nocookie.net/p__/images/3/3c/HomerSimpson.png/revision/latest?cb\u003d20140217213212\u0026path-prefix\u003dprotagonist","ow":300,"pt":"Homer Simpson | Heroes Wiki | FANDOM powered by Wikia","rh":"hero.wikia.com","rid":"izZNdmTy3Gl_2M","rmt":0,"rt":0,"ru":"http://hero.wikia.com/wiki/Homer_Simpson","s":"","st":"Heroes Wikia - Fandom","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTxlmzBglKiE_1gnTvJvyxKOcOEq2XFQiVClWetLUKbgJM6SGw74N7NdOk","tw":86}
        Image result for who is homer simpson
        {"id":"Lp6w0fDo4eyOSM:","oh":240,"ou":"http://statici.behindthevoiceactors.com/behindthevoiceactors/_img/actors/dan-castellaneta-9.14.jpg","ow":210,"pt":"Dan Castellaneta | Behind The Voice Actors","rh":"behindthevoiceactors.com","rid":"BQBBAgo_jhPBLM","rmt":0,"rt":0,"ru":"http://www.behindthevoiceactors.com/Dan-Castellaneta/","s":"Dan Castellaneta","st":"Behind The Voice Actors","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRdRIo2Wnoe0pa4rNFvZudxsRS_1WNELOkGNwEScdiFkoML2tqS9aRTXyQU","tw":126}
        Homer Jay Simpson is a fictional character and the main protagonist of the American animated television series The Simpsons as the patriarch of the eponymous family. Wikipedia
        Age: 39
        Videos from the web
        People also ask
        Role in The Simpsons. Homer is the bumbling husband of Marge and father of Bart, Lisa and Maggie Simpson. He is the son of Mona and Abraham "Grampa" Simpson.
        People also search for
        Homer Jay Simpson, Sr. (born May 12, 1956), is the protagonist of the show and the spouse of Marge Simpson and the father of Bart Simpson, Lisa Simpson, and Maggie Simpson. Homer is overweight, lazy, and often ignorant to the world around him.
        Children: Bart Simpson
        Parents: Abraham Simpson II and Mona Simpson (deceased)
        People also search for
        The plant is notorious for being poorly maintained, largely due to owner Charles Montgomery Burns' miserliness and safety inspector Homer Simpson's incompetence.
        People also search for
        Herbert "Herb" Powell is Homer Simpson's seldom-seen long-lost older parental half- brother. He...
        People also search for
        Jul 6, 2017 · Homer Simpson is a middle aged, lazy, fat, ignorant man who lives in Springfield with the rest of his family, the Simpsons. Although he is somewhat a ...
        Character Type: Human
        Powers: Berserker Strength Super Eating
        First Appearance: Cracked #257
        Appears in: 881 issues
        People also search for
        Mar 8, 2017 · Homer Simpson is 36 years-old. In Season 4's "Lisa the Beauty Queen," Homer tells the "guess your age" carnie that he's 36, when the carnie ...
        People also search for
        edition.cnn.com › entertainment › feat-h...
        May 14, 2015 - (CNN) For nearly 600 episodes of "The Simpsons," Harry Shearer has been the voice of many of the show's most iconic characters -- among them ...
        Jul 9, 2015 · Voice acting is a craft that's as intimate as a conversation, yet can be completely hidden from view. This is what some of the world's most well-known ...
        People also search for
        ================================================ FILE: test/resources/pages-mobile/2018/03/foo.html ================================================ foo - Recherche Google
        Foo Fighters
        Groupe de rock
        Résultat de recherche d'images pour "foo"
        {"cb":3,"cl":6,"cr":6,"id":"H9PIUwanPe7tyM:","oh":445,"ou":"http://freakingeek.com/wp-content/uploads/2017/06/FooFighters2017-800x445.jpg","ow":800,"pt":"freakingeek.com/wp-content/uploads/2017/06/FooFigh...","rh":"freakingeek.com","rid":"FALttJIFd-odWM","rmt":0,"rt":0,"ru":"http://freakingeek.com/foo-fighters-accorhotels-arena-paris-03072017-chronique-concert/","s":"","sc":1,"th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcReZXERKki93N2YddROBpv5AfZkGr3eeG_EQUYm76hLdZf30WQ54u3DRBU","tw":200}
        Résultat de recherche d'images pour "foo"
        {"cb":3,"cr":12,"ct":3,"id":"ivFjZwdg6h4F6M:","oh":902,"ou":"https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/FoosLollBerlin190917-74_%28cropped%29.jpg/1200px-FoosLollBerlin190917-74_%28cropped%29.jpg","ow":1200,"pt":"Foo Fighters - Wikipedia","rh":"en.wikipedia.org","rid":"IFKxiOl32Eyh4M","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Foo_Fighters","s":"","sc":1,"st":"Wikipedia","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSut_EaMVYg1zbYnEJD77AhooR-qPWnJzeEQoGJnKaElfNTt9Z7BgQNUqU","tw":148}
        Résultat de recherche d'images pour "foo"
        {"cl":9,"cr":3,"ct":6,"id":"n9GG-MeQx6oYEM:","oh":720,"ou":"https://i.ytimg.com/vi/ojmoqwFvfJU/maxresdefault.jpg","ow":1280,"pt":"Foo Fighters - Run (Audio) - YouTube","rh":"youtube.com","rid":"0F8mwd4p3Ab1sM","rmt":3,"rt":0,"ru":"https://www.youtube.com/watch?v\u003dojmoqwFvfJU","s":"Foo Fighters - Run (Audio)","st":"YouTube","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQWBpEUqfyPWh_YEmNssmRVqa3TozRYIlMOTRUwn6soz9OZQitssgXy_Pk","tw":197}
        Résultat de recherche d'images pour "foo"
        {"id":"zdMfe0zcubImxM:","oh":798,"ou":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Foo_Fighters_Live_29.jpg/1200px-Foo_Fighters_Live_29.jpg","ow":1200,"pt":"Foo Fighters discography - Wikipedia","rh":"en.wikipedia.org","rid":"b2P2BmZFIQDfIM","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Foo_Fighters_discography","s":"","st":"Wikipedia","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSnChjXdc20ULowPwSXgZQBkhlGyDIa8SSj1rb_DfknSM1pqFrFDqLok8-s","tw":167}
        Résultat de recherche d'images pour "foo"
        {"cb":12,"cr":6,"ct":6,"id":"85olK3VLFnO0iM:","oh":720,"ou":"https://img.youtube.com/vi/ifwc5xgI3QM/maxresdefault.jpg","ow":1280,"pt":"Les Foo Fighters organisent le \"Cal Jam 2017\", leur propre festival","rh":"live-arena.com","rid":"fAEi5_w2BxCkwM","rmt":0,"rt":0,"ru":"https://live-arena.com/foo-fighters-organisent-propre-festival-cal-jam-2017/","s":"YouTube Video Preview","st":"Live Arena","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRzaFXVqaDAyDHhJvhyZP61vOnSgeA_WDhZFUdh9SX3Hyo_JTV_nw3qGLM","tw":197}
        Résultat de recherche d'images pour "foo"
        {"cl":3,"cr":6,"id":"5Y1VEUS87ukbyM:","oh":146,"ou":"https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Foo_Fighters_2009.jpg/220px-Foo_Fighters_2009.jpg","ow":220,"pt":"Foo Fighters - Wikipedia","rh":"en.wikipedia.org","rid":"IFKxiOl32Eyh4M","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Foo_Fighters","s":"Foo Fighters in 2009. From left to right: Hawkins, Shiflett, Grohl, Mendel","sc":1,"st":"Wikipedia","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcRBRcO1sAJgxYExZaXRmHrp7TrgObVSrfib9BkYqAYuU3qjYxHgVUUVn2M","tw":167}
        Résultat de recherche d'images pour "foo"
        {"id":"oYbmBY234-Ao1M:","oh":864,"ou":"https://i.ytimg.com/vi/SBjQ9tuuTJQ/maxresdefault.jpg","ow":1536,"pt":"Foo Fighters - The Pretender - YouTube","rh":"youtube.com","rid":"HQb3GZgqDD9_CM","rmt":3,"rt":0,"ru":"https://www.youtube.com/watch?v\u003dSBjQ9tuuTJQ","s":"","st":"YouTube","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSSU4rMlj03VMvfe4npKszn4U9kpCAxqy-W_5uF9bVLCM5ewbx0AG2eEKpX","tw":197}
        Résultat de recherche d'images pour "foo"
        {"cb":21,"cl":21,"cr":18,"id":"WG9p-pyUlTs5OM:","oh":1080,"ou":"https://i.ytimg.com/vi/4PkcfQtibmU/maxresdefault.jpg","ow":1920,"pt":"Foo Fighters. Walk. - YouTube","rh":"youtube.com","rid":"u2jTluQZFXKYlM","rmt":3,"rt":0,"ru":"https://www.youtube.com/watch?v\u003d4PkcfQtibmU","s":"","sc":1,"st":"YouTube","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTdiRxIm8ZUAe1Blz6S0t7CQRrVufSwiUjbo7K4gTjCEIYnwO83NxpO2HY","tw":197}
        Résultat de recherche d'images pour "foo"
        {"id":"KFReFVmJ3XbzvM:","oh":426,"ou":"https://images-na.ssl-images-amazon.com/images/I/51YIhRYS1xL.jpg","ow":500,"pt":"Foo Fighters: Foo Fighters: Amazon.fr: Musique","rh":"amazon.fr","rid":"qTJTA_52K00uCM","rmt":2,"rt":0,"ru":"https://www.amazon.fr/Foo-Fighters/dp/B0000CAXID","s":"","st":"Amazon","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSZQEXDzUEl1wgtJsRAgM20Y5-jI5id4olL808iP9rndIgzaKye0Y-UzF8","tw":131}
        Résultat de recherche d'images pour "foo"
        {"cb":21,"cl":6,"cr":18,"id":"mD9EZ3aACCKj-M:","oh":720,"ou":"https://i.ytimg.com/vi/YDVAQI-4lto/maxresdefault.jpg","ow":1280,"pt":"Foo Fighters - These Days - YouTube","rh":"youtube.com","rid":"67_LDATTAD4lXM","rmt":3,"rt":0,"ru":"https://www.youtube.com/watch?v\u003dYDVAQI-4lto","s":"","sc":1,"st":"YouTube","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQ3j7Zbmedzydltf13-mynwRujBh3uQfim5GiuKrobfK1nAPA2961UkSEU","tw":197}
        Résultat de recherche d'images pour "foo"
        {"cb":12,"id":"UT8iLHczbg5rLM:","oh":150,"ou":"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Foo_Fighters_Live_21.jpg/220px-Foo_Fighters_Live_21.jpg","ow":220,"pt":"Foo Fighters - Wikipedia","rh":"en.wikipedia.org","rid":"IFKxiOl32Eyh4M","rmt":0,"rt":0,"ru":"https://en.wikipedia.org/wiki/Foo_Fighters","s":"Echoes, Silence, Patience \u0026 Grace and Greatest Hits (2007\u20132009)","st":"Wikipedia","th":111,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQItpwkvwJYm26M15cCh-IDVk27N8afrO-bwQ3MTB3dkpGyHD8tR-Whcbg","tw":163}
        Foo Fighters est un groupe de rock américain, formé à Seattle, Washington. Il est formé en 1994 durant la dissolution de Nirvana, à la suite de la mort de son leader Kurt Cobain. Wikipédia
        En savoir plus sur Foo Fighters
        foo : historiquement fu, pour fucked up, ou peut-être forward observation officer, connus pendant la Seconde Guerre mondiale notamment pour les inscriptions laissées derrière les lignes ennemies foo was here ; selon une autre interprétation, ...
        Vidéos
        Foo Fighters est un groupe de rock américain, formé à Seattle, Washington. Il est formé en 1994 durant la dissolution de Nirvana, à la suite de la mort de son leader Kurt Cobain. Dave Grohl, le batteur du groupe, se lance alors dans son projet, ...
        Pays d'origine : États-Unis
        Années actives : Depuis 1994
        Labels : RCA, Capitol Records
        foo \fu\ invariable. (Anglicisme informatique) (Programmation informatique) Variable métasyntaxique en programmation informatique.
        Foo Fighters - The Sky Is A Neighborhood. 26,903,023 views 7 months ago. Get " The Sky Is A Neighborhood" from the new album 'Concrete and Gold' available now: http://smarturl.it/FFCG Video directed by Dave Grohl. Explore your ...
        Foo Fighters. 11 967 824 J'aime · 32 762 en parlent. Get Sonic Highways: iTunes - http://smarturl.it/FFSH Direct / Vinyl - http://bit.ly/sonic-highways...
        15 sept. 2017 · ON ADORE – Ses ennuis de santé derrière lui, Dave Grohl repart à l'assaut de la planète rock avec "Concrete and Gold", le neuvième album de ses Foo Fighters. La preuve supplémentaire que l'ancien batteur de Nirvana, ...
        15 oct. 2017 · L'ancien batteur de Nirvana est depuis plus de vingt ans à la tête des Foo Fighters, avec un succès qui ne se dément pas. Pour nous, il revient sur so...
        15 sept. 2017 · Le nouvel album des Foo Fighters est selon le leader Dave Grohl leur "plus grand" à ce jour. "Concrete and Gold" célèbre surtout le mariage des extrêmes, celui de la brutalité et de la dentelle, du heavy rock et de la pop.

        Foo Production c'est aussi un large réseau de professionnel dans multiples secteurs. Foo Production a vu le jour en 2007 à Thionville (57), à ce moment-là c' était une salle de remise en forme de 800m². Depuis, le gérant Younesse El Hariri, ...
        ================================================ FILE: test/resources/pages-mobile/2018/07/simpsons-episode-1.html ================================================ simpsons episode 1 - Recherche Google
        Noël mortel
        Épisode de série télévisée
        Résultat de recherche d'images pour "simpsons episode 1"
        {"id":"TYhSGXl-TTEq3M:","oh":231,"ou":"http://www.simpsonspark.com/framegrabs/7g08/frame185.jpg","ow":320,"pt":"www.simpsonspark.com/framegrabs/7g08/frame185.jpg","rh":"simpsonspark.com","rid":"LStjE302eytJJM","rmt":0,"rt":0,"ru":"http://www.simpsonspark.com/episodes/noel_mortel.php","s":"","sc":1,"th":116,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTY35wGJRVHPo3si1whtloLTFJBCIxitRxhP9MC7TP_pWjAA3Yuc9hqVeg","tw":160}
        Noël mortel ou Homer au nez rouge, aussi connu sous le titre Les Simpson : Spécial de Noël, est le 1ᵉʳ épisode long de la série télévisée d'animation Les Simpson à avoir été diffusé, même s'il était originellement le huitième épisode produit pour la ... Wikipédia
        Émission : Les Simpson
        Numéro de l'épisode : 1
        Première diffusion : 17 décembre 1989
        En savoir plus sur Noël mortel
        https://m.youtube.com › watch
        Mise en ligne par :
        kylou Printmanas
        Postée :
        10 août 2017
        Noël mortel (Saison 1, épisode 1) de Les Simpson en streaming illimité et gratuit, résumé de l'épisode : Ce soir , les Simpson assistent à la fête de Noël de l'école dans laquelle Bart et Lisa participent. De retour à la ...
        simpson-tv.over-blog.ch › article-episode...
        Simpson TV - Saison 1 Cliquez sur l'épisode de votre choix Episode 1 : Noël mortel Ce soir, les Simpson assistent à la fête de Noël de l'école dans laquelle Bart et Lisa participent. De retour à la maison, les enfants ...
        https://vimeo.com › ... › Videos
        Mise en ligne par :
        Simpson tekijä
        Postée :
        8 janv. 2013
        Mise en ligne par :
        the-simpsons
        Postée :
        14 juin 2015
        Mise en ligne par :
        howtobasic2
        Postée :
        30 oct. 2016
        Mise en ligne par :
        vulno
        Postée :
        10 déc. 2016
        Les Simpson - Saison 1 épisode 1 Streaming Regarder enligne. Tous les épisodes de Les Simpson - Saison 1 tv en streaming. Vous pouvez,dès maintenant,regarder votre anime favorite en ligne et en dir...
        Accéder à Épisodes · 1, 1, Noël mortel (Homer au nez rouge) Simpsons Roasting on an ... Simpson à des électrodes. Les Simpson s'électrocutent les uns les autres, causant des baisses de tension dans ...
        Nb. d'épisodes : 13
        Pays d'origine : États-Unis
        Chaîne d'origine : Fox
        Série : Les Simpson

        "simpsons episode 1" sur en.m.wikipedia.org
        Accéder à Episodes · Later on, Homer attempts to come clean to everyone, but Bart exclaims that they have a dog and everyone happily welcomes the newest member of the Simpson family. 2, 2, "Bart the Genius" ...
        Original release : December 17, 1989 – May 13, 1990
        Original network : Fox
        No. of episodes : 13
        ================================================ FILE: test/resources/pages-mobile/2018/08/new+construction+ct.html ================================================ new construction ct - Google Search
        Discover new construction homes or master planned communities in Connecticut . Check out floor plans, pictures and ...
        Uncover beautiful new homes for sale in Connecticut with Connecticut new construction listings on realtor.com®.
        New Home Construction in Connecticut. New Home Source has all the information you need to find your perfect new ...
        Nelson Construction Specializes in building elegant homes and communities that are high quality and energy efficient.
        New Development Services has worked closely with Builders and ... Pond Ridge Estates | Madison, CT $669,900.
        Find new real estate, new homes for sale, & new construction in Hartford County, CT. Tour newly built houses & make ...
        Find New Construction properties in Fairfield County CT. Get new listing alerts delivered to your inbox. Sign up for ...
        2017 Best Pre-Construction Marketing For A Community Essex Glen, Essex, CT; 2017 Best Promotional Video Grasso ...
        Build your new home in Stamford CT with Toll Brothers®. Choose from a great selection of new construction home ...
        Connecticut homes for sale by Toll Brothers®. 13 new luxury home communities in CT. View photos, floor plans, pricing ...
        ================================================ FILE: test/resources/pages-mobile/2018/11/01/plombier+nantes.html ================================================ plombier nantes - Recherche Google

        1. 2ADIR Électricien plombier serrurier

        2. Agrées Assurances, Artisan Qualifié, Dépannage d'urgence, tout travaux plomb. Artisan de quartier. Déplacement Rapide. Intervention en 30 mn.


        3. Diagnostic précis & Fourchette Tarifaire en ligne, en quelques clics et sans engagement ! Toute réparation en plomberie : débouchage...


        4. Obtenez Jusqu' à 4 devis Comparatifs en 3 clics et Trouvez le bon Artisan en 48H
        plombier nantes : carte
        map expand icon
        Ouvert actuellement
        Les mieux notés
        PLUS DE FILTRES
        Toussaint : Ces horaires sont susceptibles de varier.
        Autres adresses
        "plombier nantes" sur www.zeplombier.fr
        Ze Plombier intervient à Nantes. Pour vos travaux de plomberie, chauffage, gaz, entretien de chaudière. Devis gratuit.
        "plombier nantes" sur www.plombier-chauffagiste-vm.fr
        Plombier à Nantes, entreprise familiale de plomberie disponible 24/7. Plombier de père en fils sur Nantes, contacter Gilbert et Vincent ...
        Plombier à Nantes (44) : Devis et Informations , … Trouvez un artisan ou un expert près de chez vous dans l'annuaire PagesJaunes.
        Plombier chauffagiste à Nantes (44) : Devis et Informations, … Trouvez un artisan ou un expert près de chez vous dans l'annuaire ...
        "plombier nantes" sur www.buuyers.com
        Plombier : les meilleurs Plombiers élus par les internautes de Nantes (44000/44100/ 44200/44300) dans le département ...

        "plombier nantes" sur www.plombier-nantes-watereauwasser.com
        Nantes watereauwasser est née en 2009 de ma formation de plombier chauffagiste et d' une carriére des métiers du batiments et du ...
        Trouver un plombier à Nantes, Rézé, Saint- Herblain. Avis, recommandations plomberie. Meilleures prestations plombier chauffagiste.

        Situé au coeur de Nantes, je suis sur place très rapidement pour toute urgence : fuite, dépannage, remise en marche de vos installations ...

        "plombier nantes" sur www.dnpc-plomberie-chauffage.fr
        Mr José Jordan - votre plombier chauffagiste de quartier - St Sébastien sur Loire, Rezé et Nantes. Installation, maintenance et ...

        Voici la liste complète de nos meilleurs plombiers de Nantes et ses environs évalués par la communauté StarOfService de ...

        1. Dépannage, Installation, Détartrage, Réparation, Débouchage, Remplacement. Débouchage. Réparation. Devis gratuit. Détartrage. Remplacement. Installation. Dépannage.


        ================================================ FILE: test/resources/pages-mobile/simpsons+donuts.html ================================================ simpsons donuts - Recherche Google
        Résultat de recherche d'images pour "simpsons donuts"
        {"cl":21,"cr":21,"ct":18,"id":"5pf6apgzcM_1AM:","oh":1024,"ou":"https://s-media-cache-ak0.pinimg.com/originals/a9/a0/75/a9a075788700ecec89413dce43408d26.jpg","ow":1280,"pt":"17 Best ideas about Simpsons Donut on Pinterest | Homer simpson ...","rh":"pinterest.com","rid":"w9PWfLhS5NhIJM","ru":"https://www.pinterest.com/explore/simpsons-donut/","s":"17 Best ideas about Simpsons Donut on Pinterest | Homer simpson donuts, Simpsons art and Homer simpson","st":"Pinterest","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQ8fc3Gn2LfNxpnWV3hOToZgm_3-K_o05wq7Cy97RR9QgHG1WDiSOcUw9f_","tw":180}
        Résultat de recherche d'images pour "simpsons donuts"
        {"cb":3,"cr":3,"ct":3,"id":"T1mGMZ1G3UqIZM:","oh":700,"ou":"http://i2.cdscdn.com/pdt2/7/7/1/1/700x700/clo4035519893771/rw/coussin-donut-les-simpsonen-micro-velours-velbo.jpg","ow":700,"pt":"Donuts simpsons - Achat / Vente Donuts simpsons pas cher - Cdiscount","rh":"cdiscount.com","rid":"ULbgNRldUTz54M","ru":"http://www.cdiscount.com/telephonie/r-donuts+simpsons.html","s":"COUSSIN Coussin Donut Les Simpson","st":"Cdiscount.com","th":168,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQ9UZjp0TJxwxpbhKFSmlAbEdXpCJiIG4HIjkq0iDHdU34Bc9kNuo7NOTsMPQ","tw":168}
        Résultat de recherche d'images pour "simpsons donuts"
        {"id":"NXAKVKQBuIUioM:","oh":178,"ou":"http://vignette2.wikia.nocookie.net/les-simpson-springfield/images/e/e4/Douzaine_de_donuts.png/revision/latest?cb\u003d20150905210407\u0026path-prefix\u003dfr","ow":246,"pt":"Donut | Wiki Les Simpson : Springfield | Fandom powered by Wikia","rh":"fr.les-simpson-springfield.wikia.com","rid":"efXeqgQgXM3-sM","ru":"http://fr.les-simpson-springfield.wikia.com/wiki/Donut","s":"Douzaine de donuts ...","st":"Wiki Les Simpson : Springfield","th":141,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQWtF8cehRY-8JzD3Vbzqm0q4nLcNoCjQG7TICuFqJn55TWmqexf37WjzUK","tw":196}
        Résultat de recherche d'images pour "simpsons donuts"
        {"cb":6,"cl":6,"cr":12,"ct":6,"id":"yfwiLrFBCoJREM:","oh":541,"ou":"https://s-media-cache-ak0.pinimg.com/originals/f3/4e/78/f34e782b0ce5d2cbd3a3e1e8ecfde746.png","ow":550,"pt":"17 best ideas about Simpsons Donut on Pinterest | Homer simpson ...","rh":"uk.pinterest.com","rid":"13d6-FL7ZdmbrM","ru":"https://uk.pinterest.com/explore/simpsons-donut/","s":"17 best ideas about Simpsons Donut on Pinterest | Homer simpson donuts, Simpsons art and Homer simpson","st":"Pinterest","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQMo9nBu1hWJzh8hZrN5uknsCdWiNr3arc7o0ZMeUcrpdUWD4rLyuP9H3wqlw","tw":146}
        Résultat de recherche d'images pour "simpsons donuts"
        {"cb":21,"cl":9,"cr":9,"ct":21,"id":"2CXI4Cmj5X3dGM:","oh":2039,"ou":"https://i.ytimg.com/vi/Sc0kVdzks9E/maxresdefault.jpg","ow":3000,"pt":"The Simpsons Tapped Out: Donuts - YouTube","rh":"youtube.com","rid":"oXZN5y098HMw3M","ru":"https://www.youtube.com/watch?v\u003dSc0kVdzks9E","s":"The Simpsons Tapped Out: Donuts","st":"YouTube","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTXoGv7604Iisxc5POm6KxmsXv3Q2W7CBtLEWgzkN5k06chUr6ftvVeOoJpuA","tw":212}
        Résultat de recherche d'images pour "simpsons donuts"
        {"id":"w7pPh0tSmS9fQM:","oh":210,"ou":"http://vignette1.wikia.nocookie.net/les-simpson-springfield/images/4/43/Lot_de_60_donuts.png/revision/latest?cb\u003d20150905210406\u0026path-prefix\u003dfr","ow":152,"pt":"Donut | Wiki Les Simpson : Springfield | Fandom powered by Wikia","rh":"fr.les-simpson-springfield.wikia.com","rid":"efXeqgQgXM3-sM","ru":"http://fr.les-simpson-springfield.wikia.com/wiki/Donut","s":"La boutique","st":"Wiki Les Simpson : Springfield","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTV2GEy8x31xA-ueyNShB2LQySTV-IDu_wnjhzs_T5skI7VyhluM3t4Rqul","tw":104}
        Résultat de recherche d'images pour "simpsons donuts"
        {"id":"MykB36G8HPSOvM:","oh":450,"ou":"http://www.blogcdn.com/www.parentdish.co.uk/media/2013/03/homer-doughnut.jpg","ow":590,"pt":"Doh! Son Runs Up £980 Bill Buying Doughnuts On Simpsons IPad Game ...","rh":"huffingtonpost.co.uk","rid":"DFZBMzL58xSNiM","ru":"http://www.huffingtonpost.co.uk/2014/08/14/doh-son-runs-up-980-bill-buying-doughnuts-on-simpsons-ipad-game_n_7368848.html","s":"Son runs up £980 bill buying doughnuts on Simpsons iPad game","st":"Huffington Post UK","th":147,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTfJzEg2_B4WJDK6eFPd8MpsBIrv2tc2LkRvjjt970YnckGfT8_LHRM20Vf","tw":192}
        Résultat de recherche d'images pour "simpsons donuts"
        {"cb":6,"cl":18,"cr":18,"ct":6,"id":"PsgymH70iPP7VM:","oh":565,"ou":"http://superawesomevectors.com/wp-content/uploads/2014/03/free-vector-donut-drawing-800x565.jpg","ow":800,"pt":"Free vector donut drawing -download free vector","rh":"superawesomevectors.com","rid":"eaF3My1vToZseM","ru":"http://superawesomevectors.com/free-vector-donut-drawing/","s":"Free vector donut drawing","st":"SuperAwesomeVectors","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcTA6QwwF_PtZQR-GmD5o5SdlGwHOCkH6vNiynSRWLlopgNdo5OSLYdbso5_","tw":204}
        Résultat de recherche d'images pour "simpsons donuts"
        {"id":"OV0EHIRtJyKfDM:","oh":1080,"ou":"http://cdn.skim.gs/images/homer-simpson-doughnuts/what-homer-simpson-taught-us-about-doughnuts","ow":1920,"pt":"15 Things Homer Simpson taught us about doughnuts","rh":"sheknows.com","rid":"48UHaPs_HHMC4M","ru":"http://www.sheknows.com/food-and-recipes/articles/1085066/what-homer-simpson-taught-us-about-doughnuts","s":"All the things we\u0027ve learned about doughnuts from Homer Simpson","st":"SheKnows","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQzO2_AFLbHCc57GMjML3kpEMFFhLL2WA9hngxqZLMx7sAccXfRKTFs7pQv","tw":256}
        Résultat de recherche d'images pour "simpsons donuts"
        {"cb":6,"cl":6,"cr":3,"ct":9,"id":"ZZzcaNFrtOfdeM:","oh":382,"ou":"http://www.danger-sante.org/images/alimentation/donut-simpson.gif","ow":500,"pt":"Recette des Donuts des Simpson - Recette simple de Donuts Colorés","rh":"danger-sante.org","rid":"zR1d_Tio42JKKM","ru":"http://www.danger-sante.org/recettes-donut-simpson/","s":"donut simpsons","st":"Danger Santé","th":147,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSeQWQ2Mq3SRLOMIXya4YLGIzKjEFOQ7hAprN4R3PB35LPuatXswmQkv7H3tg","tw":192}
        Vidéos
        recettes-series.com › les-donuts-dhomer
        simpsons donuts sur recettes-series.com
        Aujourd'hui, je vais vous donner la recette des fameux donuts d'Homer, qui ont donné naissance à la phrase culte « MmmMmM des  ...
        https://www.theflavorbender.com › simps...
        simpsons donuts sur www.theflavorbender.com
        22 sept. 2014 - Love the Simpsons? You will love these Simpsons doughnuts! tastes amazing and you can have any glaze you want!
        Avis
        5,0(2)
        www.commentcamarche.net › ... › IPhone
        Entrez votre Nom d'utilisateur Les Simpson Springfield Les ressources ... Remarque: Vous pouvez générer max :9,999,999,999 Donut.
        cheat-astuce.com › simpson-springfield-c...
        9 juil. 2016 - Simpson Springfield cheat est une astuce qui va vous permettre de ne plus payer vos donuts. Commencez à tricher ...
        www.momes.net › ... › Gaufres et beignets
        Huuuuuuuuuummmmmmmmmmmm un Donut ! L'occasion rêvée de dévorer le goûter préféré de Homer Simpson !
        fr.les-simpson-springfield.wikia.com › wiki
        Le donut () est la monnaie premium du jeu Les Simpson: Springfield. Ils peuvent être obtenus en...
        simpsons.wikia.com › wiki › Lard_Lad_...
        In one comic, he had to find missing holes from donuts for a Lard Lad donut store. In level 7 of The Simpsons: Hit and Run, he is seen ...
        ================================================ FILE: test/resources/pages-mobile/simpsons+homer.html ================================================ simpsons homer - Recherche Google
        Homer Simpson
        Personnage fictif
        Resultat de recherche d'images pour "simpsons homer"
        {"bc":1,"id":"Ri_K1FJnYWm-9M:","oh":391,"ou":"https://upload.wikimedia.org/wikipedia/en/0/02/Homer_Simpson_2006.png","ow":239,"pt":"https://upload.wikimedia.org/wikipedia/en/0/02/Hom...","rh":"en.wikipedia.org","rid":"h3QYNWMXpCxZeM","ru":"https://en.wikipedia.org/wiki/Homer_Simpson","th":144,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTEfDGolOWI92nuvw3fPwCCywndXr-KjO_RTp-6NS0Nag2eh6C9gKoMfFI","tw":88}
        Resultat de recherche d'images pour "simpsons homer"
        {"cl":12,"cr":15,"id":"hwK-W0oR1M6mhM:","oh":626,"ou":"http://vignette1.wikia.nocookie.net/simpsons/images/6/65/Homersimpson2.png/revision/latest?cb\u003d20140110020205","ow":493,"pt":"Homer Simpson | Simpsons Wiki | Fandom powered by Wikia","rh":"simpsons.wikia.com","rid":"MrZgP0MdUAZAkM","ru":"http://simpsons.wikia.com/wiki/Homer_Simpson","th":144,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcScCXiOUq6OgjAcItuPyatbxRQVlgyQJ7SW-8eIrh5v9jEUtv7a35LpWFNU","tw":113}
        Resultat de recherche d'images pour "simpsons homer"
        {"id":"lp8ZD0ENOMT3WM:","oh":1000,"ou":"http://lessimpsons.e-monsite.com/medias/images/homer-simpson-vector-by-bark2008.png","ow":712,"pt":"Les Simpsons , caricature de la societe americiane","rh":"lessimpsons.e-monsite.com","rid":"8G2PpDHM8fO-9M","ru":"http://lessimpsons.e-monsite.com/pages/page.html","th":144,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcSqy0gavC6QwAQNZrwhPPtC_eZ1n058nMq0E2CAFR0p6NANXjIhW8H7kuM","tw":103}
        Resultat de recherche d'images pour "simpsons homer"
        {"id":"OV0EHIRtJyKfDM:","oh":1080,"ou":"http://cdn.skim.gs/images/homer-simpson-doughnuts/what-homer-simpson-taught-us-about-doughnuts","ow":1920,"pt":"15 Things Homer Simpson taught us about doughnuts","rh":"sheknows.com","rid":"48UHaPs_HHMC4M","ru":"http://www.sheknows.com/food-and-recipes/articles/1085066/what-homer-simpson-taught-us-about-doughnuts","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcQzO2_AFLbHCc57GMjML3kpEMFFhLL2WA9hngxqZLMx7sAccXfRKTFs7pQv","tw":256}
        Resultat de recherche d'images pour "simpsons homer"
        {"cb":3,"cl":12,"cr":15,"ct":9,"id":"HsH2J2fqzFdCWM:","oh":1024,"ou":"https://s-media-cache-ak0.pinimg.com/originals/45/eb/ee/45ebee653e61988417749c3d40baff64.jpg","ow":780,"pt":"1000+ images about Homer J. Simpson on Pinterest | Homer Simpson ...","rh":"pinterest.com","rid":"LGBdJDWWteLwMM","ru":"https://www.pinterest.com/ryanyudhistira/homer-j-simpson/","th":144,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTk0za1v9IoSjH7864CtfmUbQ895gfcdQdGmDf_OfCQefyLw8kzECqEgpc","tw":110}
        Resultat de recherche d'images pour "simpsons homer"
        {"cl":9,"cr":6,"ct":3,"id":"9z_oKkmzYjQ1kM:","oh":1024,"ou":"https://s-media-cache-ak0.pinimg.com/originals/0d/30/b4/0d30b41543d97867ca502a8ac3b5afe0.gif","ow":1280,"pt":"1000+ images about simpsns on Pinterest | Homer Simpson, The ...","rh":"pinterest.com","rid":"ycNvxWo63t0T4M","ru":"https://www.pinterest.com/kurttiomaarit/simpsns/","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcS_hJrQS2PGuPxixzz1Zvz07OJO5ihwf-Z2ppOOhfdLIQ97TXkVEtx1yYYngQ","tw":180}
        Resultat de recherche d'images pour "simpsons homer"
        {"cb":3,"cl":21,"cr":18,"ct":12,"id":"Pu3zsHXe4kZbxM:","oh":500,"ou":"http://s3.e-monsite.com/2011/01/15/10/Homer-4.jpg","ow":399,"pt":"II - Un modele familial americain ?","rh":"tpe-simpson.e-monsite.com","rid":"Vz-BCL6BiwrivM","ru":"http://tpe-simpson.e-monsite.com/pages/ii-un-modele-familial-americain.html","th":144,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQLElhXSbUL9zbEodI5Mqdzrzubj5hHWJnPcobaRXA-grE6-l0mjd9Sn5o","tw":115}
        Resultat de recherche d'images pour "simpsons homer"
        {"cb":3,"cr":9,"id":"gDblUV53kOeq9M:","oh":524,"ou":"http://vignette3.wikia.nocookie.net/simpsons/images/b/b0/HomerSimpson5.gif/revision/latest?cb\u003d20141025153213","ow":500,"pt":"Homer Simpson | Simpsons Wiki | Fandom powered by Wikia","rh":"simpsons.wikia.com","rid":"MrZgP0MdUAZAkM","ru":"http://simpsons.wikia.com/wiki/Homer_Simpson","th":172,"tu":"https://encrypted-tbn1.gstatic.com/images?q\u003dtbn:ANd9GcSpdGF2m0FbSlApY8how8lLRlytKX6NOQ3uk-vH1iOmzJn8MHrpu-Cwi6ID","tw":164}
        Resultat de recherche d'images pour "simpsons homer"
        {"id":"yfWMtjt-GFJnbM:","oh":1218,"ou":"http://aaatee.com/wp-content/uploads/ford-homer-simpson.jpg","ow":970,"pt":"D\u0026#39;oh\u0026quot; - Funny Simpsons T Shirt - Homer Simpson\u0026#39;s Famous Saying","rh":"aaatee.com","rid":"dsM8DUhXMygwsM","ru":"http://aaatee.com/doh-funny-simpsons-t-shirt-homer-simpsons-famous-saying/","th":144,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSN8hT6xdWQOxrVO9I4CMODLXepXIgBKdiTQMeSP2eBNs2n685rft1HoEE","tw":115}
        Resultat de recherche d'images pour "simpsons homer"
        {"id":"jWdDg29jxKtkLM:","oh":761,"ou":"http://img.thesun.co.uk/aidemitlum/archive/01451/SNF11HOM1---532g_1451755a.jpg","ow":532,"pt":"Best character tournament Semi Final: Homer Simpson vs. Ned ...","rh":"gamefaqs.com","rid":"AtN7lemtWWXIjM","ru":"http://www.gamefaqs.com/boards/244-the-simpsons/71857104","th":144,"tu":"https://encrypted-tbn3.gstatic.com/images?q\u003dtbn:ANd9GcQfTTTyJ7Mb7BIe68VbcG-n0HpFCKf5aPpj-XON4097VxZqMVqFuxKyR9FA","tw":101}
        Resultat de recherche d'images pour "simpsons homer"
        {"cl":21,"cr":18,"id":"wamqZvnm4K1zhM:","oh":640,"ou":"http://valentinerogen.com/wordpress/wp-content/gallery/les-simpsons-personnages/homer.jpg","ow":520,"pt":"Les Simpsons : Les Simpsons","rh":"valentinerogen.com","rid":"KcLgFWz5wK9kgM","ru":"http://valentinerogen.com/wordpress/ngg_tag/homer-simpsons-simpson-donut/","th":144,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcTiLz__hfespQY09G09gH-QhzM_XV7J287Rg2v5Cm01QUo7qiArDkzajtkn","tw":117}
        Homer Jay Simpson est le principal personnage fictif de la serie televisee d'animation Les Simpson et le pere de la famille du meme nom. Wikipedia
        Interprete par : Dan Castellaneta
        Createur : Matt Groening
        https://fr.m.wikipedia.org › wiki › Home...
        simpsons homer sur fr.m.wikipedia.org
        Homer Jay Simpson est le principal personnage fictif de la serie televisee d'animation Les Simpson et le pere de la famille du meme nom. Il est double par Dan Castellaneta dans la version originale, ...
        https://en.m.wikipedia.org › wiki › Home...
        simpsons homer sur en.m.wikipedia.org
        Homer Jay Simpson is a fictional character and the main protagonist of the American animated television series The Simpsons as the patriarch of the eponymous family. He is voiced by Dan Castellaneta and ...
        fr.simpsons.wikia.com › wiki › Homer_S...
        simpsons homer sur fr.simpsons.wikia.com
        Homer Jay Simpson est le pere de la famille Simpson. Homer est quelqu'un de plutôt gentil et...
        simpsons.wikia.com › wiki › Homer_Sim...
        simpsons homer sur simpsons.wikia.com
        Homer Jay Simpson, Sr., also known as Homer Samson, Homie, Home-boy, Colonel Homer, Dancin...
        Videos
        simpsons homer sur tvmag.lefigaro.fr
        17 sept. 2015 - Il y a trois mois, le monde entier (ou presque) etait sous le choc d'apprendre qu' Homer et Marge allaient divorcer au cours du premier episode de la saison 27 des Simpson. En effet, Al ...
        simpsons homer sur www.simpsonspark.com
        Homer Simpson est un pere de famille de 39 ans qui travaille au poste d'inspecteur de la securite dans une centrale nucleaire. Faineant et gras, Homer passe son temps à s'empiffrer de chips en buvant...
        simpsons homer sur www.europe1.fr
        11 juin 2015 - D'OH ! - Un membre de la production des Simpson vient d'annoncer la prochaine separation de Marge et Homer. Mais savez-vous que ce couple mythique s'est dejà quitte plus d'une  ...
        29 sept. 2015 - Si on nous avait dit un jour qu'il y aurait de l'eau dans le gaz entre Marge et Homer apres 27 saisons des Simpson, on ne l'aurait pas cru. Et pourtant, depuis plusieurs mois, la rumeur ...
        ================================================ FILE: test/resources/pages-mobile/simpsons+world.html ================================================ simpsons world - Recherche Google
        Conseil : Recherchez des résultats uniquement en français. Vous pouvez indiquer votre langue de recherche sur la page Préférences.
        Résultat de recherche d'images pour "simpsons world"
        {"cl":6,"ct":6,"id":"TeWsGUDj-OtY9M:","oh":648,"ou":"http://t1.gstatic.com/images?q\u003dtbn:ANd9GcQv0xFCGBpWuRggvZY52Parp3GhjDHaKy4Hg_S9XQTpGPxI1BUH","ow":837,"pt":"t1.gstatic.com/images?q\u003dtbn:ANd9GcQv0xFCGBpWuRggvZ...","rh":"books.google.com","rid":"JmyUcq2bMdMvVM","ru":"http://books.google.com/books/about/Simpsons_World_The_Ultimate_Episode_Guid.html?id\u003dgYT1QwAACAAJ\u0026source\u003dkp_cover","s":"","th":116,"tu":"https://encrypted-tbn0.gstatic.com/images?q\u003dtbn:ANd9GcSnl6gVCDfIf1VF72USGh7HXLJaEqvauOgzOPLjH-h9LY36YKYXmMjwpC0","tw":150}
        Simpsons World The Ultimate Episode Guide: Seasons 1–20
        Livre de Matt Groening
        Date de publication originale : 26 octobre 2010
        Auteur : Matt Groening
        Buy Simpsons World: The Ultimate Episode Guide, Seasons 1-20 on Amazon. com ✓ FREE SHIPPING on qualified ...
        AMP - 21 juil. 2014 - A new portal called Simpsons World will launch in October that will allow anyone to browse episodes ...
        www.jeuxjeuxjeux.fr › jeu › les+simpsons
        Super Simpsons World: Ici tu peux jouer au jeu Super Simpsons World. - Super Simpsons World est l'un de nos Jeux de ...
        AMP - 20 oct. 2014 - We've previewed FXX's 'The Simpsons World' App and here's everything you need to know.
        22 oct. 2014 - On Tuesday afternoon, after logging in to Simpsons World, the newly launched website that contains ...
        21 oct. 2014 - Simpsons World was designed for Fox by New York-based digital agency Huge, which is best known ...
        ================================================ FILE: test/resources/pages-raw/simpsons.html ================================================ simpsons - Recherche Google

         
        Environ 70 900 000 résultats
          Résultat de recherche d'images pour "simpsons"
          Les Simpson
          Série télévisée
          Les Simpson est une série télévisée d'animation américaine créée par Matt Groening et diffusée depuis le 17 décembre 1989 sur la chaîne américaine Fox. Elle met en scène les Simpson, stéréotype d'une famille de classe moyenne. Wikipédia
          Premier épisode : 17 décembre 1989
          Titre original : The Simpsons Theme
          Créateurs du programme : Matt Groening, Sam Simon, James L. Brooks
          Personnages
          Homer Simpson (Dan Castellaneta)
          Homer Simpson
          Dan Castellaneta
          Bart Simpson (Nancy Cartwright)
          Bart Simpson
          Nancy Cartwright
          Marge Simpson (Julie Kavner)
          Marge Simpson
          Julie Kavner

          Lisa Simpson (Yeardley Smith)
          Lisa Simpson
          Yeardley Smith
          Ned Flanders (Harry Shearer)
          Ned Flanders
          Harry Shearer

          Recherches associées
          Les Griffin (Depuis 1999)
          Les Griffin
          Depuis 1999
          Futurama (1999 – 2013)
          Futurama
          1999 – 2013
          South Park (Depuis 1997)
          South Park
          Depuis 1997

          American Dad! (Depuis 2005)
          American Dad!
          Depuis 2005
          Bob's Burgers (Depuis 2011)
          Bob's Burgers
          Depuis 2011
          The Cleveland Show (2009 – 2013)
          The Cleveland Show
          2009 – 2013

        ================================================ FILE: test/resources/simple-dom.html ================================================
        foo bar - foo span foo bar - bar span
        baz - foo span
        ================================================ FILE: test/suites/AdwordsResultItemTest.php ================================================ assertTrue($item->is('top')); $this->assertTrue($item->is('foo')); $this->assertTrue($item->is('foo', 'top')); $this->assertTrue($item->is('foo', 'fake')); $this->assertFalse($item->is('fake')); } public function testGetTypes() { $item = new AdwordsResultItem('top', new BaseResult('foo', [])); $this->assertEquals(['top', 'foo'], $item->getTypes(), '', 0.0, 10, true); } } ================================================ FILE: test/suites/AdwordsSectionResultSetTest.php ================================================ addItem($result); $testResult = $resultSet->getItems()[0]; $this->assertTrue($testResult instanceof AdwordsResultItem); $this->assertTrue($testResult->is('top')); } } ================================================ FILE: test/suites/GoogleClientTest.php ================================================ getMock(HttpClientInterface::class); $responseFromMock = new SearchEngineResponse( [], 200, file_get_contents('test/resources/pages-evaluated/simpsons+movie+trailer.html'), false, GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), null ); $httpClientMock->method('sendRequest')->willReturn($responseFromMock); /* @var $httpClientMock HttpClientInterface */ $googleClient = new GoogleClient(new Browser($httpClientMock)); $url = GoogleUrl::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'); $dom = $googleClient->query($url); $this->assertInstanceOf(GoogleSerp::class, $dom); $this->assertEquals('https://www.google.fr/search?q=simpsons+movie+trailer', (string)$dom->getUrl()); } public function testInvalidHttpResponse() { $httpClientMock = $this->getMock(HttpClientInterface::class); $responseFromMock = new SearchEngineResponse( [], 400, file_get_contents('test/resources/pages-evaluated/simpsons+movie+trailer.html'), false, GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), null ); $httpClientMock->method('sendRequest')->willReturn($responseFromMock); /* @var $httpClientMock HttpClientInterface */ $googleClient = new GoogleClient(new Browser($httpClientMock)); $url = GoogleUrl::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'); try { $googleClient->query($url); $this->fail('Excetpion should be thrown'); } catch (InvalidResponseException $e) { $this->assertEquals(400, $e->getHttpStatusCode()); } } public function testCaptchaDom() { $httpClientMock = $this->getMock(HttpClientInterface::class); $responseFromMock = new SearchEngineResponse( [], 503, file_get_contents('test/resources/pages-evaluated/captcha.html'), false, GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'), null ); $httpClientMock->method('sendRequest')->willReturn($responseFromMock); /* @var $httpClientMock HttpClientInterface */ $googleClient = new GoogleClient(new Browser($httpClientMock)); $url = GoogleUrl::fromString('https://www.google.fr/search?q=simpsons+movie+trailer'); try { $googleClient->query($url); $this->fail('Exception not thrown'); } catch (GoogleCaptchaException $e) { $this->assertInstanceOf(GoogleCaptcha::class, $e->getCaptcha()); } } } ================================================ FILE: test/suites/GoogleSerpTestCase.php ================================================ assertCount( count($types), $result->getTypes(), 'Type count does not match. ' . 'Expects that ' . 'item[' . implode(', ', $result->getTypes()) . '] ' . 'has types:[' . implode(', ', $types) . '] ' . 'Using file ' . $file . ' result #' . $index ); foreach ($types as $type) { $typeValue = constant($resultTypesClass . '::' . $type); $this->assertTrue( $result->is($typeValue), 'Expects that ' . 'item[' . implode(', ', $result->getTypes()) . '] has the type: ' . $typeValue . '. Using file ' . $file . ' result #' . $index ); } } public function assertResultDoesNotHaveTypes(array $types, ResultDataInterface $result) { foreach ($types as $type) { $typeValue = constant(NaturalResultType::class . '::' . $type); $this->assertFalse($result->is($typeValue), 'Expects that item[' . implode(', ', $result->getTypes()) . '] does NOT have the type: ' . $typeValue); } } public function assertResultHasData(array $dataArray, $result, $currentPath = null) { if (null == $currentPath) { $currentPath = '/'; } foreach ($dataArray as $k => $data) { $currentPathForItem = $currentPath . $k . '/'; if ($k === 'types()') { if (is_object($result) && $result instanceof ResultDataInterface) { $this->assertResultHasTypes($data, $result, $currentPathForItem, $k); } else { $this->fail('Asserting that data is instance of ResultDataInterface (evaluating types()). Path: "' . $currentPathForItem . '"'); } } else { if (is_array($data)) { if (is_object($result)) { if ($result instanceof ResultSetInterface) { $this->assertResultHasData($data, $result[$k], $currentPathForItem); } else { $this->assertResultHasData($data, $result->$k, $currentPathForItem); } } elseif (is_array($result)) { $this->assertResultHasData($data, $result[$k], $currentPathForItem); } else { $this->fail('Asserting that data has key "' . $k . '"". Path: "' . $currentPathForItem . '"'); } } else { if (!is_object($result)) { $this->fail('Data is not an object. Evaluating key "' . $k . '"". Path: "' . $currentPathForItem . '"'); } $this->assertEquals($data, $result->$k, 'Checking key "' . $k . '" for equality. Path: "' . $currentPathForItem . '"'); } } } } public function assertResultDataCount(array $dataArray, $result) { foreach ($dataArray as $k => $data) { if (is_array($data)) { if (is_object($result)) { $this->assertResultHasData($data, $result->$k); } elseif (is_array($result)) { $this->assertResultHasData($data, $result[$k]); } else { $this->fail('Asserting that data has key ' . $k); } } else { $this->assertCount($data, $result->$k); } } } public function assertResultHasDataMedia(array $dataArray, $result) { foreach ($dataArray as $k => $data) { if (is_array($data)) { if (is_object($result)) { $this->assertResultHasDataMedia($data, $result->$k); } elseif (is_array($result)) { $this->assertResultHasDataMedia($data, $result[$k]); } else { $this->fail('Asserting that data has key ' . $k); } } else { $media = $result->$k; $this->assertInstanceOf(MediaInterface::class, $media); $expected = new File($data); $this->assertEquals($expected->asString(), $media->asString()); } } } } ================================================ FILE: test/suites/GoogleUrlTest.php ================================================ assertEquals('www.google.com', $googleUrl->getHost()); $this->assertEquals('/search', $googleUrl->getPath()); } public function testGetArchive() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertInstanceOf(GoogleUrlArchive::class, $googleUrl->getArchive()); $this->assertEquals('https://google.com/search?q=simpsons', $googleUrl->getArchive()->buildUrl()); } public function testLanguageRestriction() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertEquals(null, $googleUrl->getLanguageRestriction()); $googleUrl->setLanguageRestriction('de'); $this->assertEquals('lang_de', $googleUrl->getLanguageRestriction()); $this->assertEquals('lang_de', $googleUrl->getParamValue('lr')); $googleUrl->setLanguageRestriction('lang_fr'); $this->assertEquals('lang_fr', $googleUrl->getLanguageRestriction()); $this->assertEquals('lang_fr', $googleUrl->getParamValue('lr')); } public function testPage() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertEquals(1, $googleUrl->getPage()); $googleUrl->setPage(1); $this->assertEquals(1, $googleUrl->getPage()); $this->assertFalse($googleUrl->hasParam('start')); $googleUrl->setPage(2); $this->assertEquals(2, $googleUrl->getPage()); $this->assertEquals(10, $googleUrl->getParamValue('start')); $googleUrl->setPage(0); $this->assertEquals(1, $googleUrl->getPage()); $this->assertFalse($googleUrl->hasParam('start')); } public function testResultsPerPage() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertEquals(10, $googleUrl->getResultsPerPage()); $googleUrl->setPage(2); $googleUrl->setResultsPerPage(20); $this->assertEquals(20, $googleUrl->getResultsPerPage()); $this->assertEquals(20, $googleUrl->getParamValue('num')); $this->assertEquals(2, $googleUrl->getPage()); // special cases: more than 100 or less than 1 $googleUrl->setResultsPerPage(200); $this->assertEquals(100, $googleUrl->getResultsPerPage()); $googleUrl->setResultsPerPage(0); $this->assertEquals(1, $googleUrl->getResultsPerPage()); //reset to default $googleUrl->setResultsPerPage(10); $this->assertFalse($googleUrl->hasParam('num')); } public function testSearchTerm() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertEquals('simpsons', $googleUrl->getSearchTerm()); $googleUrl->setSearchTerm('bart simpsons'); $this->assertEquals('bart simpsons', $googleUrl->getSearchTerm()); $this->assertEquals('bart+simpsons', $googleUrl->getParamValue('q')); } public function testResultType() { $googleUrl = GoogleUrl::fromString('https://google.com/search?q=simpsons'); $this->assertEquals(GoogleUrl::RESULT_TYPE_ALL, $googleUrl->getResultType()); $googleUrl->setResultType(GoogleUrl::RESULT_TYPE_IMAGES); $this->assertEquals(GoogleUrl::RESULT_TYPE_IMAGES, $googleUrl->getResultType()); $this->assertEquals(GoogleUrl::RESULT_TYPE_IMAGES, $googleUrl->getParamValue('tbm')); $googleUrl->setResultType(GoogleUrl::RESULT_TYPE_ALL); $this->assertFalse($googleUrl->hasParam('tbm')); } } ================================================ FILE: test/suites/Page/GoogleCaptchaTest.php ================================================ assertTrue($errorDom->isCaptcha()); $captchaDom = new GoogleCaptcha($errorDom); $this->assertEquals('188.94.206.49', $captchaDom->getDetectedIp()); $this->assertInstanceOf(GoogleError::class, $captchaDom->getErrorPage()); } } ================================================ FILE: test/suites/Page/GoogleDomTest.php ================================================ getDom()->getXpath(); $this->assertInstanceOf(\DOMXPath::class, $xpath); } public function testGetDom() { $googleDom = $this->getDom(); $this->assertInstanceOf(\DOMDocument::class, $googleDom->getDom()); } public function testXPathQuery() { $dom = $this->getDom(); $fooSpan = $dom->xpathQuery('descendant::div[@class="baz"]/span[@class="foo"]'); $this->assertEquals(1, $fooSpan->length); $this->assertEquals('baz - foo span', $fooSpan->item(0)->C14N()); $fooSpan = $dom->xpathQuery('descendant::div[@class="baz"]'); $fooSpan = $dom->xpathQuery('span[@class="foo"]', $fooSpan->item(0)); $this->assertEquals(1, $fooSpan->length); $this->assertEquals('baz - foo span', $fooSpan->item(0)->C14N()); $fooSpan = $dom->xpathQuery('span[@class="foo"]', $fooSpan->item(0)); $this->assertEquals(0, $fooSpan->length); } public function testCssQuery() { $dom = $this->getDom(); $fooSpan = $dom->cssQuery('.foo'); $this->assertEquals(3, $fooSpan->length); $fooSpan = $dom->cssQuery('.foo', $dom->cssQuery('.baz')->item(0)); $this->assertEquals(1, $fooSpan->length); $this->assertEquals('baz - foo span', $fooSpan->item(0)->C14N()); } public function testGetUrl() { $googleDom = $this->getDom(); $this->assertSame('https://www.google.fr/search?q=simpsons&hl=en_US', $googleDom->getUrl()->buildUrl()); } public function testGetJsonNodeProperty() { $url = GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons&hl=en_US'); $domString = '
        "{"foo":"bar", "bar":"baz"}"
        "{"foo":"qux", "baz":"boo"}"
        "":"boo"}"
        '; $dom = new GoogleDom($domString, $url); $nodeFoo1 = $dom->cssQuery('#foo1')->item(0); $nodeFoo2 = $dom->cssQuery('#foo2')->item(0); $nodeFoo3 = $dom->cssQuery('#foo3')->item(0); $this->assertEquals('bar', $dom->getJsonNodeProperty('foo', $nodeFoo1)); $this->assertEquals('qux', $dom->getJsonNodeProperty('foo', $nodeFoo2)); $this->assertEquals('baz', $dom->getJsonNodeProperty('bar', $nodeFoo1)); $this->assertEquals(null, $dom->getJsonNodeProperty('bar', $nodeFoo2)); $this->assertEquals(null, $dom->getJsonNodeProperty('baz', $nodeFoo1)); $this->assertEquals('boo', $dom->getJsonNodeProperty('baz', $nodeFoo2)); $this->assertEquals(null, $dom->getJsonNodeProperty('baz', $nodeFoo3)); } } ================================================ FILE: test/suites/Page/GoogleSerpTest.php ================================================ getDomJavascript()->getNumberOfResults(); $this->assertEquals(65200000, $count); $count = $this->getDomNoJavascript()->getNumberOfResults(); $this->assertEquals(70900000, $count); } public function testGetLocation() { $this->assertEquals('Nantes', $this->getDomJavascript()->getLocation()); } public function testGetNaturalResults() { $dom = $this->getDomJavascript(); $results = $dom->getNaturalResults(); $this->assertInstanceOf(IndexedResultSet::class, $results); $this->assertCount(10, $results); $dom = $this->getDomNoJavascript(); $this->setExpectedException(InvalidDOMException::class); $results = $dom->getNaturalResults(); } public function testGetAdwordsResults() { $dom = $this->getDomJavascript(); $results = $dom->getAdwordsResults(); $this->assertInstanceOf(CompositeResultSet::class, $results); $dom = $this->getDomNoJavascript(); $this->setExpectedException(InvalidDOMException::class); $results = $dom->getAdwordsResults(); } public function testJavascriptEvaluated() { $this->assertTrue($this->getDomJavascript()->javascriptIsEvaluated()); $this->assertFalse($this->getDomNoJavascript()->javascriptIsEvaluated()); } public function testRelatedSearches() { $gUrl = GoogleUrlArchive::fromString('https://www.google.fr/search?q=simpsons+related'); $dom = new GoogleSerp(file_get_contents('test/resources/pages-evaluated/simpsons(related).html'), $gUrl); $rs = $dom->getRelatedSearches(); $this->assertCount(8, $rs); $this->assertEquals((array)$rs[0], [ 'title' => 'simpsons watch online', 'url' => 'https://www.google.fr/search?client=ubuntu&hs=mPo&biw=1920&bih=992&q=simpsons+watch+online&revid=1278607378&sa=X&ved=0ahUKEwisvuHvz4vNAhVDI8AKHXh5AKAQ1QIIfygA' ]); $this->assertEquals((array)$rs[1], [ 'title' => 'simpsons tv', 'url' => 'https://www.google.fr/search?client=ubuntu&hs=mPo&biw=1920&bih=992&q=simpsons+tv&revid=1278607378&sa=X&ved=0ahUKEwisvuHvz4vNAhVDI8AKHXh5AKAQ1QIIgAEoAQ' ]); $this->assertEquals((array)$rs[4], [ 'title' => 'the simpsons episode 1', 'url' => 'https://www.google.fr/search?client=ubuntu&hs=mPo&biw=1920&bih=992&q=the+simpsons+episode+1&revid=1278607378&sa=X&ved=0ahUKEwisvuHvz4vNAhVDI8AKHXh5AKAQ1QIIgwEoBA' ]); $this->assertEquals((array)$rs[7], [ 'title' => 'the simpsons barthood', 'url' => 'https://www.google.fr/search?client=ubuntu&hs=mPo&biw=1920&bih=992&q=the+simpsons+barthood&revid=1278607378&sa=X&ved=0ahUKEwisvuHvz4vNAhVDI8AKHXh5AKAQ1QIIhgEoBw' ]); } } ================================================ FILE: test/suites/Parser/Evaluated/AdwordsParserTest.php ================================================ parse($dom); $this->assertInstanceOf(CompositeResultSet::class, $results); $this->assertCount(5, $results); $this->assertCount(2, $results->getResultsByType(AdwordsResultType::SECTION_BOTTOM)); $this->assertCount(3, $results->getResultsByType(AdwordsResultType::SECTION_TOP)); // TESTING TOP $topItemp = $results->getItems()[1]; $this->assertEquals( 'Art Posters On Sale Today - allposters.com.au‎', $topItemp->getDataValue('title') ); $this->assertEquals( 'http://www.allposters.com.au/?AID=1195529028&KWID=2003592128', $topItemp->getDataValue('url') ); $this->assertEquals( 'www.allposters.com.au/OfficialSite', $topItemp->getDataValue('visurl') ); $this->assertEquals( 'Save 30% Or More When You Buy Now. Plus Easy Returns & Fast Shipping!', $topItemp->getDataValue('description') ); // TESTING BOTTOM $bottomItem = $results->getItems()[3]; $this->assertEquals( 'Votre Simpsons Poster‎', $bottomItem->getDataValue('title') ); $this->assertEquals( 'http://www.allposters.fr/-st/Les-Simpsons-Affiches_c7902_.htm?AID=1410937278&KWID=705639909', $bottomItem->getDataValue('url') ); $this->assertEquals( 'www.allposters.fr/', $bottomItem->getDataValue('visurl') ); $this->assertEquals( 'Vos Posters de Séries TV à Prix Bas 500.000 Posters, Cadres Disponibles', $bottomItem->getDataValue('description') ); // Testing Shopping $shoppingItem = $results->getItems()[0]; $this->assertTrue($shoppingItem->is(AdwordsResultType::SHOPPING_GROUP)); $this->assertCount(5, $shoppingItem->getDataValue('products')); $this->assertEquals('Affiche Simpsons-Cast', $shoppingItem->getDataValue('products')[0]->title); $this->assertStringStartsWith('data:image/jpeg;base64,/9j/4A', $shoppingItem->getDataValue('products')[0]->image); $this->assertStringEndsWith('K1lrSpf/2Q==', $shoppingItem->getDataValue('products')[0]->image); $this->assertEquals('https://www.google.com.au/aclk?sa=l&ai=CY0A_jlP5Vuu_FpDmzAal85fABeihh8sF4LeUmKwBl9bV_YcDCAQQASgFYPsBoAH7_Zf-A8gBB6oEJ0_QX-g3vvmVLal5IsrVSmuL8KuTKi8rF8WopQL8xEMXFSCmtG7iHMAFBaAGJoAH2KX4H5AHA6gHpr4b2AcB4BLxv6bTjuzD6I4B&sig=AOD64_1iHykYRDusLJqdU94-aFjnHM1TuA&ctype=5&clui=11&q&ved=0ahUKEwi-g9rZ3uPLAhUG1RoKHWKYArQQww8IHw&adurl=http%3A%2F%2Fwww.allposters.fr%2F-sp%2FSimpsons-Cast-Names_i8574538_.htm%3FAID%3D815014090%26ProductTarget%3D105221810967', $shoppingItem->getDataValue('products')[0]->url); $this->assertEquals('AllPosters.fr', $shoppingItem->getDataValue('products')[0]->target); $this->assertEquals('EUR9.99', $shoppingItem->getDataValue('products')[0]->price); } } ================================================ FILE: test/suites/Parser/Evaluated/NaturalParserTest.php ================================================ getExtension() === 'yml') { $data[] = [$file->getRealPath()]; } } return $data; } /** * @dataProvider serpProvider */ public function testSerps($file) { $data = Yaml::parse(file_get_contents($file)); $gUrl = GoogleUrlArchive::fromString($data['url']); $dom = new GoogleSerp(file_get_contents($data['file']), $gUrl); $result = $dom->getNaturalResults(); if (isset($data['test-methods'])) { foreach ($data['test-methods'] as $method => $methodData) { $this->assertEquals($methodData, call_user_func([$dom, $method]), "Method $method failed."); } } if (isset($data['results'])) { $this->assertCount(count($data['results']), $result->getItems(), 'Failed asserting that number of results matched. Using file ' . $file); foreach ($data['results'] as $k => $expectedResult) { $item = $result->getItems()[$k]; $this->assertResultHasTypes($expectedResult['types'], $item, $file, $k); if (isset($expectedResult['not-types'])) { $this->assertResultDoesNotHaveTypes($expectedResult['not-types'], $item); } if (isset($expectedResult['data'])) { $this->assertResultHasData($expectedResult['data'], $item, $file . ' => ' . $k . '/'); } if (isset($expectedResult['data-count'])) { $this->assertResultDataCount($expectedResult['data-count'], $item); } if (isset($expectedResult['data-media'])) { $this->assertResultHasDataMedia($expectedResult['data-media'], $item); } } } if (isset($data['related-searches'])) { $relatedSearches = $dom->getRelatedSearches(); $this->assertCount(count($data['related-searches']), $relatedSearches, 'Failed related search assertion with file ' . $file); foreach ($data['related-searches'] as $k => $relSearchItem) { if (isset($relSearchItem['title'])) { $this->assertEquals($relSearchItem['title'], $relatedSearches[$k]->title, 'Failed related search title assertion with file ' . $file . ' for item #' . $k); } if (isset($relSearchItem['url'])) { $this->assertEquals($relSearchItem['url'], $relatedSearches[$k]->url, 'Failed related search url assertion with file ' . $file . ' for item #' . $k); } } } if (isset($data['ads'])) { $allAdsResults = $dom->getAdwordsResults(); if (isset($data['ads']['section'])) { foreach ($data['ads']['section'] as $section => $sectionData) { if (isset($sectionData['results'])) { $sectionConstant = 'SECTION_' . strtoupper($section); $adResults = $allAdsResults->getResultsByType('adws_section_' . $section); $this->assertCount( count($sectionData['results']), $adResults, 'Failed asserting that number of adwords results matched. Using file ' . $file . ' | ' . $section ); foreach ($sectionData['results'] as $k => $expectedResult) { $item = $adResults[$k]; $this->assertResultHasTypes( array_merge($expectedResult['types'], [$sectionConstant]), $item, $file, $k, AdwordsResultType::class ); if (isset($expectedResult['data'])) { $this->assertResultHasData($expectedResult['data'], $item, $file . ' => ' . $k . '/'); } } } } } } } public function testResultWithMap() { $gUrl = GoogleUrlArchive::fromString('https://www.google.fr/search?q=shop+near+paris'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/shop-near-paris.html'), $gUrl); $naturalParser = new NaturalParser(); $result = $naturalParser->parse($dom); $types = []; foreach ($result->getItems() as $item) { $types[] = $item->getTypes()[0]; } $this->assertInstanceOf(IndexedResultSet::class, $result); $this->assertCount(11, $result); $this->assertEquals([ NaturalResultType::MAP, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::IMAGE_GROUP, NaturalResultType::CLASSICAL ], $types); // Test MAP item $map = $result->getItems()[0]; $this->assertEquals( 'https://www.google.fr/search?client=ubuntu&hs=k8t&q=shop+near+paris&npsic=0&rflfq=1&rlha=0&rllag=48865798%2C2325372%2C1412&tbm=lcl&ved=0ahUKEwj9h5Ha7aTOAhWEAxoKHRlCAI4QtgMIJw&tbs=lf%3A1%2Clf_ui%3A2', (string)$map->getDataValue('mapUrl') ); $this->assertCount(3, $map->localPack); $this->assertEquals('Disney Store', $map->localPack[0]->title); $this->assertequals('http://www.disneystore.fr/', $map->localPack[0]->url); $this->assertEquals('44 Av. des Champs-Élysées', $map->localPack[0]->street); // Stars $this->assertEquals('4.1', $map->localPack[0]->stars); $this->assertEquals('4.0', $map->localPack[1]->stars); // Review $this->assertEquals(null, $map->localPack[0]->review); $this->assertEquals(null, $map->localPack[1]->review); $this->assertEquals(null, $map->localPack[2]->review); // Phone $this->assertEquals('01 45 61 45 25', $map->localPack[0]->phone); $this->assertEquals('01 44 94 09 40', $map->localPack[1]->phone); $this->assertEquals('01 40 13 99 93', $map->localPack[2]->phone); } public function testLargeResult() { $gUrl = GoogleUrlArchive::fromString('https://www.google.fr/search?q=github'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/github.html'), $gUrl); $naturalParser = new NaturalParser(); $result = $naturalParser->parse($dom); $types = []; foreach ($result->getItems() as $item) { $types[] = $item->getTypes()[0]; } $this->assertInstanceOf(IndexedResultSet::class, $result); $this->assertCount(7, $result); $this->assertEquals([ NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::IN_THE_NEWS, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, ], $types); $itemLarge = $result->getItems()[0]; $this->assertEquals([NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL_LARGE], $itemLarge->getTypes()); $sitelinks = $itemLarge->sitelinks; $this->assertCount(6, $sitelinks); $this->assertEquals('GitHub Pages', $sitelinks[1]->title); $this->assertEquals('GitHub Pages ... Hosted directly from your GitHub repository ...', $sitelinks[1]->description); $this->assertEquals('https://pages.github.com/', $sitelinks[1]->url); } public function testNidGroup() { // Some result group are wrapped into an element with a div that has the class "_NId". // right now it only showed up on some google.es serp $gUrl = GoogleUrlArchive::fromString('https://www.google.es/search?q=alarmas+para+casa&lr=lang_es'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/alarmas+para+casa.html'), $gUrl); $naturalParser = new NaturalParser(); $result = $naturalParser->parse($dom); $types = []; foreach ($result->getItems() as $item) { $types[] = $item->getTypes()[0]; } $this->assertInstanceOf(IndexedResultSet::class, $result); $this->assertCount(10, $result); $this->assertEquals([ NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL ], $types); $item0 = $result->getItems()[0]; $this->assertEquals([NaturalResultType::CLASSICAL], $item0->getTypes()); $this->assertEquals('Alarmas para Hogar - Securitas Direct', $item0->title); } public function testFlights() { $gUrl = GoogleUrlArchive::fromString('https://www.google.fr/search?q=flights&oq=flights'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/flights.html'), $gUrl); $naturalParser = new NaturalParser(); $result = $naturalParser->parse($dom); $types = []; foreach ($result->getItems() as $item) { $types[] = $item->getTypes()[0]; } $this->assertInstanceOf(IndexedResultSet::class, $result); $this->assertCount(11, $result); $this->assertEquals([ NaturalResultType::FLIGHTS, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL ], $types); } public function testAnswerBox() { $gUrl = GoogleUrlArchive::fromString('https://www.google.co.uk/search?q=how+is+homer+simpsons&lr=lang_en&hl=en'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/how+is+homer+simpsons.html'), $gUrl); $naturalParser = new NaturalParser(); $result = $naturalParser->parse($dom); $types = []; foreach ($result->getItems() as $item) { $types[] = $item->getTypes()[0]; } $this->assertInstanceOf(IndexedResultSet::class, $result); $this->assertCount(11, $result); $this->assertEquals([ NaturalResultType::ANSWER_BOX, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::IN_THE_NEWS, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL, NaturalResultType::CLASSICAL ], $types); $answerBox = $result->getItems()[0]; $expectedDescription = 'Homer Jay Simpson is the protagonist of the American animated television series The Simpsons as the patriarch of the eponymous family. He is voiced by Dan Castellaneta and first appeared on television, along with the rest of his family, in The Tracey Ullman Show short "Good Night" on April 19, 1987.'; $this->assertEquals($expectedDescription, $answerBox->description); $this->assertEquals('Homer Simpson - Wikipedia, the free encyclopedia', $answerBox->title); $this->assertEquals('https://en.wikipedia.org/wiki/Homer_Simpson', $answerBox->destination); $this->assertEquals('https://en.wikipedia.org/wiki/Homer_Simpson', $answerBox->url); } /** * spotted by #21 https://github.com/serp-spider/search-engine-google/pull/21 */ public function testResultPosition() { // Page 1 $gUrl = GoogleUrlArchive::fromString('https://www.google.co.uk/search?q=how+is+homer+simpsons&lr=lang_en&hl=en'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/how+is+homer+simpsons.html'), $gUrl); $naturalParser = new NaturalParser(); $results = $naturalParser->parse($dom); $this->assertCount(11, $results); $this->assertEquals(1, $results[0]->getRealPosition()); $this->assertEquals(1, $results[0]->getOnPagePosition()); // Page 2 $gUrl = GoogleUrlArchive::fromString('https://www.google.co.uk/search?q=how+is+homer+simpsons&lr=lang_en&hl=en&start=10'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/how+is+homer+simpsons.html'), $gUrl); $naturalParser = new NaturalParser(); $results = $naturalParser->parse($dom); $this->assertCount(11, $results); $this->assertEquals(11, $results[0]->getRealPosition()); $this->assertEquals(1, $results[0]->getOnPagePosition()); } public function testResultWithDomText() { $gUrl = GoogleUrlArchive::fromString('https://www.google.co.uk/search?q=foo'); $dom = new GoogleDom(file_get_contents('test/resources/pages-evaluated/with-DOMText.html'), $gUrl); $naturalParser = new NaturalParser(); $results = $naturalParser->parse($dom); } } ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/03/asian+massage.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=asian+massage file: test/resources/pages-evaluated/2018/03/asian+massage.html results: - types: - MAP data-count: localPack: 3 data: localPack: - title: Oasis massage centre street: Newcastle upon Tyne review: 3 phone: 0191 222 0691 - title: Dundalk Asian Massage Centre street: dundalk, County Louth, Ireland review: 0 phone: +353 87 709 1703 - title: Fern Thai Massage street: Leigh review: 0 phone: 07837 980433 - types: - CLASSICAL - CLASSICAL_VIDEO - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/03/plumber+london.yml ================================================ # image-group recipes url: https://www.google.co.uk/search?q=plumber+london file: test/resources/pages-evaluated/2018/03/plumber+london.html results: - types: - MAP data-count: localPack: 3 data: localPack: - title: Pimlico Plumbers url: http://www.pimlicoplumbers.com/ street: London, Royaume-Uni stars: 4.4 review: 2130 phone: +44 20 7928 8888 - title: Emergency Plumbers street: Londres, Royaume-Uni stars: 4.8 review: 89 phone: +44 7796 345453 - title: My Plumber street: London, Royaume-Uni stars: 4.3 review: 33 phone: +44 20 3078 5920 - types: - CLASSICAL data: title: Pimlico Plumbers | Plumbers London Emergency Plumbers London ... url: http://www.pimlicoplumbers.com/ destination: www.pimlicoplumbers.com/ description: Pimlico Plumbers & Emergency Plumbers London; 24 Hours a Day, 365 Days a Year; Providing Plumbers, Heating Engineers, Electricians, Roofers, Carpenters, and Builders all over London. - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/03/qui+est+homer+simpsons.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=qui+est+homer+simpsons file: test/resources/pages-evaluated/2018/03/qui+est+homer+simpsons.html results: - types: - ANSWER_BOX data: title: Homer Simpson — Wikipédia url: https://fr.wikipedia.org/wiki/Homer_Simpson destination: https://fr.wikipedia.org/wiki/Homer_Simpson description: Homer est le mari maladroit de Marge et le père de Bart, Lisa et Maggie Simpson. Il a été élevé par ses parents, Mona et Abraham Simpson ; dans l'épisode La Mère d'Homer (saison 7, 1995), il est révélé que Mona est entrée en clandestinité dans les années 1960 après des démêlés avec la justice, étant activiste. - types: - PEOPLE_ALSO_ASK data-count: questions: 4 data: questions: - question: Quel est la date de naissance de Homer Simpson ? - question: Quel est le prénom du père de Bart Simpson ? - question: Où habitent les Simpson ? - question: Quel est l' âge de Bart Simpson ? - types: - CLASSICAL data: url: https://fr.wikipedia.org/wiki/Homer_Simpson title: Homer Simpson — Wikipédia destination: https://fr.wikipedia.org/wiki/Homer_Simpson - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - CLASSICAL_VIDEO data: title: Qu'est ce qui est jaune et qui attend? Homer simpson - YouTube - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - CLASSICAL_VIDEO data: title: "VIDÉO. Homer Simpson et la nourriture : 25 moments cultes" url: https://www.huffingtonpost.fr/2015/05/30/video-homer-simpson-nourriture-25-moments-cultes_n_7109552.html description: SÉRIES - La bière, la viande et les donuts. Les protéines et le sucre sont de vieux ami de Homer Simpson. Et d ... destination: https://www.huffingtonpost.fr/.../video-homer-simpson-nourriture-25... - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/03/super+u+paris.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=super+u+paris file: test/resources/pages-evaluated/2018/03/super+u+paris.html results: - types: - MAP data-count: localPack: 3 data: localPack: - title: Super U et drive url: https://www.magasins-u.com/superu-parisavenuedeclichy street: 103 Avenue de Clichy phone: 01 42 28 61 22 - title: Super U et drive street: 14 Rue Paul Bert phone: 01 43 79 43 43 - title: U Express et drive street: 15 Rue des Petits Carreaux phone: 01 42 36 51 00 - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/07/foo+bar(page2).yml ================================================ url: https://www.google.com.au/search?q=foo+bar file: test/resources/pages-evaluated/2018/07/foo+bar(page2).html test-methods: javascriptIsEvaluated: true getNumberOfResults: 27400000 isMobile: false results: - types: - CLASSICAL data: title: FOO bar c'est quoi - Developpez.net url: https://www.developpez.net/forums/d506491/systemes/linux/administration-systeme/foo-bar-c-quoi/ destination: https://www.developpez.net/forums/d506491/systemes/linux/.../foo-bar-c-quoi/ description: 11 mars 2008 - FOO bar c'est quoi. Salut à tous. je ne savais vraiment pas où poster cette question. Mais comme je suis sous linux en ce moment et que j'ai ... - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: "Télécharger Foobar2000 pour Windows : téléchargement gratuit !" url: https://www.clubic.com/telecharger-fiche11022-foobar2000.html destination: https://www.clubic.com/telecharger-fiche11022-foobar2000.html description: "15 juin 2018 - Télécharger Foobar2000 : Foobar 2000 : LE lecteur Audio léger par excellence, doté d'innombrables fonctions !" - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL related-searches: - title: foo bar baz url: https://www.google.com.au/search?client=ubuntu&hs=XD6&biw=753&bih=960&q=foo+bar+baz&sa=X&ved=0ahUKEwjNnq_Y-ofcAhXLVRQKHXU8D_o4ChDVAgh4KAA - title: foo bar signification - title: foo bar baz qux - title: foo foo bar - title: foo bar moo - title: perl foo bar - title: foo bar quiz - title: string foo bar ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/09/65b6be0a-7619-4018-97c9-989cdec53319.yml ================================================ url: https://www.google.de/search?q=mobile+device+management file: test/resources/pages-evaluated/2018/09/65b6be0a-7619-4018-97c9-989cdec53319.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 521000000 isMobile: false results: - types: - CLASSICAL data: title: Mobile-Device-Management – Wikipedia url: https://de.wikipedia.org/wiki/Mobile-Device-Management destination: https://de.wikipedia.org/wiki/Mobile-Device-Management description: "Mobile-Device-Management (MDM; deutsch Mobilgeräteverwaltung) ist ein Begriff aus der Informationstechnik und steht für die zentralisierte Verwaltung von ..." - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: "The Best Mobile Device Management (MDM) Solutions of 2018 ..." url: https://www.pcmag.com/article/342695/the-best-mobile-device-management-mdm-software destination: https://www.pcmag.com › ... › Small Business › Cloud Services description: "It's been a while since we dug into the mobile device management (MDM) category, so it's time for an update. However, updating this round of MDM product ..." - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL related-searches: - title: mobile device management vergleich url: https://www.google.de/search?num=100&hl=de&q=mobile+device+management+vergleich&sa=X&ved=0ahUKEwjb_r-Kjb7dAhVSbVAKHU1pDQ4Q1QII6gUoAA - title: mobile device management definition - title: mobile device management apple - title: mobile device management software - title: mobile device management kostenlos - title: mobile device management android - title: mobile device management open source - title: mobile device management iphone ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/10/agence+web+nantes.yml ================================================ url: https://www.google.co.uk/search?q=agence+web+nantes file: test/resources/pages-evaluated/2018/10/agence+web+nantes.html ads: section: top: results: - types: - AD data: url: https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwj16fSc26zeAhVX-VEKHXfACUYYABAAGgJ3cw&ohost=www.google.fr&cid=CAASEuRoMSMYTKbI4E-RghEWVIVIog&sig=AOD64_2IkY6m4XUTJ9Fr_V49vd1I54aX6Q&q&ved=2ahUKEwjr8e6c26zeAhVNyhoKHZv-AkIQ0Qx6BAgLEAE&adurl visurl: www.motion4ever.com/Agence-Web/Site-Internet - types: - AD data: url: https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwj16fSc26zeAhVX-VEKHXfACUYYABAIGgJ3cw&ohost=www.google.fr&cid=CAASEuRoMSMYTKbI4E-RghEWVIVIog&sig=AOD64_2HskaW7LNDJpwoz-cvNrS2SAN3dw&q&ved=2ahUKEwjr8e6c26zeAhVNyhoKHZv-AkIQ0Qx6BAgOEAE&adurl visurl: www.digitalgarden.fr/AgenceConseil/Web ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/10/who+is+homer+simpson.yml ================================================ url: https://www.google.co.uk/search?q=who+is+homer+simpson file: test/resources/pages-evaluated/2018/10/who+is+homer+simpson.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 25500000 isMobile: false results: - types: - ANSWER_BOX - types: - PEOPLE_ALSO_ASK data-count: questions: 4 data: questions: - question: Quel est l'âge de Homer Simpson ? - question: Quel est le métier de Homer Simpson ? - question: Quel âge a la série Les Simpson ? - question: Quel est l'âge de Marge Simpson ? - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL related-searches: - title: homer simpson age url: https://www.google.co.uk/search?q=homer+simpson+age&sa=X&ved=0ahUKEwi9p_OS4JreAhUNyoUKHdpUCD0Q1QIIhAIoAA - title: homer simpson voix - title: homer simpson dessin - title: homer simpson en vrai - title: homer simpson cerveau - title: homer simpson profil - title: homer simpson biere - title: marge simpson ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2018/11/acheter+kobo.yml ================================================ url: https://www.google.co.uk/search?q=acheter+kobo file: test/resources/pages-evaluated/2018/11/acheter+kobo.html test-methods: javascriptIsEvaluated: true isMobile: true ads: section: top: results: - types: - AD data: title: 'Librairie Kobo™ site officiel | Toutes vos lectures' url: https://www.kobo.com/fr/fr visurl: www.kobo.com/ description: Plus de 5 millions de titres. Toutes les nouveautés au meilleur prix. Tous les genres de livres. Lecture numérique commode. Appli Kobo™ gratuite. Soldes meilleures ventes. results: - types: - CLASSICAL data: title: "Kobo by fnac : la liseuse numérique | fnac" url: https://www.fnac.com/Kobo-by-Fnac/shi433378/w-4 destination: https://www.fnac.com › shi433378 description: La lecture à portée de main avec la liseuse numérique Kobo by fnac ! Plus de 3 muillions d'eBooks disponibles à la fnac. - types: - CLASSICAL data: title: "Tous les Kobo Fnac - Achat Informatique ..." url: https://www.fnac.com/Tous-les-Kobo-Fnac/Liseuses-Kobo-By-Fnac/nsh440798/w-4 destination: https://www.fnac.com › nsh440798 description: Plus de 6 références Tous les Kobo Fnac avec la livraison en 1 jour avec Fnac+. Retrouvez aussi tous nos produits de notre univers ... - types: - CLASSICAL data: title: "Acheter des livres sur kobo.com - kobo ..." url: https://www.kobo.com/help/fr-FR/article/1316/acheter-des-ebooks-et-emagazines-sur-kobo-com destination: https://www.kobo.com › fr-FR › article description: Acheter des eBooks sur kobo.com; Acheter un eBook dans la Librairie Kobo; Ajouter plusieurs articles à votre panier; Utilisation de la ... - types: - CLASSICAL data: title: "Tous les produits Kobo - Achat / Vente Kobo sur LDLC.com" url: https://www.ldlc.com/kobo/bint000036181/ destination: https://www.ldlc.com › bint000036181 description: Entreprise canadienne fondée en 2009, Kobo est l'un des services de lecture numérique les plus dynamiques au monde avec plus de 5 ... - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: "Liseuse Kobo : quelle est la meilleure en 2018 ? - Liseuses.net" url: http://www.liseuses.net/le-point-sur-les-liseuses-kobo/ destination: www.liseuses.net › le-point-sur-les-liseus... description: Accéder à Où acheter une liseuse Kobo ? · Vous pouvez donc en acheter une dans ... Kobo Aura 2ème édition, Kobo Clara ... - types: - PEOPLE_ALSO_ASK data-count: questions: 4 data: questions: - question: Comment acheter sur Kobo ? - question: Quelle est la meilleure liseuse ? - question: Comment télécharger des livres gratuits sur Kobo ? - question: Quel format eBook pour Kobo ? related-searches: - title: kobo liseuse url: https://www.google.co.uk/search?q=kobo+liseuse&sa=X&ved=2ahUKEwj9xtaS7rLeAhVLaBoKHTjEC3MQ1QIoAHoECAoQAQ - title: kobo fnac - title: kobo aura - title: kobo aura one - title: compte kobo - title: acheter kobo aura one - title: kobo application - title: kobo clara hd ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2019/05/plombier+paris.yml ================================================ # image-group recipes url: https://www.google.com/search?q=plombier+paris file: test/resources/pages-evaluated/2019/05/plombier+paris.html ads: section: top: results: - types: - AD data: title: 'Votre Plombier 24H/7J à Paris | Partenaire de la MAIF‎' url: https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwih-Zm7w6TiAhVmu-0KHZMLCyQYABAAGgJkZw&ohost=www.google.com&cid=CAASEuRo6HTIPJoDJ-nujvNR8ARXrA&sig=AOD64_3_Vxn-U9ONRlRa5qtg1QvtFDKs_w&q&ved=2ahUKEwig0ZS7w6TiAhWISBUIHZAtBjUQ0Qx6BAgOEAE&adurl visurl: www.mesdepanneurs.fr/Plomberie/Paris description: En Urgence ou sur Rendez-Vous. Commandez votre intervention rapidement en ligne ! Les prix... - types: - AD data: title: Plombier Paris | Intervention En Moins de 30min‎ - types: - AD data: title: Trouvez votre Plombier | 5000€ de Travaux à Gagner‎ - types: - AD data: title: "Plombier Paris | Tarif: A partir de 90 € | Dépannage en 45 minutes‎" ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/2019/07/cheap+video+editing+software+mac.yml ================================================ url: https://www.google.co.uk/search?q=cheap+video+editing+software+mac+nantes file: test/resources/pages-evaluated/2019/07/cheap+video+editing+software+mac.html test-methods: javascriptIsEvaluated: true isMobile: false results: - types: - ANSWER_BOX data: title: Best video editing software for Mac - MacPaw - types: - CLASSICAL data: title: "Best video editing software for Mac - MacPaw" url: https://macpaw.com/how-to/best-video-editing-software destination: https://macpaw.com/how-to/best-video-editing-software description: Jul 12, 2018 - Best free video editing software for Mac. iMovie. Apple's consumer focused video editing tool used to only be free if you bought a new Mac. DaVinci Resolve. If iMovie isn't for you, give DaVinci Resolve a try. Lightworks. OpenShot. Video Editor MovieMator. Final Cut Pro X. Adobe Premiere Pro CC. Adobe Premiere Elements ... # TODO video group not parsed - types: - CLASSICAL data: title: "Best free or inexpensive Mac video editors: iMovie, Lightworks, and ..." url: https://www.macworld.co.uk/feature/mac-software/mac-video-editors-3697211/ destination: https://www.macworld.co.uk › Features › Mac Software Features - types: - CLASSICAL data: title: Top 10 Best Free Video Editing Software for Mac Users [2019 Update] - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - PEOPLE_ALSO_ASK - types: - CLASSICAL - types: - CLASSICAL related-searches: - title: imovie video editing software mac url: https://www.google.co.uk/search?gl=US&q=imovie+video+editing+software+mac&sa=X&ved=2ahUKEwjuuPWt3L7jAhVC-6wKHXVJAQ0Q1QIoAHoECAoQAQ - title: video editing software for mac free download - title: avidemux video editing software mac - title: video editing software for old mac - title: best video editing software for mac 2019 - title: editing videos on mac - title: free video editing software mac no watermark - title: final cut pro ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/github(with-vertical-top-stories).yml ================================================ url: https://www.google.com.au/search?q=simpsons+donut file: test/resources/pages-evaluated/github(with-vertical-top-stories).html results: - types: - CLASSICAL - CLASSICAL_LARGE data: title: The world's leading software development platform · GitHub description: Online project hosting using Git. Includes source-code browser, in-line editing, wikis, and ticketing. Free for public open-source code. Commercial closed source... url: https://github.com/ destination: https://github.com/ - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - TOP_STORIES data: isCarousel: false news: - title: GitHub met à jour son programme Developer url: http://www.itrnews.com/articles/168507/github-met-jour-son-programme-developer.html - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/inde(top-stories).yml ================================================ # image-group recipes url: https://www.google.fr/search?q=inde&hl=fr_FR file: test/resources/pages-evaluated/inde(top-stories).html results: - types: - CLASSICAL - types: - CLASSICAL - types: - TOP_STORIES data: isCarousel: true news: - url: http://www.jeuneafrique.com/424970/politique/agressions-dafricains-inde-diplomates-demandent-louverture-dune-enquete-independante/ title: |- Agressions d'Africains en Inde : des diplomates demandent l'ouverture d'une enquête indépendante - JeuneAfrique.com - url: https://www.letemps.ch/monde/2017/04/04/inde-afrique-tirs-vue-contre-braconniers title: En Inde et en Afrique, tirs à vue contre les braconniers - url: http://www.rfi.fr/afrique/20170403-agressions-inde-diplomates-africains-denoncent-manque-reaction-autorites title: 'Agressions en Inde: des diplomates africains dénoncent le manque de réaction' - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - IMAGE_GROUP - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2017/11/buy+pen.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=buy+pen file: test/resources/pages-mobile/2017/11/buy+pen.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - CLASSICAL data: url: https://penclassics.nz/ destination: https://penclassics.nz title: Pen Classics description: New Zealand's premiere retailer of fountain pens, inks and papers! With over 200 inks in stock and the worlds top ... - types: - CLASSICAL data: url: https://www.penshop.co.uk/pens destination: https://www.penshop.co.uk › pens title: Buy Luxury Pens Online | Free UK Delivery | The Pen Shop description: Browse our full range of luxury pens, including fountain & ball pens from brands like Mont Blanc, Cross & Parker. Buy ... - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: url: https://www.amazon.in/Pens-Writing-Supplies/b?ie=UTF8&node=3591021031 destination: https://www.amazon.in › Pens-Writing-S... title: "Pens, Pencils & Writing Supplies: Buy Pens, Pencils ... - Amazon.in" description: Results 1 - 24 of 18193 · Amazon.in - Buy Pens, Pencils & Writing Supplies Online at Low Prices in India at Amazon.in. - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: url: https://www.priceme.co.nz/Pen-Refills-Ink/c-1577.aspx destination: https://www.priceme.co.nz › Pen-Refills-I... title: "Pen Refills & Ink NZ - Compare & Buy Pen Refills & Ink ... - PriceMe" description: Products 1 - 48 of 207 - Compare Pen Refills & Ink prices and read reviews on PriceMe. Buy online from the best shops in ... - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2017/11/mobile-donald+trump.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons+world file: test/resources/pages-mobile/2017/11/donald+trump.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - TOP_STORIES - TOP_STORIES_COMPOSED data-count: news: 12 data: isVertical: true isCarousel: true news: - title: Donald Trump’s Twitter account disappeared for five beautiful minutes url: https://www.theverge.com/platform/amp/2017/11/2/16600732/donald-trump-twitter-account-gone-realdonaldtrump types(): - TOP_STORIES_NEWS_VERTICAL - title: Opinion | What Donald Trump Thinks It Takes to Be a Man url: "#" types(): - TOP_STORIES_NEWS_VERTICAL - title: Trump's Twitter account briefly 'deactivated' url: https://www.bbc.com/news/amp/world-us-canada-41854482 types(): - TOP_STORIES_NEWS_CAROUSEL - title: |- Jared Kushner's team turned over documents to special counsel in Russia investigation url: https://amp.cnn.com/cnn/2017/11/02/politics/jared-kushner-robert-mueller-documents-russia-investigation/index.html types(): - TOP_STORIES_NEWS_CAROUSEL - types: - KNOWLEDGE data: title: Donald Trump - types: - CLASSICAL - types: - TWEETS_CAROUSEL data: url: https://twitter.com/realDonaldTrump?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor title: Donald J. Trump destination: Twitter › realDonaldTrump user: "@realDonaldTrump" - types: - CLASSICAL - types: - VIDEO_GROUP - types: - CLASSICAL - types: - CLASSICAL related-searches: - title: donald trump education url: https://www.google.fr/search?q=donald+trump+education&sa=X&ved=0ahUKEwiuyOT1rKHXAhWBLyYKHVyOCswQ1QIIngMoAA - title: donald trump wiki - title: donald trump age - title: donald trump jr - title: donald trump quotes - title: donald trump dead - title: donald trump impeach - title: donald trump wife ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2017/12/foo.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=foo file: test/resources/pages-mobile/2017/12/foo.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - KNOWLEDGE data: title: Foo Fighters - types: - CLASSICAL data: isAmp: false title: foo — Wiktionnaire url: https://fr.m.wiktionary.org/wiki/foo destination: https://fr.m.wiktionary.org › wiki › foo description: foo \fu\ invariable. (Anglicisme informatique) (Programmation informatique) Variable métasyntaxique en programmation informatique. - types: - VIDEO_GROUP - types: - CLASSICAL data: isAmp: false title: Variable métasyntaxique — Wikipédia - types: - CLASSICAL data: isAmp: false title: Foo Fighters — Wikipédia - types: - CLASSICAL data: isAmp: true title: "Foo Fighters : écoutez le nouvel album \"Concrete and Gold ..." url: https://m.culturebox.francetvinfo.fr/amp/musique/rock/foo-fighters-ecoutez-le-nouvel-album-concrete-and-gold-mariage-des-extremes-262545 destination: https://culturebox.francetvinfo.fr › ... description: 15 sept. 2017 · Le nouvel album des Foo Fighters est selon le leader Dave Grohl leur "plus grand" à ce jour. "Concrete and Gold" célèbre surtout le mariage des extrêmes, celui de la brutalité et de la dentelle, du heavy rock et de la pop. - types: - CLASSICAL data: isAmp: false - types: - CLASSICAL data: isAmp: true title: On était au concert ultra-secret des Foo Fighters à Stockholm ! - Le ... description: "14 sept. 2017 · Mais qu'importe ! Nous allons assister ce soir à un show unique : un concert secret des Foo Fighters, venus spécialement en Europe pour fêter avec quelques privilégiés la sortie de leur nouvel album, Concrete and Gold." - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2017/12/who+is+homer+simpsons.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=who+is+homer+simpsons file: test/resources/pages-mobile/2017/12/who+is+homer+simpsons.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - KNOWLEDGE data: title: Homer Simpson - types: - PEOPLE_ALSO_ASK data-count: questions: 4 data: questions: - question: What jobs has Homer Simpson had? types(): - PAA_QUESTION - question: How much weight is Homer Simpson? - question: What football team does Homer Simpson support? - question: How much money does Dan Castellaneta make per episode? - types: - CLASSICAL data: title: Homer Simpson - Wikipedia - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2018/03/foo.yml ================================================ # image-group recipes url: https://www.google.ca/search?q=foo file: test/resources/pages-mobile/2018/03/foo.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - KNOWLEDGE data: title: Foo Fighters - types: - CLASSICAL data: title: Variable métasyntaxique — Wikipédia isAmp: false url: https://fr.m.wikipedia.org/wiki/Variable_m%C3%A9tasyntaxique destination: https://fr.m.wikipedia.org › wiki › Variab... description: "foo : historiquement fu, pour fucked up, ou peut-être forward observation officer, connus pendant la Seconde Guerre mondiale notamment pour les inscriptions laissées derrière les lignes ennemies foo was here ; selon une autre interprétation, ..." - types: - CLASSICAL data: title: Foo Fighters — Wikipédia - types: - CLASSICAL data: title: foo — Wiktionnaire - types: - CLASSICAL data: title: Foo Fighters - YouTube - types: - CLASSICAL data: title: Foo Fighters - Accueil | Facebook - types: - CLASSICAL data: title: '"Concrete and Gold" : Dave Grohl et ses Foo Fighters tiennent ... - LCI' - types: - CLASSICAL data: title: "Dave Grohl, de Nirvana aux Foo Fighters : une vie en rock" isAmp: true - types: - CLASSICAL data: title: 'Foo Fighters : écoutez le nouvel album "Concrete and ...' isAmp: true url: https://m.culturebox.francetvinfo.fr/amp/musique/rock/foo-fighters-ecoutez-le-nouvel-album-concrete-and-gold-mariage-des-extremes-262545 destination: https://culturebox.francetvinfo.fr › ... description: '15 sept. 2017 · Le nouvel album des Foo Fighters est selon le leader Dave Grohl leur "plus grand" à ce jour. "Concrete and Gold" célèbre surtout le mariage des extrêmes, celui de la brutalité et de la dentelle, du heavy rock et de la pop.' - types: - CLASSICAL data: title: 'Foo Production | Event, équipement, shop' isAmp: false url: http://foo-production.com/ destination: foo-production.com description: "Foo Production c'est aussi un large réseau de professionnel dans multiples secteurs. Foo Production a vu le jour en 2007 à Thionville (57), à ce moment-là c' était une salle de remise en forme de 800m². Depuis, le gérant Younesse El Hariri, ..." ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2018/07/simpsons-episode-1.yml ================================================ # image-group recipes url: https://www.google.ca/search?q=simpsons+episode+1 file: test/resources/pages-mobile/2018/07/simpsons-episode-1.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - KNOWLEDGE data: title: Noël mortel shortDescription: Épisode de série télévisée - types: - CLASSICAL - CLASSICAL_VIDEO data: title: Simpson // saison 1 // episode 1 (ancien) ... url: https://m.youtube.com/watch?v=cTet1Beli38 destination: https://m.youtube.com › watch - types: - CLASSICAL data: title: "Saison 1 > Episode 1 : Noël mortel - Simpson Streaming" url: http://simpson-en-streaming.com/saison-1/episode-1/noel-mortel destination: simpson-en-streaming.com › noel-mortel description: "Noël mortel (Saison 1, épisode 1) de Les Simpson en streaming illimité et gratuit, résumé de l'épisode : Ce soir , les Simpson assistent à la fête de Noël de l'école dans laquelle Bart et Lisa participent. De retour à la ..." - types: - CLASSICAL data: title: Saison 1 - Simpson TV url: http://simpson-tv.over-blog.ch/article-episode-1-noel-mortel-105043944.html destination: simpson-tv.over-blog.ch › article-episode... - types: - CLASSICAL - CLASSICAL_VIDEO - types: - CLASSICAL - CLASSICAL_VIDEO - types: - CLASSICAL - CLASSICAL_VIDEO - types: - CLASSICAL - CLASSICAL_VIDEO - types: - CLASSICAL - types: - CLASSICAL data: title: Saison 1 des Simpson — Wikipédia destination: https://fr.m.wikipedia.org › wiki › Saison... url: https://fr.m.wikipedia.org/wiki/Saison_1_des_Simpson description: Accéder à Épisodes · 1, 1, Noël mortel (Homer au nez rouge) Simpsons Roasting on an ... Simpson à des électrodes. Les Simpson s'électrocutent les uns les autres, causant des baisses de tension dans ... - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2018/08/new-construction-ct.yml ================================================ # image-group recipes url: https://www.google.ca/search?q=new+construction+ct file: test/resources/pages-mobile/2018/08/new+construction+ct.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - CLASSICAL data: title: Connecticut New Homes & New Construction For Sale | Zillow destination: Zillow › ct › new-homes url: https://www.zillow.com/ct/new-homes/ description: Discover new construction homes or master planned communities in Connecticut . Check out floor plans, pictures and ... - types: - CLASSICAL data: url: https://www.realtor.com/newhomesconstruction/Connecticut destination: Realtor.com › newhomesconstruction › C... - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: New Home Development and New Home Construction | William ... - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: isAmp: true - types: - CLASSICAL data: isAmp: true title: Connecticut Homes for Sale - 13 New Home Communities | Toll ... url: https://www.tollbrothers.com/luxury-homes/Connecticut?amp=true destination: Toll Brothers › luxury-homes description: Connecticut homes for sale by Toll Brothers®. 13 new luxury home communities in CT. View photos, floor plans, pricing ... ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile/2018/11/01/plombier+nantes.yml ================================================ url: https://www.google.co.uk/search?q=plombier+nantes file: test/resources/pages-mobile/2018/11/01/plombier+nantes.html test-methods: javascriptIsEvaluated: true isMobile: true ads: section: top: results: - types: - AD data: title: Appelez le 02 99 91 67 43 | 2ADIR / Guede Tony url: https://www.google.fr/aclk?sa=L&ai=DChcSEwimzdCmtLPeAhXNtO0KHeAwB1kYABAAGgJkZw&sig=AOD64_3icl5gYjLzBwtTFMpfFDcr-gjmYA&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQjhp6BAgNEAE&adurl visurl: www.2adir.com/ description: 2ADIR Électricien plombier serrurier - types: - AD data: title: Plombier Boulogne 24/24 7j/7 | Intervention en 30mn chez Vous url: http://plombiersurboulognebillancourt.fr/ visurl: www.plombiersurboulognebillancourt.fr/ description: Agrées Assurances, Artisan Qualifié, Dépannage d'urgence, tout travaux plomb. Artisan de quartier. Déplacement Rapide. Intervention en 30 mn. - types: - AD - types: - AD data: title: Besoin d'un Devis Travaux | Trouvez un Artisan Qualifié | startdevis.fr url: https://www.google.co.uk/aclk?sa=l&ai=DChcSEwimzdCmtLPeAhXNtO0KHeAwB1kYABAFGgJkZw&ae=1&sig=AOD64_2K7C9U6tiL9okyQh2tttslRCfaPg&adurl=http%3A%2F%2Fwww.startdevis.fr&q visurl: www.startdevis.fr/ description: Obtenez Jusqu' à 4 devis Comparatifs en 3 clics et Trouvez le bon Artisan en 48H bottom: results: - types: - AD data: title: Alain Rousseau | Dépannage Plomberie à Nantes. url: http://www.alain-rousseau.fr/plomberie visurl: www.alain-rousseau.fr/Plomberie description: Dépannage, Installation, Détartrage, Réparation, Débouchage, Remplacement. Débouchage. Réparation. Devis gratuit. Détartrage. Remplacement. Installation. Dépannage. results: - types: - MAP data-count: localPack: 3 data: localPack: - title: Ze Plombier url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=Ze+Plombier+Nantes&ludocid=1512192997907758528&ibp=gwp%3B0%2C7&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQvS4wAHoECAoQQQ stars: 4.4 review: 37 - title: ARTISAN PLOMBIER CHAUFFAGISTE NANTES YVES HENAFF Dépannage Rénovation Agencement Salle de Bains url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=ARTISAN+PLOMBIER+CHAUFFAGISTE+NANTES+YVES+HENAFF+D%C3%A9pannage+R%C3%A9novation+Agencement+Salle+de+Bains+Nantes&ludocid=10943936817373136974&ibp=gwp%3B0%2C7&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQvS4wAXoECAoQWQ stars: 4.2 review: 42 - title: "Plombier Nantes : MATTOS VINCENT Plombier à Nantes" url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=Plombier+Nantes+%3A+MATTOS+VINCENT+Plombier+%C3%A0+Nantes+Nantes&ludocid=15951514921003022363&ibp=gwp%3B0%2C7&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQvS4wAnoECAoQcQ stars: 4.3 review: 24 - types: - CLASSICAL data: title: "Ze Plombier Nantes | Dépannage | Réparation | Installation" url: http://www.zeplombier.fr/ destination: www.zeplombier.fr description: Ze Plombier intervient à Nantes. Pour vos travaux de plomberie, chauffage, gaz, entretien de chaudière. Devis gratuit. - types: - CLASSICAL - types: - CLASSICAL data: title: "Contactez un plombier à Nantes, demandez un devis pour réaliser vos ..." url: https://www.pagesjaunes.fr/annuaire/nantes-44/plombiers destination: https://www.pagesjaunes.fr › plombiers description: "Plombier à Nantes (44) : Devis et Informations , … Trouvez un artisan ou un expert près de chez vous dans l'annuaire PagesJaunes." - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: "Les 10 meilleurs plombiers à Nantes, Loire-Atlantique - StarOfService" url: https://www.starofservice.com/annubis/pays-de-la-loire/loire-atlantique/nantes/plomberie destination: https://www.starofservice.com › plomberie description: Voici la liste complète de nos meilleurs plombiers de Nantes et ses environs évalués par la communauté StarOfService de ... related-searches: - title: plombier nantes 44300 url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=plombier+nantes+44300&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQ1QIoAHoECAsQAQ - title: plombier nantes urgence - title: avis plombier nantes - title: ze plombier nantes - title: plombier nantes pas cher - title: plombier nantes pages jaunes - title: plombier nantes 44100 url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=plombier+nantes+44100&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQ1QIoBnoECAsQBw - title: plombier nantes zola url: https://www.google.co.uk/search?client=ubuntu&hs=ExG&q=plombier+nantes+zola&sa=X&ved=2ahUKEwji3sumtLPeAhWJJcAKHWojBiYQ1QIoB3oECAsQCA ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile-simpsons+donuts.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons+donuts file: test/resources/pages-mobile/simpsons+donuts.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - IMAGE_GROUP data: isCarousel: true moreUrl: https://www.google.fr/search?q=simpsons+donuts&client=ubuntu-browser&prmd=isvn&tbm=isch&tbo=u&source=univ&fir=5pf6apgzcM_1AM%253A%252Cw9PWfLhS5NhIJM%252C_%253BT1mGMZ1G3UqIZM%253A%252CULbgNRldUTz54M%252C_%253BNXAKVKQBuIUioM%253A%252CefXeqgQgXM3-sM%252C_%253ByfwiLrFBCoJREM%253A%252C13d6-FL7ZdmbrM%252C_%253B2CXI4Cmj5X3dGM%253A%252CoXZN5y098HMw3M%252C_%253Bw7pPh0tSmS9fQM%253A%252CefXeqgQgXM3-sM%252C_%253BMykB36G8HPSOvM%253A%252CDFZBMzL58xSNiM%252C_%253BPsgymH70iPP7VM%253A%252CeaF3My1vToZseM%252C_%253BOV0EHIRtJyKfDM%253A%252C48UHaPs_HHMC4M%252C_%253BZZzcaNFrtOfdeM%253A%252CzR1d_Tio42JKKM%252C_&usg=__EgYELg3Q4TWqNXLgl6ZSlZzIpao%3D&sa=X&ved=0ahUKEwjat_2AnMnTAhVHWxQKHTSjA78Q7AkIHA images: - sourceUrl: https://www.pinterest.com/explore/simpsons-donut/ - sourceUrl: http://www.cdiscount.com/telephonie/r-donuts+simpsons.html data-count: images: 10 data-media: images: # Image is 1px gif # TODO parse it from javacscript source - image: test/resources/pages-mobile/simpsons+donuts/thumb1.png - types: - VIDEO_GROUP data: videos: - title: Donuts illimités pour Springfield [REDIT Avril 2017] url: https://m.youtube.com/watch?v=e6uSN6bcWtg - title: Les Simpsons Springfield - Avoir des donuts Illimité 2016 Tutoriel FR url: https://m.youtube.com/watch?v=irmOhOGabEM data-count: videos: 10 data-media: videos: # Image is 1px gif # TODO parse it from javacscript source - image: test/resources/pages-mobile/simpsons+donuts/thumb1.png - types: - CLASSICAL - CLASSICAL_ILLUSTRATED data: url: http://recettes-series.com/les-donuts-dhomer/ title: Les donuts d'Homer ~ The Simpsons - Recettes de séries description: Aujourd'hui, je vais vous donner la recette des fameux donuts d'Homer, qui ont donné naissance à la phrase culte « MmmMmM des  ... destination: recettes-series.com › les-donuts-dhomer - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile-simpsons+homer.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons+movie+trailer file: test/resources/pages-mobile/simpsons+homer.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - KNOWLEDGE data: title: Homer Simpson shortDescription: Personnage fictif - types: - CLASSICAL - CLASSICAL_ILLUSTRATED data: title: Homer Simpson — Wikipedia url: https://fr.m.wikipedia.org/wiki/Homer_Simpson destination: https://fr.m.wikipedia.org › wiki › Home... description: Homer Jay Simpson est le principal personnage fictif de la serie televisee d'animation Les Simpson et le pere de la famille du meme nom. Il est double par Dan Castellaneta dans la version originale, ... - types: - CLASSICAL - CLASSICAL_ILLUSTRATED data: title: Homer Simpson - Wikipedia, the free encyclopedia url: https://en.m.wikipedia.org/wiki/Homer_Simpson destination: https://en.m.wikipedia.org › wiki › Home... description: Homer Jay Simpson is a fictional character and the main protagonist of the American animated television series The Simpsons as the patriarch of the eponymous family. He is voiced by Dan Castellaneta and ... - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - VIDEO_GROUP - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL data: title: "Les Simpson : Homer et Marge ont-ils vraiment divorce ? (spoilers ..." ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/mobile-simpsons+world.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons+world file: test/resources/pages-mobile/simpsons+world.html test-methods: javascriptIsEvaluated: true getNumberOfResults: null isMobile: true results: - types: - CLASSICAL - CLASSICAL_LARGE data: isAmp: false title: Everything Simpsons sitelinks: - title: Episodes description: "" url: http://www.simpsonsworld.com/browse/episodes - title: Simpsons TV - title: Characters - title: Need help? - title: Simpsons World settings - title: Clips description: "" url: http://www.simpsonsworld.com/browse/clips data-count: sitelinks: 6 - types: - KNOWLEDGE data: title: "Simpsons World The Ultimate Episode Guide: Seasons 1–20" shortDescription: Livre de Matt Groening - types: - CLASSICAL data: isAmp: false - types: - CLASSICAL data: title: "Simpsons World: Every Simpsons Episode Ever, Online For Free ..." isAmp: true - types: - CLASSICAL data: isAmp: false - types: - CLASSICAL data: isAmp: true - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/narendra+modi.yml ================================================ url: https://www.google.co.uk/search?q=narendra+modi&cad=h file: test/resources/pages-evaluated/narendra+modi.html results: - types: - TOP_STORIES - types: - CLASSICAL - types: - TWEETS_CAROUSEL data: title: Narendra Modi (@narendramodi) · Twitter url: https://twitter.com/narendramodi?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor user: "@narendramodi" - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/natural-cards.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons&hl=en_US file: test/resources/pages-evaluated/cards-design.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 261000000 isMobile: false results: - types: - CLASSICAL data: title: Florida - Wikipedia, the free encyclopedia url: https://en.wikipedia.org/wiki/Florida destination: https://en.wikipedia.org/wiki/Florida description: Spring naar Joining the United States; Indian Removal - Florida Listen/ˈflɒrɪdə is a state located in the southeastern region of the United States. - types: - CLASSICAL data: title: Florida (staat) - Wikipedia url: https://nl.wikipedia.org/wiki/Florida_(staat) destination: https://nl.wikipedia.org/wiki/Florida_(staat) description: Map of USA FL.svg. Over deze ... Florida is een staat van de Verenigde Staten. Florida ligt in het zuidoosten van het land en heeft een subtropisch klimaat. - types: - IMAGE_GROUP data-count: images: 5 data: isCarousel: false moreUrl: https://www.google.fr/search?q=florida+usa&client=firefox-b&hl=com&noj=1&nomo=1¬a=1&igu=1&glp=1&tbm=isch&tbo=u&source=univ&sa=X&ved=0ahUKEwiKg83E7a7PAhWCTxoKHfFKDXcQsAQIPg images: - sourceUrl: http://www.nationsonline.org/oneworld/map/USA/florida_map.htm targetUrl: https://www.google.fr/search?q=florida+usa&client=firefox-b&hl=com&noj=1&nomo=1¬a=1&igu=1&glp=1&tbm=isch&imgil=ASKOFq0GQQZiNM%253A%253BaaaOellMdBjLiM%253Bhttp%25253A%25252F%25252Fwww.nationsonline.org%25252Foneworld%25252Fmap%25252FUSA%25252Fflorida_map.htm&source=iu&pf=m&fir=ASKOFq0GQQZiNM%253A%252CaaaOellMdBjLiM%252C_&usg=__DsSoDd9iWBl1euPDoOUc90OXBtw%3D - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: 110 vakantiehuizen in Florida, USA | Interhome ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/naturals-data-with_bkgroups.yml ================================================ url: https://www.google.fr/search?q=titley+großbritannien+hotels&hl=de_DE file: test/resources/pages-evaluated/page-with-bkgrouped-results.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 121000 isMobile: false results: - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - IMAGE_GROUP - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/naturals-data.yml ================================================ url: https://www.google.fr/search?q=simpsons&hl=en_US file: test/resources/pages-evaluated/simpsons.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 65200000 isMobile: false results: - types: - CLASSICAL - types: - TWEETS_CAROUSEL data: user: "@TheSimpsons" url: https://twitter.com/TheSimpsons?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor - types: - CLASSICAL - types: - IN_THE_NEWS data: news: - title: "'The Simpsons': Greatest Political Moments" url: http://www.rollingstone.com/politics/news/the-simpsons-greatest-political-moments-20160323 description: "'The Simpsons' has lampooned political figures over four presidential administrations and ..." title: The Simpsons (@TheSimpsons) | Twitter - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/ransomware.yml ================================================ # testing null user (see TWEETS_CAROUSEL) url: https://www.google.co.uk/search?q=ransomware file: test/resources/pages-evaluated/ransomware.html results: - types: - TOP_STORIES - types: - TWEETS_CAROUSEL data: user: null title: ransomware on Twitter - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - PEOPLE_ALSO_ASK data-count: questions: 4 data: questions: - question: What is a ransomware attack? - question: How do I get rid of ransomware? - question: How do I protect myself from ransomware? - question: What is locky ransomware? - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/simpsons+donuts.yml ================================================ # image-group recipes url: https://www.google.com.au/search?q=simpsons+donut file: test/resources/pages-evaluated/simpsons+donut.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 537000 isMobile: false results: - types: - IMAGE_GROUP data-count: images: 12 data: moreUrl: https://www.google.com.au/search?q=simpsons+donut&tbm=isch&tbo=u&source=univ&sa=X&ved=0ahUKEwi25M6i44PNAhXEWBoKHVSRBGkQsAQIGw images: - sourceUrl: https://www.pinterest.com/tailaurindo/simpson/ targetUrl: https://www.google.com.au/search?q=simpsons+donut&tbm=isch&imgil=xo4ZbYgvwQiXxM%253A%253BesZLHUJ3kmTgyM%253Bhttps%25253A%25252F%25252Fwww.pinterest.com%25252Ftailaurindo%25252Fsimpson%25252F&source=iu&pf=m&fir=xo4ZbYgvwQiXxM%253A%252CesZLHUJ3kmTgyM%252C_&usg=__Z-32x0kYL_G1X_tyz88rdtHi_D0%3D - types: - CLASSICAL - types: - CLASSICAL - CLASSICAL_ILLUSTRATED data: title: The Simpsons Doughnuts! (or Do'h-nuts) | The Flavor Bender data-media: thumb: test/resources/pages-evaluated/simpsons+donut/donut-recipe-thumb.jpg - types: - CLASSICAL - CLASSICAL_ILLUSTRATED - CLASSICAL_VIDEO - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/simpsons+movie+trailer.yml ================================================ # image-group recipes url: https://www.google.fr/search?q=simpsons+movie+trailer file: test/resources/pages-evaluated/simpsons+movie+trailer.html test-methods: javascriptIsEvaluated: true getNumberOfResults: 10200000 isMobile: false results: - types: - CLASSICAL_VIDEO - CLASSICAL data: videoLarge: true - types: - CLASSICAL_VIDEO - CLASSICAL - CLASSICAL_ILLUSTRATED data: videoLarge: false - types: - CLASSICAL_VIDEO - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL_VIDEO - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL_VIDEO - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL_VIDEO - CLASSICAL - CLASSICAL_ILLUSTRATED - types: - CLASSICAL - types: - CLASSICAL ================================================ FILE: test/suites/Parser/Evaluated/natural-parser-data/simpsonsworld.yml ================================================ url: https://www.google.fr/search?q=simpsonsworld file: test/resources/pages-evaluated/simpsonsworld.html results: - types: - CLASSICAL - CLASSICAL_LARGE data: title: Episodes | Simpsons World on FXX url: http://www.simpsonsworld.com/browse/episodes destination: www.simpsonsworld.com/browse/episodes description: Browse Every. Simpsons Episode. Ever. Whenever. Access full episodes, clips, extras, exclusive playlists and more. sitelinks: - title: Most Popular url: http://www.simpsonsworld.com/browse/popular description: "POPULAR PLAYLISTS. (23 Videos) The Best of Lisa: Full Episodes ..." - title: Browse Commentary url: http://www.simpsonsworld.com/browse/commentary description: Browse Every. ... Episodes; Audio Commentary; Clips · Playlists ... - types: - CLASSICAL not-types: - CLASSICAL_LARGE data: title: Everything Simpsons | Simpsons World on FXX url: http://www.simpsonsworld.com/ destination: www.simpsonsworld.com/ description: Watch Every. Simpsons Episode. Ever. Whenever. Access full episodes, clips, extras, exclusive playlists and more. - types: - CLASSICAL data: title: Simpsons TV | Simpsons World on FXX - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL - types: - CLASSICAL data: title: A Review Of Simpsons World, An App For “Simpsons” Fans That Gets ...