uk_bin_collection 0.98.0__tar.gz → 0.98.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/PKG-INFO +1 -1
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/pyproject.toml +1 -1
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/input.json +1 -1
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BarnetCouncil.py +11 -2
- uk_bin_collection-0.98.2/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +147 -0
- uk_bin_collection-0.98.2/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +118 -0
- uk_bin_collection-0.98.0/uk_bin_collection/uk_bin_collection/councils/BexleyCouncil.py +0 -147
- uk_bin_collection-0.98.0/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py +0 -101
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/LICENSE +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/README.md +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/README.rst +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/council_feature_input_parity.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/features/environment.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/features/validate_council_outputs.feature +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/output.schema +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/step_defs/step_helpers/file_handler.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/step_defs/test_validate_council.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_collect_data.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_common_functions.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_conftest.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_get_data.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/collect_data.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/common.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/AdurAndWorthingCouncils.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ArmaghBanbridgeCraigavonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ArunCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/AylesburyValeCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BCPCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BarnsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BasildonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BasingstokeCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BathAndNorthEastSomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BedfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BedfordshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BelfastCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BirminghamCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BlackburnCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BoltonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BracknellForestCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BradfordMDC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BrightonandHoveCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BristolCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BromleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BroxtoweBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BuckinghamshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/BuryCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CalderdaleCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CannockChaseDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CardiffCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CastlepointDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CharnwoodBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChelmsfordCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CheshireEastCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CheshireWestAndChesterCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChichesterDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ChorleyCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ColchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ConwyCountyBorough.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CornwallCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CrawleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/CroydonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DacorumBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DartfordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DerbyshireDalesDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DoncasterCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DorsetCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DoverDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/DurhamCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EalingCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastDevonDC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastRenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastRidingCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EastleighBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ElmbridgeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EnfieldCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EnvironmentFirst.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/EppingForestDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ErewashBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FalkirkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FarehamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/FenlandDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ForestOfDeanDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GatesheadCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GedlingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GlasgowCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GloucesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/GuildfordCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HaltonBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HaringeyCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HarrogateBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HighPeakCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HighlandCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HounslowCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HullCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/HuntingdonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/IslingtonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KingstonUponThamesCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KirkleesCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/KnowsleyMBCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LancasterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LeedsCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LichfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LisburnCastlereaghCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LiverpoolCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughEaling.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHarrow.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughHounslow.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughLambeth.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/LondonBoroughRedbridge.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MaldonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MalvernHillsDC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ManchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MansfieldDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MertonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MidAndEastAntrimBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MidSussexDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/MiltonKeynesCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NeathPortTalbotCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewForestCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewarkAndSherwoodDC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewcastleCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewhamCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NewportCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthEastDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthEastLincs.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthLincolnshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthNorfolkDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthSomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthWestLeicestershire.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthYorkshire.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NorthumberlandCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/NottinghamCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/OldhamCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/PortsmouthCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/PrestonCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ReadingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ReigateAndBansteadBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RenfrewshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RhonddaCynonTaffCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RochdaleCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RochfordCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RotherhamCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RugbyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RushcliffeBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/RushmoorCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SalfordCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SevenoaksDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SheffieldCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ShropshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SolihullCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SomersetCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthAyrshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthCambridgeshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthDerbyshireDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthGloucestershireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SouthwarkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StAlbansCityAndDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StHelensBC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StaffordBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StaffordshireMoorlandsDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StockportBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StokeOnTrentCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StratfordUponAvonCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/StroudDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SunderlandCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SwaleBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/SwanseaCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TamesideMBCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TandridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TelfordAndWrekinCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TendringDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TestValleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ThreeRiversDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TonbridgeAndMallingBC.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TorbayCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/TorridgeDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/UttlesfordDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ValeofGlamorganCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/ValeofWhiteHorseCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WakefieldCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WalsallCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WalthamForest.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WarwickDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WaverleyBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WealdenDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WelhatCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestBerkshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestLindseyDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestLothianCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestMorlandAndFurness.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestNorthamptonshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WestSuffolkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WiganBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WiltshireCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WinchesterCityCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WindsorAndMaidenheadCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WirralCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WokingBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WokinghamBoroughCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WychavonDistrictCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/WyreCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/create_new_council.py +0 -0
- {uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/get_bin_data.py +0 -0
@@ -49,7 +49,7 @@
|
|
49
49
|
"wiki_name": "Barnsley Metropolitan Borough Council",
|
50
50
|
"wiki_note": "To get the UPRN, you will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search)."
|
51
51
|
},
|
52
|
-
"BasildonCouncil": {
|
52
|
+
"BasildonCouncil": {
|
53
53
|
"skip_get_url": true,
|
54
54
|
"uprn": "10013350430",
|
55
55
|
"url": "https://basildonportal.azurewebsites.net/api/getPropertyRefuseInformation",
|
@@ -70,10 +70,19 @@ class CouncilClass(AbstractGetBinDataClass):
|
|
70
70
|
headless = kwargs.get("headless")
|
71
71
|
web_driver = kwargs.get("web_driver")
|
72
72
|
driver = create_webdriver(web_driver, headless, None, __name__)
|
73
|
-
page = "https://
|
73
|
+
page = "https://www.barnet.gov.uk/recycling-and-waste/bin-collections/find-your-bin-collection-day"
|
74
|
+
|
74
75
|
driver.get(page)
|
75
76
|
|
76
|
-
|
77
|
+
# Wait for the element to be clickable
|
78
|
+
find_your_collection_button = WebDriverWait(driver, 10).until(
|
79
|
+
EC.element_to_be_clickable(
|
80
|
+
(By.XPATH, '//a[contains(text(), "Find your household collection day")]')
|
81
|
+
)
|
82
|
+
)
|
83
|
+
|
84
|
+
# Click the element
|
85
|
+
find_your_collection_button.click()
|
77
86
|
|
78
87
|
try:
|
79
88
|
accept_cookies = WebDriverWait(driver, timeout=10).until(
|
@@ -0,0 +1,147 @@
|
|
1
|
+
import time
|
2
|
+
from datetime import datetime
|
3
|
+
|
4
|
+
from bs4 import BeautifulSoup
|
5
|
+
from selenium.webdriver.common.by import By
|
6
|
+
from selenium.webdriver.common.keys import Keys
|
7
|
+
from selenium.webdriver.support import expected_conditions as EC
|
8
|
+
from selenium.webdriver.support.ui import Select
|
9
|
+
from selenium.webdriver.support.wait import WebDriverWait
|
10
|
+
|
11
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
12
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
13
|
+
|
14
|
+
# import the wonderful Beautiful Soup and the URL grabber
|
15
|
+
|
16
|
+
|
17
|
+
class CouncilClass(AbstractGetBinDataClass):
|
18
|
+
"""
|
19
|
+
Concrete classes have to implement all abstract operations of the
|
20
|
+
base class. They can also override some operations with a default
|
21
|
+
implementation.
|
22
|
+
"""
|
23
|
+
|
24
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
25
|
+
driver = None
|
26
|
+
try:
|
27
|
+
page = "https://waste.bexley.gov.uk/waste"
|
28
|
+
|
29
|
+
data = {"bins": []}
|
30
|
+
|
31
|
+
user_uprn = kwargs.get("uprn")
|
32
|
+
user_paon = kwargs.get("paon")
|
33
|
+
user_postcode = kwargs.get("postcode")
|
34
|
+
web_driver = kwargs.get("web_driver")
|
35
|
+
headless = kwargs.get("headless")
|
36
|
+
|
37
|
+
# Create Selenium webdriver
|
38
|
+
driver = create_webdriver(web_driver, headless, None, __name__)
|
39
|
+
driver.get(page)
|
40
|
+
|
41
|
+
wait = WebDriverWait(driver, 10)
|
42
|
+
|
43
|
+
inputElement_postcodesearch = wait.until(
|
44
|
+
EC.element_to_be_clickable((By.ID, "pc"))
|
45
|
+
)
|
46
|
+
inputElement_postcodesearch.send_keys(user_postcode)
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
find_address_btn = wait.until(
|
51
|
+
EC.element_to_be_clickable((By.XPATH, '//*[@id="sub"]'))
|
52
|
+
)
|
53
|
+
find_address_btn.click()
|
54
|
+
|
55
|
+
dropdown_options = wait.until(
|
56
|
+
EC.presence_of_element_located(
|
57
|
+
(By.XPATH, '//*[@id="address"]')
|
58
|
+
)
|
59
|
+
)
|
60
|
+
time.sleep(2)
|
61
|
+
dropdown_options.click()
|
62
|
+
time.sleep(1)
|
63
|
+
|
64
|
+
# Wait for the element to be clickable
|
65
|
+
address = WebDriverWait(driver, 10).until(
|
66
|
+
EC.element_to_be_clickable(
|
67
|
+
(By.XPATH, f'//li[contains(text(), "{user_paon}")]')
|
68
|
+
)
|
69
|
+
)
|
70
|
+
|
71
|
+
# Click the element
|
72
|
+
address.click()
|
73
|
+
|
74
|
+
|
75
|
+
submit_address = wait.until(
|
76
|
+
EC.presence_of_element_located(
|
77
|
+
(By.XPATH, '//*[@id="go"]')
|
78
|
+
)
|
79
|
+
)
|
80
|
+
time.sleep(2)
|
81
|
+
submit_address.click()
|
82
|
+
|
83
|
+
results_found = wait.until(
|
84
|
+
EC.element_to_be_clickable(
|
85
|
+
(By.XPATH, '//h1[contains(text(), "Your bin days")]')
|
86
|
+
)
|
87
|
+
)
|
88
|
+
|
89
|
+
final_page = wait.until(
|
90
|
+
EC.presence_of_element_located(
|
91
|
+
(By.CLASS_NAME, "waste__collections")
|
92
|
+
)
|
93
|
+
)
|
94
|
+
|
95
|
+
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
96
|
+
|
97
|
+
# Find all waste services
|
98
|
+
|
99
|
+
# Initialize the data dictionary
|
100
|
+
data = {"bins": []}
|
101
|
+
bin_sections = soup.find_all("h3", class_="waste-service-name")
|
102
|
+
|
103
|
+
# Loop through each bin field
|
104
|
+
for bin_section in bin_sections:
|
105
|
+
# Extract the bin type (e.g., "Brown Caddy", "Green Wheelie Bin", etc.)
|
106
|
+
bin_type = bin_section.get_text(strip=True).split("\n")[0] # The first part is the bin type
|
107
|
+
|
108
|
+
# Find the next sibling <dl> tag that contains the next collection information
|
109
|
+
summary_list = bin_section.find_next("dl", class_="govuk-summary-list")
|
110
|
+
|
111
|
+
if summary_list:
|
112
|
+
# Now, instead of finding by class, we'll search by text within the dt element
|
113
|
+
next_collection_dt = summary_list.find("dt", string=lambda text: "Next collection" in text)
|
114
|
+
|
115
|
+
if next_collection_dt:
|
116
|
+
# Find the sibling <dd> tag for the collection date
|
117
|
+
next_collection = next_collection_dt.find_next_sibling("dd").get_text(strip=True)
|
118
|
+
|
119
|
+
if next_collection:
|
120
|
+
try:
|
121
|
+
# Parse the next collection date (assuming the format is like "Tuesday 15 October 2024")
|
122
|
+
parsed_date = datetime.strptime(next_collection, "%A %d %B %Y")
|
123
|
+
|
124
|
+
# Add the bin information to the data dictionary
|
125
|
+
data["bins"].append({
|
126
|
+
"type": bin_type,
|
127
|
+
"collectionDate": parsed_date.strftime(date_format),
|
128
|
+
})
|
129
|
+
except ValueError as e:
|
130
|
+
print(f"Error parsing date for {bin_type}: {e}")
|
131
|
+
else:
|
132
|
+
print(f"No next collection date found for {bin_type}")
|
133
|
+
else:
|
134
|
+
print(f"No 'Next collection' text found for {bin_type}")
|
135
|
+
else:
|
136
|
+
print(f"No summary list found for {bin_type}")
|
137
|
+
|
138
|
+
except Exception as e:
|
139
|
+
# Here you can log the exception if needed
|
140
|
+
print(f"An error occurred: {e}")
|
141
|
+
# Optionally, re-raise the exception if you want it to propagate
|
142
|
+
raise
|
143
|
+
finally:
|
144
|
+
# This block ensures that the driver is closed regardless of an exception
|
145
|
+
if driver:
|
146
|
+
driver.quit()
|
147
|
+
return data
|
uk_bin_collection-0.98.2/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
import re
|
2
|
+
from datetime import datetime
|
3
|
+
|
4
|
+
import requests
|
5
|
+
from bs4 import BeautifulSoup
|
6
|
+
|
7
|
+
from uk_bin_collection.uk_bin_collection.common import *
|
8
|
+
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
9
|
+
|
10
|
+
class CouncilClass(AbstractGetBinDataClass):
|
11
|
+
def parse_data(self, page: str, **kwargs) -> dict:
|
12
|
+
|
13
|
+
user_postcode = kwargs.get("postcode")
|
14
|
+
check_postcode(user_postcode)
|
15
|
+
|
16
|
+
# Fetch the page content
|
17
|
+
root_url = "https://myproperty.molevalley.gov.uk/molevalley/api/live_addresses/{}?format=json".format(user_postcode)
|
18
|
+
response = requests.get(root_url, verify=False)
|
19
|
+
|
20
|
+
if not response.ok:
|
21
|
+
raise ValueError("Invalid server response code retrieving data.")
|
22
|
+
|
23
|
+
jsonData = response.json()
|
24
|
+
|
25
|
+
if len(jsonData["results"]["features"]) == 0:
|
26
|
+
raise ValueError("No collection data found for postcode provided.")
|
27
|
+
|
28
|
+
properties_found = jsonData["results"]["features"]
|
29
|
+
|
30
|
+
html_data = None
|
31
|
+
uprn = kwargs.get("uprn")
|
32
|
+
if uprn:
|
33
|
+
check_uprn(uprn)
|
34
|
+
for item in properties_found:
|
35
|
+
if uprn == str(int(item["properties"]["blpu_uprn"])):
|
36
|
+
html_data = item["properties"]["three_column_layout_html"]
|
37
|
+
break
|
38
|
+
if html_data is None:
|
39
|
+
raise ValueError("No collection data found for UPRN provided.")
|
40
|
+
else:
|
41
|
+
html_data = properties_found[0]["properties"]["three_column_layout_html"]
|
42
|
+
|
43
|
+
# Conditionally replace the commented-out sections (<!-- ... -->)
|
44
|
+
if "<!--" in html_data and "-->" in html_data:
|
45
|
+
print("Commented-out section found, replacing comments...")
|
46
|
+
html_data = html_data.replace("<!--", "").replace("-->", "")
|
47
|
+
else:
|
48
|
+
print("No commented-out section found, processing as is.")
|
49
|
+
|
50
|
+
# Process the updated HTML data with BeautifulSoup
|
51
|
+
soup = BeautifulSoup(html_data, "html.parser")
|
52
|
+
|
53
|
+
data = {"bins": []}
|
54
|
+
all_collection_dates = []
|
55
|
+
regex_date = re.compile(r"(\d{2}/\d{2}/\d{4})") # Adjusted date regex
|
56
|
+
regex_additional_collection = re.compile(r"We also collect (.*) on (.*) -")
|
57
|
+
|
58
|
+
# Debugging to verify the HTML content is parsed correctly
|
59
|
+
print("HTML content parsed successfully.")
|
60
|
+
|
61
|
+
# Search for the 'Bins and Recycling' panel
|
62
|
+
bins_panel = soup.find("h2", string="Bins and Recycling")
|
63
|
+
if bins_panel:
|
64
|
+
panel = bins_panel.find_parent("div", class_="panel")
|
65
|
+
print("Found 'Bins and Recycling' panel.")
|
66
|
+
|
67
|
+
# Extract bin collection info from the un-commented HTML
|
68
|
+
for strong_tag in panel.find_all("strong"):
|
69
|
+
bin_type = strong_tag.text.strip()
|
70
|
+
collection_string = strong_tag.find_next("p").text.strip()
|
71
|
+
|
72
|
+
# Debugging output
|
73
|
+
print(f"Processing bin type: {bin_type}")
|
74
|
+
print(f"Collection string: {collection_string}")
|
75
|
+
|
76
|
+
match = regex_date.search(collection_string)
|
77
|
+
if match:
|
78
|
+
collection_date = datetime.strptime(match.group(1), "%d/%m/%Y").date()
|
79
|
+
data["bins"].append({
|
80
|
+
"type": bin_type,
|
81
|
+
"collectionDate": collection_date.strftime("%d/%m/%Y"),
|
82
|
+
})
|
83
|
+
all_collection_dates.append(collection_date)
|
84
|
+
else:
|
85
|
+
# Add a debug line to show which collections are missing dates
|
86
|
+
print(f"No valid date found for bin type: {bin_type}")
|
87
|
+
|
88
|
+
# Search for additional collections like electrical and textiles
|
89
|
+
for p in panel.find_all("p"):
|
90
|
+
additional_match = regex_additional_collection.match(p.text.strip())
|
91
|
+
|
92
|
+
# Debugging output for additional collections
|
93
|
+
if additional_match:
|
94
|
+
bin_type = additional_match.group(1)
|
95
|
+
print(f"Found additional collection: {bin_type}")
|
96
|
+
if "each collection day" in additional_match.group(2):
|
97
|
+
if all_collection_dates:
|
98
|
+
collection_date = min(all_collection_dates)
|
99
|
+
data["bins"].append({
|
100
|
+
"type": bin_type,
|
101
|
+
"collectionDate": collection_date.strftime("%d/%m/%Y"),
|
102
|
+
})
|
103
|
+
else:
|
104
|
+
print("No collection dates available for additional collection.")
|
105
|
+
raise ValueError("No valid bin collection dates found.")
|
106
|
+
else:
|
107
|
+
print(f"No additional collection found in paragraph: {p.text.strip()}")
|
108
|
+
else:
|
109
|
+
raise ValueError("Unable to find 'Bins and Recycling' panel in the HTML data.")
|
110
|
+
|
111
|
+
# Debugging to check collected data
|
112
|
+
print(f"Collected bin data: {data}")
|
113
|
+
|
114
|
+
# Handle the case where no collection dates were found
|
115
|
+
if not all_collection_dates:
|
116
|
+
raise ValueError("No valid collection dates were found in the data.")
|
117
|
+
|
118
|
+
return data
|
@@ -1,147 +0,0 @@
|
|
1
|
-
import time
|
2
|
-
from datetime import datetime
|
3
|
-
|
4
|
-
from bs4 import BeautifulSoup
|
5
|
-
from selenium.webdriver.common.by import By
|
6
|
-
from selenium.webdriver.common.keys import Keys
|
7
|
-
from selenium.webdriver.support import expected_conditions as EC
|
8
|
-
from selenium.webdriver.support.ui import Select
|
9
|
-
from selenium.webdriver.support.wait import WebDriverWait
|
10
|
-
|
11
|
-
from uk_bin_collection.uk_bin_collection.common import *
|
12
|
-
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
13
|
-
|
14
|
-
# import the wonderful Beautiful Soup and the URL grabber
|
15
|
-
|
16
|
-
|
17
|
-
class CouncilClass(AbstractGetBinDataClass):
|
18
|
-
"""
|
19
|
-
Concrete classes have to implement all abstract operations of the
|
20
|
-
base class. They can also override some operations with a default
|
21
|
-
implementation.
|
22
|
-
"""
|
23
|
-
|
24
|
-
def parse_data(self, page: str, **kwargs) -> dict:
|
25
|
-
driver = None
|
26
|
-
try:
|
27
|
-
page = "https://mybexley.bexley.gov.uk/service/When_is_my_collection_day"
|
28
|
-
|
29
|
-
data = {"bins": []}
|
30
|
-
|
31
|
-
user_uprn = kwargs.get("uprn")
|
32
|
-
user_paon = kwargs.get("paon")
|
33
|
-
user_postcode = kwargs.get("postcode")
|
34
|
-
web_driver = kwargs.get("web_driver")
|
35
|
-
headless = kwargs.get("headless")
|
36
|
-
|
37
|
-
# Create Selenium webdriver
|
38
|
-
driver = create_webdriver(web_driver, headless, None, __name__)
|
39
|
-
driver.get(page)
|
40
|
-
|
41
|
-
# If you bang in the house number (or property name) and postcode in the box it should find your property
|
42
|
-
|
43
|
-
iframe_presense = WebDriverWait(driver, 30).until(
|
44
|
-
EC.presence_of_element_located((By.ID, "fillform-frame-1"))
|
45
|
-
)
|
46
|
-
|
47
|
-
driver.switch_to.frame(iframe_presense)
|
48
|
-
wait = WebDriverWait(driver, 60)
|
49
|
-
start_btn = wait.until(
|
50
|
-
EC.element_to_be_clickable(
|
51
|
-
(By.XPATH, "//button/span[contains(text(), 'Next')]")
|
52
|
-
)
|
53
|
-
)
|
54
|
-
|
55
|
-
start_btn.click()
|
56
|
-
|
57
|
-
inputElement_postcodesearch = wait.until(
|
58
|
-
EC.element_to_be_clickable((By.ID, "postcode_search"))
|
59
|
-
)
|
60
|
-
inputElement_postcodesearch.send_keys(user_postcode)
|
61
|
-
|
62
|
-
find_address_btn = wait.until(
|
63
|
-
EC.element_to_be_clickable((By.XPATH, '//*[@id="search"]'))
|
64
|
-
)
|
65
|
-
find_address_btn.click()
|
66
|
-
|
67
|
-
dropdown_options = wait.until(
|
68
|
-
EC.presence_of_element_located(
|
69
|
-
(By.XPATH, '//*[@id="select2-chosen-1"]')
|
70
|
-
)
|
71
|
-
)
|
72
|
-
time.sleep(2)
|
73
|
-
dropdown_options.click()
|
74
|
-
time.sleep(1)
|
75
|
-
dropdown_input = wait.until(
|
76
|
-
EC.presence_of_element_located(
|
77
|
-
(By.XPATH, '//*[@id="s2id_autogen1_search"]')
|
78
|
-
)
|
79
|
-
)
|
80
|
-
time.sleep(1)
|
81
|
-
dropdown_input.send_keys(user_paon)
|
82
|
-
dropdown_input.send_keys(Keys.ENTER)
|
83
|
-
|
84
|
-
results_found = wait.until(
|
85
|
-
EC.presence_of_element_located((By.CLASS_NAME, "found-content"))
|
86
|
-
)
|
87
|
-
finish_btn = wait.until(
|
88
|
-
EC.element_to_be_clickable(
|
89
|
-
(By.XPATH, "//button/span[contains(text(), 'Next')]")
|
90
|
-
)
|
91
|
-
)
|
92
|
-
finish_btn.click()
|
93
|
-
final_page = wait.until(
|
94
|
-
EC.presence_of_element_located(
|
95
|
-
(By.CLASS_NAME, "waste-header-container")
|
96
|
-
)
|
97
|
-
)
|
98
|
-
|
99
|
-
soup = BeautifulSoup(driver.page_source, features="html.parser")
|
100
|
-
|
101
|
-
bin_fields = soup.find_all("div", class_="waste-panel-container")
|
102
|
-
# Define your XPath
|
103
|
-
|
104
|
-
for bin in bin_fields:
|
105
|
-
# Extract h3 text from the current element
|
106
|
-
h3_text = (
|
107
|
-
bin.find("h3", class_="container-name").get_text(strip=True)
|
108
|
-
if bin.find("h3", class_="container-name")
|
109
|
-
else None
|
110
|
-
)
|
111
|
-
|
112
|
-
date_text = (
|
113
|
-
bin.find("p", class_="container-status").get_text(strip=True)
|
114
|
-
if bin.find("p", class_="container-status")
|
115
|
-
else None
|
116
|
-
)
|
117
|
-
|
118
|
-
if h3_text and date_text:
|
119
|
-
# Parse the date using the appropriate format
|
120
|
-
parsed_date = datetime.strptime(date_text, "%A %d %B")
|
121
|
-
|
122
|
-
# Assuming the current year is used for the collection date
|
123
|
-
current_year = datetime.now().year
|
124
|
-
|
125
|
-
# If the parsed date is in the past, assume it's for the next year
|
126
|
-
if parsed_date < datetime.now():
|
127
|
-
current_year += 1
|
128
|
-
|
129
|
-
data["bins"].append(
|
130
|
-
{
|
131
|
-
"type": h3_text,
|
132
|
-
"collectionDate": parsed_date.replace(
|
133
|
-
year=current_year
|
134
|
-
).strftime("%d/%m/%Y"),
|
135
|
-
}
|
136
|
-
)
|
137
|
-
|
138
|
-
except Exception as e:
|
139
|
-
# Here you can log the exception if needed
|
140
|
-
print(f"An error occurred: {e}")
|
141
|
-
# Optionally, re-raise the exception if you want it to propagate
|
142
|
-
raise
|
143
|
-
finally:
|
144
|
-
# This block ensures that the driver is closed regardless of an exception
|
145
|
-
if driver:
|
146
|
-
driver.quit()
|
147
|
-
return data
|
uk_bin_collection-0.98.0/uk_bin_collection/uk_bin_collection/councils/MoleValleyDistrictCouncil.py
DELETED
@@ -1,101 +0,0 @@
|
|
1
|
-
import re
|
2
|
-
from datetime import datetime
|
3
|
-
|
4
|
-
import requests
|
5
|
-
from bs4 import BeautifulSoup
|
6
|
-
|
7
|
-
from uk_bin_collection.uk_bin_collection.common import *
|
8
|
-
from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
|
9
|
-
|
10
|
-
|
11
|
-
# import the wonderful Beautiful Soup and the URL grabber
|
12
|
-
class CouncilClass(AbstractGetBinDataClass):
|
13
|
-
"""
|
14
|
-
Concrete classes have to implement all abstract operations of the
|
15
|
-
base class. They can also override some operations with a default
|
16
|
-
implementation.
|
17
|
-
"""
|
18
|
-
|
19
|
-
def parse_data(self, page: str, **kwargs) -> dict:
|
20
|
-
|
21
|
-
user_postcode = kwargs.get("postcode")
|
22
|
-
check_postcode(user_postcode)
|
23
|
-
|
24
|
-
root_url = "https://myproperty.molevalley.gov.uk/molevalley/api/live_addresses/{}?format=json".format(
|
25
|
-
user_postcode
|
26
|
-
)
|
27
|
-
requests.packages.urllib3.disable_warnings()
|
28
|
-
response = requests.get(root_url, verify=False)
|
29
|
-
|
30
|
-
if not response.ok:
|
31
|
-
raise ValueError("Invalid server response code retreiving data.")
|
32
|
-
|
33
|
-
jsonData = response.json()
|
34
|
-
|
35
|
-
if len(jsonData["results"]["features"]) == 0:
|
36
|
-
raise ValueError("No collection data found for postcode provided.")
|
37
|
-
|
38
|
-
properties_found = jsonData["results"]["features"]
|
39
|
-
|
40
|
-
# If UPRN is provided, we can check a specific address.
|
41
|
-
html_data = None
|
42
|
-
uprn = kwargs.get("uprn")
|
43
|
-
if uprn:
|
44
|
-
check_uprn(uprn)
|
45
|
-
for item in properties_found:
|
46
|
-
if uprn == str(int(item["properties"]["blpu_uprn"])):
|
47
|
-
html_data = item["properties"]["three_column_layout_html"]
|
48
|
-
break
|
49
|
-
if html_data is None:
|
50
|
-
raise ValueError("No collection data found for UPRN provided.")
|
51
|
-
else:
|
52
|
-
# If UPRN not provided, just use the first result
|
53
|
-
html_data = properties_found[0]["properties"]["three_column_layout_html"]
|
54
|
-
|
55
|
-
soup = BeautifulSoup(html_data, features="html.parser")
|
56
|
-
soup.prettify()
|
57
|
-
|
58
|
-
data = {"bins": []}
|
59
|
-
all_collection_dates = []
|
60
|
-
regex_date = re.compile(r".* ([\d]+\/[\d]+\/[\d]+)")
|
61
|
-
regex_additional_collection = re.compile(r"We also collect (.*) on (.*) -")
|
62
|
-
|
63
|
-
# Search for the 'Bins and Recycling' panel
|
64
|
-
for panel in soup.select('div[class*="panel"]'):
|
65
|
-
if panel.h2.text.strip() == "Bins and Recycling":
|
66
|
-
|
67
|
-
# Gather the bin types and dates
|
68
|
-
for collection in panel.select("div > strong"):
|
69
|
-
bin_type = collection.text.strip()
|
70
|
-
collection_string = collection.find_next("p").text.strip()
|
71
|
-
m = regex_date.match(collection_string)
|
72
|
-
if m:
|
73
|
-
collection_date = datetime.strptime(
|
74
|
-
m.group(1), "%d/%m/%Y"
|
75
|
-
).date()
|
76
|
-
data["bins"].append(
|
77
|
-
{
|
78
|
-
"type": bin_type,
|
79
|
-
"collectionDate": collection_date.strftime("%d/%m/%Y"),
|
80
|
-
}
|
81
|
-
)
|
82
|
-
all_collection_dates.append(collection_date)
|
83
|
-
|
84
|
-
# Search for additional collections
|
85
|
-
for p in panel.select("p"):
|
86
|
-
m2 = regex_additional_collection.match(p.text.strip())
|
87
|
-
if m2:
|
88
|
-
bin_type = m2.group(1)
|
89
|
-
if "each collection day" in m2.group(2):
|
90
|
-
collection_date = min(all_collection_dates)
|
91
|
-
data["bins"].append(
|
92
|
-
{
|
93
|
-
"type": bin_type,
|
94
|
-
"collectionDate": collection_date.strftime(
|
95
|
-
"%d/%m/%Y"
|
96
|
-
),
|
97
|
-
}
|
98
|
-
)
|
99
|
-
break
|
100
|
-
|
101
|
-
return data
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_collect_data.py
RENAMED
File without changes
|
File without changes
|
{uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_conftest.py
RENAMED
File without changes
|
{uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/tests/test_get_data.py
RENAMED
File without changes
|
File without changes
|
{uk_bin_collection-0.98.0 → uk_bin_collection-0.98.2}/uk_bin_collection/uk_bin_collection/common.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|