diff --git a/dosagelib/plugins/gocomics.py b/dosagelib/plugins/gocomics.py index b6849b006..8529e517f 100644 --- a/dosagelib/plugins/gocomics.py +++ b/dosagelib/plugins/gocomics.py @@ -1,20 +1,21 @@ # -*- coding: utf-8 -*- # Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs # Copyright (C) 2012-2014 Bastian Kleineidam -# Copyright (C) 2015-2016 Tobias Gruetzmacher +# Copyright (C) 2015-2017 Tobias Gruetzmacher from __future__ import absolute_import, division, print_function from ..scraper import _ParserScraper from ..helpers import bounceStarter +from .common import xpath_class class GoComics(_ParserScraper): url = 'http://www.gocomics.com/' - imageSearch = ('//div/img[@class="strip"]', - '//p[@class="feature_item"]/img[@class="strip"]') - prevSearch = '//ul[@class="feature-nav"]//a[@class="prev"]' - nextSearch = '//ul[@class="feature-nav"]//a[@class="next"]' + imageSearch = '//picture[%s]/img' % xpath_class('item-comic-image') + navSearch = '//div[@class="button-icon-group"]//a[%s]' + prevSearch = navSearch % xpath_class('fa-caret-left') + nextSearch = navSearch % xpath_class('fa-caret-right') starter = bounceStarter help = 'Index format: yyyy/mm/dd' @@ -40,205 +41,35 @@ class GoComics(_ParserScraper): def getmodules(cls): return ( # old comics removed from the listing - cls('AbnormalTruth', 'abnormal-truth'), - cls('ABootsAndPupComic', 'a-boots-and-pup-comic'), - cls('AdmiralSquirt', 'admiral-squirt'), - cls('AdventuresofDaisy', 'Adventures-of-Daisy'), - cls('AdventuresOfMartyAndTurkey', 'marty-and-turkey'), - cls('AdventuresofMikeAndSimon', 'adventures-of-mike-and-simon'), - cls('AmaZnEvents', 'amaznevents'), - cls('AnythingGoes', 'anything-goes'), - cls('BarkingCrayon', 'barking-crayon'), - cls('BenAndSeymour', 'ben-seymour'), - cls('BERSERKALERT', 'berserk-alert'), - cls('BestInShow', 'best-in-show'), - cls('BobtheGroanUP', 'bob-the-groanup'), - cls('BradsPit', 'brads-pit'), - cls('CalAndOzz', 'cal-and-ozz'), - cls('CandyPills', 'candy-pills'), - cls('Cartertoons', 'cartertoons'), - cls('CatsAtWork', 'cats-at-work'), - cls('ChasingUnicorns', 'chasing-unicorns'), - cls('ChubbyGirlComics', 'chubbygirlcomics'), - cls('Classifudds', 'classifudds'), - cls('CockroachComix', 'cockroachcomix'), - cls('CoffeeShopTidbits', 'coffee-shop-tidbits'), - cls('ColonelKernel', 'colonel-kernel'), - cls('Cooper', 'cooper'), - cls('CowSheepandaGnomeNamedHelga', 'cow-sheep-and-a-gnome-named-helga'), - cls('CoyoteVille', 'coyteville'), - cls('Crooksville', 'crooksville'), - cls('DabneyandDad', 'dabney-and-dad'), - cls('DialHforHBomb', 'dial-h-for-h-bomb'), - cls('DiligentCity', 'diligent-city'), - cls('DitzAbledPrincess', 'ditzabled-princess'), - cls('DogsDucksandAliens', 'dogs-ducks-and-aliens'), - cls('DoingTime', 'doingtime'), - cls('DoodleDaysComics', 'doodle-days'), - cls('EBEJeebie', 'ebe-jeebie'), - cls('EDITORIALPASTANDPRESENT', 'editorial-past-and-present'), - cls('ElephantintheRoom', 'elephant-in-the-room'), - cls('ElfandMotorbelly', 'elf-and-motorbelly'), - cls('EngagAndNevets', 'engag-nevets'), - cls('EspressoCity', 'Espresso-City'), - cls('EttoreandBaldo', 'ettore-and-baldo'), - cls('FantasticMegaLeague', 'fantastiteam'), - cls('FarcesofNature', 'farces-of-nature'), - cls('Featherweight', 'featherweight'), - cls('FleasonFlick', 'fleasonflick'), - cls('FrizziToons', 'frizzitoons'), - cls('FundayMorning', 'funday-morning'), - cls('GatorsAndSuch', 'gators-and-such'), - cls('GenerationMute', 'generation-mute'), - cls('GetAGrip', 'get-a-grip'), - cls('GramDragon', 'gramdragon'), - cls('HanginOut', 'hangin-out'), - cls('HankAndDalesOurWorld', 'hank-and-dales-our-world'), - cls('HanktheSock', 'hank-the-sock'), - cls('HarambeeHills', 'harambeehills'), - cls('Hbenson7', 'hbenson7'), cls('HeadComics', 'head-comics'), cls('HeavenlyNostrils', 'heavenly-nostrils'), - cls('HolySchnark', 'holy-schnark!'), - cls('HumblebeeandBob', 'humblebee-and-bob'), - cls('Humoresque', 'humoresque'), - cls('ImaDillo', 'i-m-a-dillo'), - cls('ImTellingMom', 'telling-mom'), - cls('IsleofEx', 'isle-of-ex'), - cls('JackRadioComics', 'jack-radio-comics'), - cls('JillpokeBohemia', 'jillpoke-bohemia'), - cls('JimAndSarah', 'jim-and-sarah'), - cls('JordanandBentley', 'jordan-and-bentley'), - cls('KirbysTreehouse', 'kirbys-treehouse'), - cls('KozmooftheCosmos', 'kozmoofthecosmos'), - cls('LardWantsWorldPeace', 'lard-wants-world-peace'), - cls('LarryvilleBlue', 'larryville-blue'), - cls('Leadbellies', 'leadbellies'), - cls('LEFTOVERS', 'leftovers'), - cls('LeGooseyLu', 'LeGoosey-Lu'), - cls('LIGHTERSIDE', 'lighter-side'), - cls('LostInTranslation', 'lost-in-translation'), - cls('LucasLuminous', 'lucas-luminous'), - cls('MagnificatzOld', 'magnificatz-sherpa'), - cls('Markonpaper', 'mark-on-paper'), - cls('MaryBWary', 'mary-b-wary'), - cls('Maximus', 'maximus'), - cls('Mick', 'mick'), - cls('MixedMedications', 'mixedmedications'), - cls('Mortimer', 'mortimer'), - cls('MrMorris', 'mr-morris'), cls('MyCage', 'mycage'), - cls('MyGuardianGrandpa', 'my-guardian-grandpa'), - cls('NeatStep', 'neatstep'), - cls('NeighborhoodZone', 'neightborhood-zone'), - cls('NobodysHome', 'nobodys-home'), - cls('NoPlaceLikeHolmes', 'no-place-like-holmes'), - cls('Norman', 'Norman'), - cls('Oat', 'oat'), - cls('ObamaandtheFatman', 'obama-and-the-fatman'), - cls('OntheQuad', 'on-the-quad'), - cls('OrangesareFunny', 'oranges-are-funny'), - cls('Outnumbered', 'outnumbered'), - cls('PamosWorld', 'pamos-world'), cls('ParisDoodles', 'mo-willems-paris-doodles'), - cls('Peanizles', 'peanizles'), - cls('PetFood', 'pet-food'), - cls('PipethePelican', 'pipe-the-pelican'), cls('PlasticBabyHeadsfromOuterSpace', 'plastic-babyheads'), - cls('PlentyofPenguins', 'plenty-of-penguins'), - cls('Puppets', 'puppets'), - cls('Putz', 'putz'), - cls('QuestionsForKids', 'questions-for-kids'), - cls('Rackafracka', 'rackafracka'), - cls('RegularCreatures', 'regular-creatures'), - cls('Risible', 'risible'), - cls('RogueSymmetry', 'rogue_symmetry'), - cls('Rosy', 'rosy'), - cls('Sabine', 'sabine'), - cls('SCAIRYTALESTheNotSoScaryFairyTales', 'Scairy-Tales:-the-not-so-scary-fairy-tales!'), - cls('SecondPrize', 'secondprize'), - cls('SincerelyBeatrice', 'sincerely-beatrice'), - cls('Skooled', 'skooled'), - cls('SNAFU', 'snafu'), - cls('SpaceNutz', 'space-nutz'), - cls('SPACESLUGS', 'spaceslugs'), - cls('SpaceTimeFunnies', 'spacetimefunnies'), - cls('Spectickles', 'abbotts-spectickles'), - cls('SpinCrazy', 'spin-crazy'), - cls('STEPDAD', 'stepdad'), - cls('Stookie', 'Stookie'), - cls('SuburbanWilderness', 'suburban-wilderness'), - cls('SuckerHeadSmack', 'suckerhead-smack'), - cls('TeacherInk', 'teacher-ink'), - cls('TheAdventuresofHeromanGuy', 'adventures-of-heroman-guy'), - cls('TheEdperiment', 'the-edperiment'), - cls('TheFamilyBlend', 'the-family-blend'), - cls('TheFruitBowl', 'thefruitbowl'), - cls('TheGoldenKid', 'golden-kid'), - cls('TheInsolentLemon', 'the-insolent-lemon'), - cls('TheLightedLab', 'the-lighted-lab'), - cls('TheLilMiesters', 'the-lil-miesters'), - cls('TheOdderLimits', 'the-odder-limits'), - cls('THESILVERLINING', 'silver-lining'), - cls('TheSingleDadDiaries', 'single-dad-diaries'), - cls('TheVernalPool', 'vernal-pool'), - cls('TheWinyChild', 'the-winy-child'), - cls('ThrompTM', 'thromp'), - cls('TnCComics', 'tnc-comics'), - cls('ToBeNamed', 'to-be-named'), cls('TonyAuth', 'tonyauth'), - cls('Toocrazy', 'too-crazy'), - cls('TwitchyOToole', 'twitchy-otoole'), - cls('TwoBits', 'two-bits'), - cls('Vernscartoons', 'vernscartoons'), - cls('WayOutInLeftField', 'Way-Out-In-Left-Field'), - cls('WelcometoFriendly', 'welcome-to-friendly'), - cls('WendlesLife', 'wendleslife'), - cls('Whatcatscanandcantdo', 'whatcatscanandcantdo'), - cls('Whiteouts', 'whiteouts'), - cls('WillSays', 'will-says'), - cls('WillyWho', 'willy-who'), - cls('WindingRoads', 'winding-roads'), - cls('WittOfWill', 'witt-of-will'), - cls('YouGuysAreMyFriendsTheComic', 'you-guys-are-my-friends'), # do not edit anything below since these entries are generated from # scripts/gocomics.py # START AUTOUPDATE - cls('060', '0-60'), cls('1AndDone', '1-and-done'), cls('2CowsAndAChicken', '2cowsandachicken'), cls('9ChickweedLane', '9chickweedlane'), cls('9To5', '9to5'), - cls('AaronGuile', 'aaron-guile'), - cls('ABitSketch', 'a-bit-sketch'), - cls('ABomb', 'a-bomb'), - cls('ACMEINKD', 'acme-inkd'), - cls('AcornPark', 'acorn-park'), cls('AdamAtHome', 'adamathome'), cls('AdultChildren', 'adult-children'), - cls('Adulting', 'adulting'), cls('Agnes', 'agnes'), cls('AJAndMagnus', 'aj-and-magnus'), cls('AlisHouse', 'alis-house'), - cls('AlisonWard', 'alison-ward'), cls('AlleyOop', 'alley-oop'), - cls('AllInGoodTime', 'all-in-good-time'), cls('AmandaTheGreat', 'amanda-the-great'), cls('Andertoons', 'andertoons'), - cls('AndNow', 'and-now'), cls('AndyCapp', 'andycapp'), - cls('Anecdote', 'anecdote'), cls('AngryLittleGirls', 'angry-little-girls'), cls('AnimalCrackers', 'animalcrackers'), - cls('AnimalMitchell', 'animal-mitchell'), - cls('AnneAndPythagoras', 'anne-and-pythagoras'), cls('Annie', 'annie'), - cls('AppleCreekComics', 'apple-creek'), cls('ArloAndJanis', 'arloandjanis'), cls('AskACat', 'ask-a-cat'), cls('AskShagg', 'askshagg'), - cls('ATasteOfTimes', 'a-taste-of-times'), cls('AtTavicat', 'tavicat'), cls('AtTheZoo', 'at-the-zoo'), cls('AuntyAcid', 'aunty-acid'), @@ -249,28 +80,23 @@ class GoComics(_ParserScraper): cls('BadMachinery', 'bad-machinery'), cls('BadReporter', 'badreporter'), cls('Baldo', 'baldo'), - cls('BaldoEnEspaol', 'espanol/baldoespanol', 'es'), + cls('BaldoEnEspanol', 'baldoespanol', 'es'), cls('BallardStreet', 'ballardstreet'), cls('BananaTriangle', 'banana-triangle'), cls('BarkeaterLake', 'barkeaterlake'), cls('BarneyAndClyde', 'barneyandclyde'), cls('BasicInstructions', 'basicinstructions'), - cls('BatchRejection', 'batch-rejection'), - cls('Bazoobee', 'bazoobee'), cls('BC', 'bc'), cls('BeanieTheBrownie', 'beanie-the-brownie'), cls('Beardo', 'beardo'), - cls('BeMisery', 'bemisery'), cls('Ben', 'ben'), - cls('BeneathTheFerns', 'beneath-the-ferns'), - cls('BenitinYEneas', 'espanol/muttandjeffespanol', 'es'), + cls('BenitinYEneas', 'muttandjeffespanol', 'es'), cls('BentObjects', 'bent-objects'), cls('BergerAndWyse', 'berger-and-wyse'), cls('BerkeleyMews', 'berkeley-mews'), cls('Betty', 'betty'), cls('Bewley', 'bewley'), cls('BiffAndRiley', 'biff-and-riley'), - cls('BigJim', 'bigjim'), cls('BigNate', 'bignate'), cls('BigNateFirstClass', 'big-nate-first-class'), cls('BigTop', 'bigtop'), @@ -280,41 +106,30 @@ class GoComics(_ParserScraper): cls('Bliss', 'bliss'), cls('BloomCounty', 'bloomcounty'), cls('BloomCounty2016', 'bloom-county'), - cls('Bluebonnets', 'cowsandstuff'), - cls('BlueSkiesToons', 'blue-skies-toons'), cls('BobGorrell', 'bobgorrell'), cls('BobTheSquirrel', 'bobthesquirrel'), - cls('BoltsAndNuts', 'bolts-and-nuts'), cls('BoNanas', 'bonanas'), cls('Boomerangs', 'boomerangs'), - cls('Bork', 'bork'), - cls('BottAuto', 'bott-auto'), cls('Bottomliners', 'bottomliners'), cls('BoundAndGagged', 'boundandgagged'), cls('BrainSquirts', 'brain-squirts'), cls('BreakingCatNews', 'breaking-cat-news'), cls('BreakOfDay', 'break-of-day'), - cls('Brevity', 'brevity'), + cls('Brevity', 'brevitypanel'), cls('BrewsterRockit', 'brewsterrockit'), cls('BrianMcFadden', 'brian-mcfadden'), cls('BroomHilda', 'broomhilda'), cls('Bully', 'bully'), cls('Buni', 'buni'), - cls('BUNS', 'buns'), - cls('Bushscrubs', 'bushscrubs'), cls('BushyTales', 'bushy-tales'), - cls('CAFFEINATED', 'CAFFEINATED'), cls('CalvinAndHobbes', 'calvinandhobbes'), - cls('CalvinAndHobbesEnEspaol', 'espanol/calvinandhobbesespanol', 'es'), - cls('CandacenCompany', 'candace-n-company'), + cls('CalvinAndHobbesEnEspanol', 'calvinandhobbesespanol', 'es'), cls('Candorville', 'candorville'), - cls('CapsulasMedicas', 'espanol/capsulas-medicas', 'es'), - cls('CarteBlanche', 'carte-blanche'), + cls('CapsulasMedicas', 'capsulas-medicas%20', 'es'), cls('Cathy', 'cathy'), cls('CattitudeDoggonit', 'cattitude-doggonit'), cls('CestLaVie', 'cestlavie'), cls('ChanLowe', 'chanlowe'), - cls('CharmysArmy', 'charmys-army'), cls('CheapThrillsCuisine', 'cheap-thrills-cuisine'), cls('ChipBok', 'chipbok'), cls('ChrisBritt', 'chrisbritt'), @@ -325,76 +140,55 @@ class GoComics(_ParserScraper): cls('ClayJones', 'clayjones'), cls('ClearBlueWater', 'clearbluewater'), cls('Cleats', 'cleats'), - cls('CleoAndCompany', 'cleo-and-company'), cls('CloseToHome', 'closetohome'), cls('Committed', 'committed'), cls('Computoon', 'compu-toon'), cls('ConnieToTheWonnie', 'connie-to-the-wonnie'), cls('Cornered', 'cornered'), - cls('CourageousManAdventures', 'courageous-man-adventures'), cls('CowAndBoyClassics', 'cowandboy'), cls('CowTown', 'cowtown'), cls('Crumb', 'crumb'), cls('CulDeSac', 'culdesac'), cls('DaddingBadly', 'dadding-badly'), cls('DaddysHome', 'daddyshome'), - cls('DadsDay', 'dads-day'), cls('DanaSummers', 'danasummers'), cls('DanWasserman', 'danwasserman'), cls('DarkSideOfTheHorse', 'darksideofthehorse'), cls('DarrinBell', 'darrin-bell'), - cls('DBCartoons', 'db-cartoons'), cls('DeepDarkFears', 'deep-dark-fears'), - cls('DevinCraneComicStripGhostwriter', 'devincranecomicstripghostwriter'), cls('DiamondLil', 'diamondlil'), cls('DickTracy', 'dicktracy'), cls('DilbertClassics', 'dilbert-classics'), - cls('DilbertEnEspaol', 'espanol/dilbert-en-espanol', 'es'), + cls('DilbertEnEspanol', 'dilbert-en-espanol', 'es'), cls('DinosaurComics', 'dinosaur-comics'), cls('DogEatDoug', 'dogeatdoug'), - cls('DoghouseInYourSoul', 'doghouse-in-your-soul'), cls('DogsOfCKennel', 'dogsofckennel'), cls('DomesticAbuse', 'domesticabuse'), - cls('DonBrutus', 'espanol/don-brutus', 'es'), - cls('DontPickTheFlowers', 'dont-pick-the-flowers'), + cls('DonBrutus', 'don-brutus', 'es'), + cls('DoodleForFood', 'doodle-for-food'), cls('DoodleTown', 'doodle-town'), cls('Doonesbury', 'doonesbury'), cls('DorrisMcComics', 'dorris-mccomics'), cls('Drabble', 'drabble'), - cls('Dragin', 'dragin'), cls('DragonGirl', 'dragon-girl'), cls('DrewSheneman', 'drewsheneman'), cls('Drive', 'drive'), cls('Dromo', 'dro-mo'), - cls('DrWhiskers', 'dr-whiskers'), cls('DudeAndDude', 'dudedude'), - cls('DumbQuestionBadAnswer', 'dumb-question-bad-answer'), - cls('DungeonHordes', 'dungeon-hordes'), - cls('DustSpecks', 'dust-specks'), - cls('DutchnPals', 'dutch-n-pals'), - cls('Dysconnected', 'dysconnected'), - cls('Econogirl', 'econogirl'), cls('EdgeCity', 'edge-city'), cls('EdgeOfAdventure', 'edge-of-adventure'), cls('Eek', 'eek'), - cls('EightballEyeball', 'eightball-eyeball'), - cls('ElCafDePoncho', 'espanol/poochcafeespanol', 'es'), - cls('Elmo', 'elmo'), + cls('ElCafDePoncho', 'el-cafe-de-poncho', 'es'), cls('EmmyLou', 'emmy-lou'), - cls('Endangered', 'endangered'), cls('Endtown', 'endtown'), cls('EricTheCircle', 'eric-the-circle'), cls('EverydayPeopleCartoons', 'everyday-people-cartoons'), cls('Eyebeam', 'eyebeam'), cls('FacesOfTheNewsByKerryWaghorn', 'facesinthenews'), cls('FamilyTree', 'familytree'), - cls('FamousAndNotSoFamousQuotes', 'famous-and-not-so-famous-quotes'), cls('Farcus', 'farcus'), - cls('FarOut', 'far-out'), cls('FatCats', 'fat-cats'), - cls('FatherOfTheBrood', 'father-of-the-brood'), cls('FloAndFriends', 'floandfriends'), - cls('FloydAndTony', 'floyd-and-tony'), cls('FMinus', 'fminus'), cls('FoolishMortals', 'foolish-mortals'), cls('ForBetterOrForWorse', 'forbetterorforworse'), @@ -404,28 +198,25 @@ class GoComics(_ParserScraper): cls('FowlLanguage', 'fowl-language'), cls('FoxTrot', 'foxtrot'), cls('FoxTrotClassics', 'foxtrotclassics'), - cls('FoxTrotEnEspaol', 'espanol/foxtrotespanol', 'es'), + cls('FoxTrotEnEspanol', 'foxtrotespanol', 'es'), cls('Francis', 'francis'), cls('FrankAndErnest', 'frank-and-ernest'), - cls('FrankAndSteinway', 'frank-and-steinway'), cls('FrankieComics', 'frankie-comics'), cls('Frazz', 'frazz'), cls('FredBasset', 'fredbasset'), - cls('FredBassetEnEspaol', 'espanol/fredbassetespanol', 'es'), + cls('FredBassetEnEspanol', 'fredbassetespanol', 'es'), cls('FreeRange', 'freerange'), cls('FreshlySqueezed', 'freshlysqueezed'), - cls('FriedCritter', 'fried-critter'), cls('FrogApplause', 'frogapplause'), cls('FromTheMoWillemsSketchbook', 'from-the-mo-willems-sketchbook'), - cls('GarciaCartoonCo', 'garcia-cartoon-co'), cls('Garfield', 'garfield'), cls('GarfieldClassics', 'garfield-classics'), - cls('GarfieldEnEspaol', 'espanol/garfieldespanol', 'es'), + cls('GarfieldEnEspanol', 'garfieldespanol%20', 'es'), cls('GarfieldMinusGarfield', 'garfieldminusgarfield'), cls('GaryMarkstein', 'garymarkstein'), cls('GaryVarvel', 'garyvarvel'), cls('GasolineAlley', 'gasolinealley'), - cls('Gaturro', 'espanol/gaturro', 'es'), + cls('Gaturro', 'gaturro', 'es'), cls('Geech', 'geech'), cls('GentleCreatures', 'gentle-creatures'), cls('GetALife', 'getalife'), @@ -433,8 +224,7 @@ class GoComics(_ParserScraper): cls('Gil', 'gil'), cls('GilThorp', 'gilthorp'), cls('GingerMeggs', 'gingermeggs'), - cls('GingerMeggsEnEspaol', 'espanol/gingermeggsespanol', 'es'), - cls('GIRTH', 'girth'), + cls('GingerMeggsEnEspanol', 'gingermeggsespanol%20', 'es'), cls('GlasbergenCartoons', 'glasbergen-cartoons'), cls('GlennMcCoy', 'glennmccoy'), cls('GManWebcomics', 'g-man-webcomics'), @@ -443,52 +233,35 @@ class GoComics(_ParserScraper): cls('GoComicsFanArt', 'fan-art'), cls('Graffiti', 'graffiti'), cls('GrandAvenue', 'grand-avenue'), - cls('GrandmaSnoops', 'grandmasnoops'), - cls('GrannyAnny', 'granny-anny'), - cls('Gravy', 'gravy'), cls('GrayMatters', 'gray-matters'), cls('GreenHumour', 'green-humour'), - cls('GreenPieces', 'green-pieces'), - cls('GunstonStreet', 'gunston-street'), cls('HaikuEwe', 'haikuewe'), cls('HalfFull', 'half-full'), - cls('HalfFullEnEspaol', 'espanol/half-full-espanol', 'es'), - cls('HallEditorialCartoons', 'hall-editorial-cartoons'), - cls('HaloAndHorns', 'no-place-like-holmes'), + cls('HalfFullEnEspanol', 'half-full-espanol', 'es'), cls('HamShears', 'ham-shears'), - cls('HaphazardHumor', 'haphazard-humor'), - cls('Headcheese', 'headcheese'), cls('HealthCapsules', 'healthcapsules'), cls('HeartOfTheCity', 'heartofthecity'), cls('Heathcliff', 'heathcliff'), - cls('HeathcliffEnEspaol', 'espanol/heathcliffespanol', 'es'), + cls('HeathcliffEnEspanol', 'heathcliffespanol', 'es'), cls('HenryPayne', 'henrypayne'), cls('HerbAndJamaal', 'herbandjamaal'), cls('Herman', 'herman'), - cls('HermanEnEspaol', 'espanol/herman-en-espanol', 'es'), + cls('HermanEnEspanol', 'herman-en-espanol', 'es'), cls('HipsterPicnic', 'hipster-picnic'), - cls('Hogwashed', 'hogwashed'), cls('HomeAndAway', 'homeandaway'), - cls('HomeLife', 'home-life'), cls('HotComicsForCoolPeople', 'hot-comics-for-cool-people'), - cls('Hubbel', 'hubbel'), cls('HUBRIS', 'hubris'), - cls('HugoComics', 'hugo-comics'), cls('HumanCull', 'human-cull'), - cls('HurrieTheMisManager', 'hurrie'), - cls('HuskyTales', 'husky-tales'), cls('HutchOwen', 'hutch-owen'), cls('ImagineThis', 'imaginethis'), cls('InheritTheMirth', 'inherit-the-mirth'), cls('InkPen', 'inkpen'), - cls('InkwellForest', 'inkwell-forest'), + cls('InSecurity', 'in-security'), cls('InspectorDangersCrimeQuiz', 'inspector-dangers-crime-quiz'), cls('InTheBleachers', 'inthebleachers'), cls('InTheSticks', 'inthesticks'), cls('InvisibleBread', 'invisible-bread'), - cls('IronyOr', 'irony-or'), cls('ItsAllAboutYou', 'itsallaboutyou'), - cls('ItsJustJim', 'its-just-jim'), cls('JackOhman', 'jackohman'), cls('JanesWorld', 'janesworld'), cls('JeffDanziger', 'jeffdanziger'), @@ -503,12 +276,9 @@ class GoComics(_ParserScraper): cls('JoelPett', 'joelpett'), cls('JoeVanilla', 'joevanilla'), cls('JohnDeering', 'johndeering'), - cls('JolleyStuffBrowser', 'jolleystuff-browser'), cls('JumpStart', 'jumpstart'), - cls('JustoYFranco', 'espanol/justo-y-franco', 'es'), + cls('JustoYFranco', 'justo-y-franco', 'es'), cls('JustSayUncle', 'just-say-uncle'), - cls('KALEECHIKORNERS', 'kaleechi-korners'), - cls('KartoonsByKline', 'kartoons-by-kline'), cls('KenCatalino', 'kencatalino'), cls('KevinKallaugher', 'kevinkallaugher'), cls('KidBeowulf', 'kid-beowulf'), @@ -516,16 +286,15 @@ class GoComics(_ParserScraper): cls('KidSpot', 'kidspot'), cls('KidTown', 'kidtown'), cls('KitchenCapers', 'kitchen-capers'), - cls('KitNCarlyle', 'kitandcarlyle'), + cls('KitNCarlyle', 'kitncarlyle'), cls('Kliban', 'kliban'), cls('KlibansCats', 'klibans-cats'), cls('LaCucaracha', 'lacucaracha'), - cls('LaCucarachaEnEspaol', 'espanol/la-cucaracha-en-espanol', 'es'), - cls('LaffToons', 'lafftoons'), + cls('LaCucarachaEnEspanol', 'la-cucaracha-en-espanol', 'es'), cls('LaloAlcaraz', 'laloalcaraz'), - cls('LaloAlcarazEnEspaol', 'espanol/laloenespanol', 'es'), + cls('LaloAlcarazEnEspanol', 'laloenespanol', 'es'), cls('LardsWorldPeaceTips', 'lards-world-peace-tips'), - cls('LasHermanasStone', 'espanol/stonesoup_espanol', 'es'), + cls('LasHermanasStone', 'stonesoup_espanol', 'es'), cls('LastKiss', 'lastkiss'), cls('LayLines', 'lay-lines'), cls('LearnToSpeakCat', 'learn-to-speak-cat'), @@ -533,41 +302,33 @@ class GoComics(_ParserScraper): cls('LeighLunaComics', 'leigh-luna-comics'), cls('LibertyMeadows', 'libertymeadows'), cls('LilAbner', 'lil-abner'), - cls('LiliAndDerek', 'lili-and-derek'), - cls('LilleysSillies', 'lilleys-sillies'), - cls('LimboRoad', 'limbo-road'), cls('Lio', 'lio'), - cls('LioEnEspaol', 'espanol/lioespanol', 'es'), + cls('LioEnEspanol', 'lioespanol', 'es'), cls('LisaBenson', 'lisabenson'), cls('LittleDogLost', 'littledoglost'), cls('LittleFriedChickenAndSushi', 'little-fried-chicken-and-sushi'), cls('LittleNemo', 'little-nemo'), cls('Lola', 'lola'), - cls('LolaEnEspaol', 'espanol/lola-en-espanol', 'es'), + cls('LolaEnEspanol', 'lola-en-espanol', 'es'), cls('LooksGoodOnPaper', 'looks-good-on-paper'), - cls('Loose', 'loose'), cls('LooseParts', 'looseparts'), - cls('LosOsorios', 'espanol/los-osorios', 'es'), + cls('LosOsorios', 'los-osorios', 'es'), cls('LostSheep', 'lostsheep'), cls('LostSideOfSuburbia', 'lostsideofsuburbia'), cls('Luann', 'luann'), cls('LuannAgainn', 'luann-againn'), - cls('LuannEnEspaol', 'espanol/luannspanish', 'es'), - cls('Lucan', 'lucan'), + cls('LuannEnEspanol', 'luannspanish', 'es'), cls('LuckyCow', 'luckycow'), cls('LugNuts', 'lug-nuts'), - cls('LumAndAbner', 'lum-and-abner'), cls('Lunarbaboon', 'lunarbaboon'), - cls('MadDogGhettoCop', 'maddogghettocop'), cls('MagicInAMinute', 'magicinaminute'), cls('Magnificatz', 'magnificatz'), cls('Maintaining', 'maintaining'), cls('MakingIt', 'making-it'), cls('MariasDay', 'marias-day'), cls('Marmaduke', 'marmaduke'), - cls('MarmadukeEnEspaol', 'espanol/marmaduke-en-espanol', 'es'), + cls('MarmadukeEnEspanol', 'marmaduke-en-espanol', 'es'), cls('MarshallRamsey', 'marshallramsey'), - cls('MarysNature', 'marys-nature'), cls('MattBors', 'matt-bors'), cls('MattDavies', 'mattdavies'), cls('MattWuerker', 'mattwuerker'), @@ -579,99 +340,68 @@ class GoComics(_ParserScraper): cls('MikeDuJour', 'mike-du-jour'), cls('MikeLester', 'mike-lester'), cls('MikeLuckovich', 'mikeluckovich'), - cls('Millennialville', 'millennialville'), - cls('Milton50', 'milton-5-0'), - cls('Mindframe', 'mindframe'), - cls('Minihahas', 'vernscartoons'), cls('MinimumSecurity', 'minimumsecurity'), - cls('MiscSoup', 'misc-soup'), - cls('MisterAndMe', 'mister-and-me'), - cls('MockAll', 'mock-all'), cls('ModeratelyConfused', 'moderately-confused'), cls('Molebashed', 'molebashed'), cls('MollyAndTheBear', 'mollyandthebear'), cls('Momma', 'momma'), cls('MomsCancer', 'moms-cancer'), - cls('Mongrels', 'mongrels'), cls('Monty', 'monty'), - cls('MontyDiaros', 'espanol/monty-diarios', 'es'), - cls('MortsIsland', 'noahs-island'), + cls('MontyDiaros', 'monty-diaros', 'es'), cls('MotleyClassics', 'motley-classics'), cls('MrLowe', 'mr-lowe'), cls('Mulligan', 'mulligan'), cls('MustardAndBoloney', 'mustard-and-boloney'), cls('MuttAndJeff', 'muttandjeff'), cls('MyCageNewAndOld', 'mycage'), - cls('MySonIsADog', 'my-son-is-a-dog'), cls('MythTickle', 'mythtickle'), cls('Nancy', 'nancy'), cls('NancyClassics', 'nancy-classics'), - cls('NateElGrande', 'espanol/nate-el-grande', 'es'), - cls('NavyBean', 'navybean'), - cls('NedAndLarry', 'ned-and-larry'), + cls('NateElGrande', 'nate-el-grande', 'es'), cls('NestHeads', 'nestheads'), cls('NEUROTICA', 'neurotica'), cls('NewAdventuresOfQueenVictoria', 'thenewadventuresofqueenvictoria'), cls('NextDoorNeighbors', 'next-door-neighbors'), cls('NickAnderson', 'nickanderson'), cls('NickAndZuzu', 'nick-and-zuzu'), - cls('NoAmbiguity', 'no-ambiguity'), - cls('NoBusinessIKnow', 'nobusinessiknow'), cls('NonSequitur', 'nonsequitur'), - cls('NoOrdinaryLife', 'no-ordinary-life'), cls('NothingIsNotSomething', 'nothing-is-not-something'), cls('NotInventedHere', 'not-invented-here'), cls('NowRecharging', 'now-recharging'), - cls('Npchumorcom', 'npchumor'), cls('OffTheMark', 'offthemark'), cls('OhBrother', 'oh-brother'), cls('OllieAndQuentin', 'ollie-and-quentin'), cls('OnAClaireDay', 'onaclaireday'), cls('OneBigHappy', 'onebighappy'), - cls('OneFunnyGoldenRetriever', 'one-funny-golden-retriever'), - cls('ONIONAndPEA', 'onion-and-pea'), cls('OrdinaryBill', 'ordinary-bill'), cls('OriginsOfTheSundayComics', 'origins-of-the-sunday-comics'), - cls('OscarAndAnnie', 'oscar-and-annie'), cls('OutOfTheGenePoolReRuns', 'outofthegenepool'), cls('Overboard', 'overboard'), - cls('OverboardEnEspaol', 'espanol/overboardespanol', 'es'), - cls('OverQuirked', 'over-quirked'), + cls('OverboardEnEspanol', 'overboardespanol', 'es'), cls('OverTheHedge', 'overthehedge'), cls('Owlturd', 'owlturd'), cls('OzyAndMillie', 'ozy-and-millie'), - cls('PaddedCell', 'padded-cell'), - cls('Painterly', 'sparcomics'), - cls('PalAndBuddy', 'pal-and-buddy'), cls('PatOliphant', 'patoliphant'), cls('PaulSzep', 'paulszep'), - cls('PawsForThoughtComics', 'paws-for-thought-comics'), cls('PCAndPixel', 'pcandpixel'), cls('Peanuts', 'peanuts'), cls('PeanutsBegins', 'peanuts-begins'), - cls('PeanutsEnEspaol', 'espanol/peanuts-espanol', 'es'), + cls('PeanutsEnEspanol', 'peanuts-espanol', 'es'), + cls('PeanutsHolidayCountdown', 'peanuts-holiday-countdown'), cls('PearlsBeforeSwine', 'pearlsbeforeswine'), - cls('Peeples', 'peeples'), - cls('PeopleOfEarth', 'frankblunt'), - cls('Periquita', 'espanol/periquita', 'es'), - cls('PerlasParaLosCerdos', 'espanol/perlas-para-los-cerdos', 'es'), + cls('Periquita', 'periquita', 'es'), + cls('PerlasParaLosCerdos', 'perlas-para-los-cerdos', 'es'), cls('PerryBibleFellowship', 'perry-bible-fellowship'), cls('PhilHands', 'phil-hands'), cls('PhoebeAndHerUnicorn', 'phoebe-and-her-unicorn'), cls('Pibgorn', 'pibgorn'), cls('PibgornSketches', 'pibgornsketches'), cls('Pickles', 'pickles'), - cls('PicpakDog', 'picpak-dog'), cls('PicturesInBoxes', 'pictures-in-boxes'), cls('PieComic', 'pie-comic'), cls('Pinkerton', 'pinkerton'), - cls('PirateMike', 'pirate-mike'), - cls('PlanB', 'planb'), cls('PleaseListenToMe', 'please-listen-to-me'), cls('Pluggers', 'pluggers'), - cls('PoliceLimit', 'policelimit'), - cls('PoliticallyMad', 'politically-mad'), - cls('PoliticularJokesAndRuffus', 'politcular-jokes-and-ruffas'), cls('PoochCafe', 'poochcafe'), cls('Poorcraft', 'poorcraft'), cls('PoorlyDrawnLines', 'poorly-drawn-lines'), @@ -680,13 +410,8 @@ class GoComics(_ParserScraper): cls('PotShots', 'pot-shots'), cls('PreTeena', 'preteena'), cls('PricklyCity', 'pricklycity'), - cls('Prideland', 'prideland'), - cls('PrimusTheBadPhilosopher', 'primus-the-bad-philosopher'), - cls('ProfessorHerbertAndGEO', 'professor-herbert-and-geo'), cls('PromisesPromises', 'promises-promises'), - cls('QueenBlackbeard', 'queen-blackbeard'), cls('QuestionableQuotebook', 'questionable-quotebook'), - cls('QuickDraw', 'quickdraw'), cls('RabbitsAgainstMagic', 'rabbitsagainstmagic'), cls('RaisingDuncan', 'raising-duncan'), cls('RandolphItch2Am', 'randolphitch'), @@ -698,62 +423,42 @@ class GoComics(_ParserScraper): cls('ReplyAll', 'replyall'), cls('ReplyAllLite', 'reply-all-lite'), cls('RichardsPoorAlmanac', 'richards-poor-almanac'), - cls('Ringers', 'ringers'), cls('RipHaywire', 'riphaywire'), cls('RipleysBelieveItOrNot', 'ripleysbelieveitornot'), - cls('RipleysBelieveItOrNotSpanish', 'espanol/ripleys-en-espanol', 'es'), + cls('RipleysBelieveItOrNotSpanish', 'ripleys-en-espanol', 'es'), cls('RobbieAndBobby', 'robbie-and-bobby'), cls('RobertAriail', 'robert-ariail'), cls('RobRogers', 'robrogers'), - cls('RonWarren', 'ron-warren'), - cls('RosaDominical', 'espanol/rosa-dominical', 'es'), + cls('RosaDominical', 'rosa-dominical', 'es'), cls('RoseIsRose', 'roseisrose'), cls('Rubes', 'rubes'), cls('RudyPark', 'rudypark'), - cls('Rufus', 'rufus'), - cls('SandSharkBeach', 'sandshark-beach'), cls('SarahsScribbles', 'sarahs-scribbles'), + cls('SaturdayMorningBreakfastCereal', 'saturday-morning-breakfast-cereal'), cls('SavageChickens', 'savage-chickens'), cls('ScaryGary', 'scarygary'), cls('ScenesFromAMultiverse', 'scenes-from-a-multiverse'), cls('ScottStantis', 'scottstantis'), - cls('SharpCurveComics', 'sharp-curve-comics'), cls('Sheldon', 'sheldon'), - cls('SherpaAid', 'sherpaaid'), cls('ShirleyAndSonClassics', 'shirley-and-son-classics'), cls('Shoe', 'shoe'), cls('Shoecabbage', 'shoecabbage'), cls('Shortcuts', 'shortcuts'), cls('ShutterbugFollies', 'shutterbug-follies'), cls('SigneWilkinson', 'signewilkinson'), - cls('SignGarden', 'signgarden'), - cls('SignsOfAFrustratedGolfer', 'signs-of-a-frustrated-golfer'), cls('SketchsharkComics', 'sketchshark-comics'), cls('SketchyChics', 'sketchy-chics'), cls('SkinHorse', 'skinhorse'), cls('Skippy', 'skippy'), - cls('Skull', 'skull'), - cls('Skylarking', 'skylarking'), - cls('SleepytownBeagles', 'sleepytown-beagles'), - cls('SmallNerdyCreatures', 'small-nerdy-creatures'), - cls('Smith', 'smith'), - cls('Snootle', 'snootle'), + cls('SmallPotatoes', 'small-potatoes'), cls('Snowflakes', 'snowflakes'), cls('SnowSez', 'snow-sez'), - cls('SoccerDude', 'soccer-dude'), - cls('SoccerEarth', 'soccer-earth'), - cls('SOD', 'sod'), - cls('SomethingAboutCeleste', 'something-about-celeste'), - cls('SookyRottweiler', 'sooky-rottweiler'), cls('Soulmates', 'soulmates'), cls('SoupToNutz', 'soup-to-nutz'), - cls('Spaceport51', 'spaceport-51'), cls('Speechless', 'speechless'), cls('SpeedBump', 'speedbump'), - cls('SportsByVoort', 'sports-by-voort'), + cls('SpiritOfTheStaircase', 'spirit-of-the-staircase'), cls('SpotTheFrog', 'spot-the-frog'), - cls('StaleCrackers', 'clifton'), - cls('StankoAndTibor', 'stankotibor'), cls('Starling', 'starling'), cls('Starslip', 'starslip'), cls('SteveBenson', 'stevebenson'), @@ -764,19 +469,15 @@ class GoComics(_ParserScraper): cls('StoneSoupClassics', 'stone-soup-classics'), cls('StrangeBrew', 'strangebrew'), cls('StuartCarlson', 'stuartcarlson'), - cls('SubSub', 'subsub'), - cls('SuburbanFairyTales', 'suburban-fairy-tales'), - cls('SUITSANDGUARDERS', 'suits-and-guarders'), cls('SunnyStreet', 'sunny-street'), cls('SunshineState', 'sunshine-state'), cls('SuperFunPakComix', 'super-fun-pak-comix'), - cls('SuperSiblings', 'super-siblings'), cls('SweetAndSourPork', 'sweet-and-sour-pork'), cls('Sylvia', 'sylvia'), cls('TankMcNamara', 'tankmcnamara'), cls('Tarzan', 'tarzan'), - cls('TarzanEnEspaol', 'espanol/tarzan-en-espanol', 'es'), - cls('TedRall', 'tedrall'), + cls('TarzanEnEspanol', 'tarzan-en-espanol', 'es'), + cls('TedRall', 'ted-rall'), cls('TenCats', 'ten-cats'), cls('Thatababy', 'thatababy'), cls('ThatIsPriceless', 'that-is-priceless'), @@ -785,68 +486,47 @@ class GoComics(_ParserScraper): cls('ThatsLife', 'thats-life'), cls('TheAcademiaWaltz', 'academiawaltz'), cls('TheAdventuresOfBusinessCat', 'the-adventures-of-business-cat'), - cls('TheAngryGamer', 'the-angry-gamer'), cls('TheArgyleSweater', 'theargylesweater'), cls('TheAwkwardYeti', 'the-awkward-yeti'), cls('TheBarn', 'thebarn'), - cls('TheBeauforts', 'the-beauforts'), - cls('TheBellies', 'the-bellies'), cls('TheBentPinky', 'the-bent-pinky'), cls('TheBestMedicineCartoon', 'the-best-medicine'), cls('TheBigPicture', 'thebigpicture'), - cls('TheBoobiehatch', 'the-boobiehatch'), cls('TheBoondocks', 'boondocks'), cls('TheBornLoser', 'the-born-loser'), cls('TheBuckets', 'thebuckets'), - cls('TheCardinal', 'thecardinal'), cls('TheCity', 'thecity'), cls('TheComicStripThatHasAFinaleEveryDay', 'the-comic-strip-that-has-a-finale-every-day'), cls('TheConjurers', 'the-conjurers'), cls('TheCreeps', 'the-creeps'), cls('TheDailyDrawing', 'the-daily-drawing'), cls('TheDinetteSet', 'dinetteset'), - cls('TheDinkledorfs', 'the-dinkledorfs'), cls('TheDoozies', 'thedoozies'), cls('TheDuplex', 'duplex'), cls('TheElderberries', 'theelderberries'), - cls('TheEntrepiranha', 'the-entrepiranha'), - cls('TheFabulousBushPigs', 'the-fabulous-bush-pigs'), cls('TheFlyingMcCoys', 'theflyingmccoys'), cls('TheFuscoBrothers', 'thefuscobrothers'), cls('TheGentlemansArmchair', 'the-gentlemans-armchair'), - cls('TheGrayZone', 'the-gray-zone'), - cls('TheGreenMonkeys', 'thegreenmonkeys'), cls('TheGrizzwells', 'thegrizzwells'), cls('TheHumbleStumble', 'humble-stumble'), cls('TheKChronicles', 'thekchronicles'), cls('TheKnightLife', 'theknightlife'), cls('TheLeftyBoscoPictureShow', 'leftyboscopictureshow'), cls('TheLostBear', 'the-lost-bear'), - cls('TheMagicForest', 'the-magic-forest'), cls('TheMartianConfederacy', 'the-martian-confederacy'), cls('TheMeaningOfLila', 'meaningoflila'), cls('TheMiddletons', 'themiddletons'), - cls('TheMothManAndLarvaeBoy', 'the-mothman-and-larvae-boy'), - cls('TheMountainMen', 'the-mountain-men'), - cls('TheNeighborhood', 'the-neighborhood'), - cls('TheNevilleYouKnow', 'the-neville-you-know'), - cls('TheNonsenseNewz', 'the-nonsense-newz'), cls('TheNorm40', 'the-norm-4-0'), cls('TheNormClassics', 'thenorm'), - cls('TheOldManAndHisDog', 'old-man-and-his-dog'), cls('TheOtherCoast', 'theothercoast'), cls('TheOtherEnd', 'the-other-end'), - cls('TheQuinnAndFinnShow', 'quinn-and-finn'), cls('TheQuixoteSyndrome', 'the-quixote-syndrome'), - cls('TheRocks', 'the-rocks'), cls('TheSunshineClub', 'the-sunshine-club'), - cls('TheUnemployed', 'the-unemployed'), - cls('TheWagesOfSindy', 'the-wages-of-sindy'), + cls('TheUpsideDownWorldOfGustaveVerbeek', 'upside-down-world-of-gustave-verbeek'), cls('TheWanderingMelon', 'the-wandering-melon'), - cls('TheWizardOfIdSpanish', 'espanol/wizardofidespanol', 'es'), + cls('TheWizardOfIdSpanish', 'wizardofidespanol', 'es'), cls('TheWorriedWell', 'the-worried-well'), cls('TheWorstThingIveEverDone', 'the-worst-thing-ive-ever-done'), - cls('Thingsesque', 'thingsesque'), cls('think', 'think'), cls('ThinLines', 'thinlines'), cls('TimEagan', 'tim-eagan'), @@ -854,27 +534,19 @@ class GoComics(_ParserScraper): cls('TinySepuku', 'tinysepuku'), cls('TOBY', 'toby'), cls('TodaysDogg', 'todays-dogg'), - cls('TodaysTrump', 'todays-trump'), cls('TomTheDancingBug', 'tomthedancingbug'), cls('TomToles', 'tomtoles'), cls('TooMuchCoffeeMan', 'toomuchcoffeeman'), - cls('TopicToons', 'topictoons'), cls('ToughTown', 'tough-town'), - cls('ToxicValues', 'toxic-values'), cls('Trivquiz', 'trivquiz'), - cls('Trucutu', 'espanol/trucutu', 'es'), - cls('TruthBeKnown', 'truth-be-known'), + cls('Trucutu', 'trucutu', 'es'), cls('TruthFacts', 'truth-facts'), - cls('TuesdaysWithCory', 'tuesdays-with-cory'), - cls('Tutelandia', 'espanol/tutelandia', 'es'), + cls('Tutelandia', 'tutelandia', 'es'), cls('UncleArtsFunland', 'uncleartsfunland'), - cls('Underdone', 'underdone'), cls('UnderstandingChaos', 'understanding-chaos'), - cls('UnMannerlyWays', 'mannerly-ways'), cls('UnstrangePhenomena', 'unstrange-phenomena'), cls('UpAndOut', 'up-and-out'), cls('USAcres', 'us-acres'), - cls('ViewFromTheCouch', 'view-from-the-couch'), cls('ViewsAfrica', 'viewsafrica'), cls('ViewsAmerica', 'viewsamerica'), cls('ViewsAsia', 'viewsasia'), @@ -884,22 +556,16 @@ class GoComics(_ParserScraper): cls('ViewsMidEast', 'viewsmideast'), cls('ViewsOfTheWorld', 'viewsoftheworld'), cls('ViiviAndWagner', 'viivi-and-wagner'), - cls('VoicesInTheDark', 'voices-in-the-dark'), cls('WallaceTheBrave', 'wallace-the-brave'), cls('WaltHandelsman', 'walthandelsman'), cls('Warped', 'warped'), - cls('WarpedAndDemented', 'warped-and-demented'), - cls('Waskataskahiskewaskewan', 'waskataskahiskewaskewan'), cls('WatchYourHead', 'watchyourhead'), cls('WaynoVision', 'waynovision'), - cls('WayOutComics', 'way-out-comics'), - cls('WeaselInk', 'weasel-ink'), cls('WeePals', 'weepals'), - cls('WhiskeyFalls', 'whiskey-falls'), + cls('WeTheRobots', 'we-the-robots'), cls('WickedCrispy', 'wicked-crispy'), cls('Widdershins', 'widdershins'), cls('WideOpen', 'wide-open'), - cls('Windsock', 'windsock'), cls('WinLoseDrew', 'drewlitton'), cls('Winston', 'winston'), cls('WitOfTheWorld', 'witoftheworld'), @@ -909,21 +575,16 @@ class GoComics(_ParserScraper): cls('WorkingDaze', 'working-daze'), cls('WorkingItOut', 'workingitout'), cls('WorldOfWonder', 'world-of-wonder'), - cls('WrobbertCartoons', 'wrobbertcartoons'), cls('WrongHands', 'wrong-hands'), cls('WTDuck', 'wtduck'), cls('WuMo', 'wumo'), - cls('WumoEnEspaol', 'espanol/wumoespanol', 'es'), + cls('WumoEnEspanol', 'wumoespanol', 'es'), cls('Wyatt', 'wyatt'), - cls('YennyEnEspaol', 'espanol/yennyespanol', 'es'), + cls('YennyEnEspanol', 'yennyespanol', 'es'), cls('YennyLopez', 'yenny-lopez'), - cls('YinYangster', 'yin-yangster'), cls('ZackHill', 'zackhill'), cls('ZenPencils', 'zen-pencils'), cls('Ziggy', 'ziggy'), - cls('ZiggyEnEspaol', 'espanol/ziggyespanol', 'es'), - cls('ZITO', 'zito'), - cls('ZombieHeights', 'zombie-heights'), - cls('Zootopia', 'zootopia'), + cls('ZiggyEnEspanol', 'ziggyespanol', 'es'), # END AUTOUPDATE ) diff --git a/scripts/gocomics.py b/scripts/gocomics.py index 244343e81..4f6431952 100755 --- a/scripts/gocomics.py +++ b/scripts/gocomics.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (C) 2004-2008 Tristan Seligmann and Jonathan Jacobs # Copyright (C) 2012-2014 Bastian Kleineidam -# Copyright (C) 2015-2016 Tobias Gruetzmacher +# Copyright (C) 2015-2017 Tobias Gruetzmacher """ Script to get a list of gocomics and save the info in a JSON file for further processing. @@ -15,46 +15,28 @@ from scriptutil import ComicListUpdater class GoComicsUpdater(ComicListUpdater): # names of comics to exclude excluded_comics = ( - # "coming soon" - "AngryProgrammer", - "Complex", - "Guinness", - "Jabberwoncky", - "Moments", - "Pi", - "RandysRationale", - "SignsOfOurTimes", - "TheGagwriter", - "Yaoyao", - - # duplicate - "Dilbert", - "SaturdayMorningBreakfastCereal", - - # not available - "BillyAndCo", - "BuffaloChips", - "Crawdiddy", + # too short + 'LukeyMcGarrysTLDR', ) - def handle_url(self, url): - """Parse one search result page.""" + def handle_gocomics(self, url, outercss='a.amu-media-item-link', lang=None): + """Parse one GoComics alphabetic page.""" data = self.get_url(url, expand=False) - for comiclink in data.cssselect('a.alpha_list'): + for comiclink in data.cssselect(outercss): link = comiclink.attrib['href'] - name = comiclink.text - self.add_comic(name, link) + name = comiclink.cssselect('h4')[0].text + self.add_comic(name, (link, lang)) def collect_results(self): """Parse all listing pages.""" - self.handle_url('http://www.gocomics.com/features') - self.handle_url('http://www.gocomics.com/explore/espanol') - self.handle_url('http://www.gocomics.com/explore/editorial_list') - self.handle_url('http://www.gocomics.com/explore/sherpa_list') + for part in ('a-b', 'c-e', 'f-i', 'j-n', 'o-r', 's-t', 'u-%23'): + self.handle_gocomics('http://www.gocomics.com/comics/a-to-z?page=' + part) + self.handle_gocomics('http://www.gocomics.com/comics/espanol', 'a.gc-card-item', 'es') - def get_entry(self, name, url): - langopt = ", 'es'" if 'espanol/' in url else '' + def get_entry(self, name, data): + url, lang = data + langopt = ", '%s'" % lang if lang else '' return u"cls('%s', '%s'%s)," % (name, url[1:], langopt)