uk_bin_collection 0.152.3__py3-none-any.whl → 0.152.4__py3-none-any.whl

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.
@@ -2180,10 +2180,10 @@
2180
2180
  "LAD24CD": "E07000179"
2181
2181
  },
2182
2182
  "SouthRibbleCouncil": {
2183
- "uprn": "010013246384",
2184
- "postcode": "PR5 6DT",
2185
- "url": "https://www.southribble.gov.uk",
2186
- "wiki_command_url_override": "https://www.southribble.gov.uk",
2183
+ "uprn": "10013243496",
2184
+ "postcode": "PR26 7RZ",
2185
+ "url": "https://forms.chorleysouthribble.gov.uk/xfp/form/70",
2186
+ "wiki_command_url_override": "https://forms.chorleysouthribble.gov.uk/xfp/form/70",
2187
2187
  "wiki_name": "South Ribble",
2188
2188
  "wiki_note": "You will need to use [FindMyAddress](https://www.findmyaddress.co.uk/search) to find your UPRN.",
2189
2189
  "LAD24CD": "E07000126"
@@ -1,29 +1,11 @@
1
- from typing import Dict, List, Any, Optional
2
- from bs4 import BeautifulSoup
3
- from dateutil.relativedelta import relativedelta
4
1
  import requests
5
- import logging
6
- import re
7
- from datetime import datetime
8
- from uk_bin_collection.uk_bin_collection.common import *
9
- from dateutil.parser import parse
2
+ from bs4 import BeautifulSoup
10
3
 
11
- from uk_bin_collection.uk_bin_collection.common import check_uprn, check_postcode
4
+ from uk_bin_collection.uk_bin_collection.common import *
12
5
  from uk_bin_collection.uk_bin_collection.get_bin_data import AbstractGetBinDataClass
13
6
 
14
7
 
15
- def get_token(page) -> str:
16
- """
17
- Get a __token to include in the form data
18
- :param page: Page html
19
- :return: Form __token
20
- """
21
- soup = BeautifulSoup(page.text, features="html.parser")
22
- soup.prettify()
23
- token = soup.find("input", {"name": "__token"}).get("value")
24
- return token
25
-
26
-
8
+ # import the wonderful Beautiful Soup and the URL grabber
27
9
  class CouncilClass(AbstractGetBinDataClass):
28
10
  """
29
11
  Concrete classes have to implement all abstract operations of the
@@ -31,69 +13,38 @@ class CouncilClass(AbstractGetBinDataClass):
31
13
  implementation.
32
14
  """
33
15
 
34
- def get_data(self, url: str) -> str:
35
- """This method makes the request to the council
36
-
37
- Keyword arguments:
38
- url -- the url to get the data from
39
- """
40
- # Set a user agent so we look like a browser ;-)
41
- user_agent = (
42
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
43
- "Chrome/108.0.0.0 Safari/537.36"
44
- )
45
- headers = {"User-Agent": user_agent}
46
- requests.packages.urllib3.disable_warnings()
16
+ def parse_data(self, page: str, **kwargs) -> dict:
47
17
 
48
- # Make the Request - change the URL - find out your property number
49
- try:
50
- session = requests.Session()
51
- session.headers.update(headers)
52
- full_page = session.get(url)
53
- return full_page
54
- except requests.exceptions.HTTPError as errh:
55
- logging.error(f"Http Error: {errh}")
56
- raise
57
- except requests.exceptions.ConnectionError as errc:
58
- logging.error(f"Error Connecting: {errc}")
59
- raise
60
- except requests.exceptions.Timeout as errt:
61
- logging.error(f"Timeout Error: {errt}")
62
- raise
63
- except requests.exceptions.RequestException as err:
64
- logging.error(f"Oops: Something Else {err}")
65
- raise
18
+ user_uprn = kwargs.get("uprn")
19
+ user_postcode = kwargs.get("postcode")
20
+ check_uprn(user_uprn)
21
+ check_postcode(user_postcode)
22
+ bindata = {"bins": []}
66
23
 
67
- def parse_data(self, page: str, **kwargs: Any) -> Dict[str, List[Dict[str, str]]]:
68
- uprn: Optional[str] = kwargs.get("uprn")
69
- postcode: Optional[str] = kwargs.get("postcode")
24
+ session_uri = "https://forms.chorleysouthribble.gov.uk/xfp/form/70"
25
+ URI = "https://forms.chorleysouthribble.gov.uk/xfp/form/70#qc576c657112a8277ba6f954ebc0490c946168363_0"
70
26
 
71
- if uprn is None:
72
- raise ValueError("UPRN is required and must be a non-empty string.")
73
- if postcode is None:
74
- raise ValueError("Postcode is required and must be a non-empty string.")
27
+ session = requests.Session()
28
+ token_response = session.get(session_uri)
29
+ soup = BeautifulSoup(token_response.text, "html.parser")
30
+ token = soup.find("input", {"name": "__token"}).attrs["value"]
75
31
 
76
- check_uprn(uprn)
77
- check_postcode(postcode)
78
-
79
- values = {
80
- "__token": get_token(page),
81
- "page": "491",
32
+ form_data = {
33
+ "__token": token,
34
+ "page": "196",
82
35
  "locale": "en_GB",
83
- "q1f8ccce1d1e2f58649b4069712be6879a839233f_0_0": postcode,
84
- "q1f8ccce1d1e2f58649b4069712be6879a839233f_1_0": uprn,
36
+ "qc576c657112a8277ba6f954ebc0490c946168363_0_0": user_postcode,
37
+ "qc576c657112a8277ba6f954ebc0490c946168363_1_0": user_uprn,
85
38
  "next": "Next",
86
39
  }
87
- headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64)"}
88
- requests.packages.urllib3.disable_warnings()
89
- response = requests.request(
90
- "POST",
91
- "https://forms.chorleysouthribble.gov.uk/xfp/form/70",
92
- headers=headers,
93
- data=values,
94
- )
95
40
 
96
- soup = BeautifulSoup(response.text, features="html.parser")
41
+ collection_response = session.post(URI, data=form_data)
42
+
43
+ #collection_soup = BeautifulSoup(collection_response.text, "html.parser")
44
+
45
+
46
+ soup = BeautifulSoup(collection_response.text, "html.parser")
47
+ #print(soup)
97
48
 
98
49
  rows = soup.find("table").find_all("tr")
99
50
 
@@ -103,31 +54,23 @@ class CouncilClass(AbstractGetBinDataClass):
103
54
  # Loops the Rows
104
55
  for row in rows:
105
56
  cells = row.find_all("td")
57
+
106
58
  if cells:
107
59
  bin_type = cells[0].get_text(strip=True)
108
60
  collection_next = cells[1].get_text(strip=True)
109
61
 
110
- collection_date = re.findall(r"\(.*?\)", collection_next)
111
-
112
- if len(collection_date) != 1:
113
- continue
114
-
115
- collection_date_obj = parse(
116
- re.sub(r"[()]", "", collection_date[0])
117
- ).date()
118
-
119
- # since we only have the next collection day, if the parsed date is in the past,
120
- # assume the day is instead next month
121
- if collection_date_obj < datetime.now().date():
122
- collection_date_obj += relativedelta(months=1)
123
-
124
- # Make each Bin element in the JSON
125
- dict_data = {
126
- "type": bin_type,
127
- "collectionDate": collection_date_obj.strftime(date_format),
128
- }
129
-
130
- # Add data to the main JSON Wrapper
131
- data["bins"].append(dict_data)
132
-
62
+ if len(collection_next) != 1:
63
+ collection_date_obj = datetime.strptime(collection_next, "%d/%m/%y").date()
64
+ # since we only have the next collection day, if the parsed date is in the past,
65
+ # assume the day is instead next month
66
+ if collection_date_obj < datetime.now().date():
67
+ collection_date_obj += relativedelta(months=1)
68
+ # Make each Bin element in the JSON
69
+ dict_data = {
70
+ "type": bin_type,
71
+ "collectionDate": collection_date_obj.strftime("%d/%m/%Y"),
72
+ }
73
+ # Add data to the main JSON Wrapper
74
+ data["bins"].append(dict_data)
75
+ continue
133
76
  return data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uk_bin_collection
3
- Version: 0.152.3
3
+ Version: 0.152.4
4
4
  Summary: Python Lib to collect UK Bin Data
5
5
  Author: Robert Bradley
6
6
  Author-email: robbrad182@gmail.com
@@ -7,7 +7,7 @@ uk_bin_collection/tests/council_feature_input_parity.py,sha256=DO6Mk4ImYgM5ZCZ-c
7
7
  uk_bin_collection/tests/features/environment.py,sha256=VQZjJdJI_kZn08M0j5cUgvKT4k3iTw8icJge1DGOkoA,127
8
8
  uk_bin_collection/tests/features/validate_council_outputs.feature,sha256=SJK-Vc737hrf03tssxxbeg_JIvAH-ddB8f6gU1LTbuQ,251
9
9
  uk_bin_collection/tests/generate_map_test_results.py,sha256=CKnGK2ZgiSXomRGkomX90DitgMP-X7wkHhyKORDcL2E,1144
10
- uk_bin_collection/tests/input.json,sha256=93VJl5bKKggne94vYtI71b1WLGhcI7NSVZF3bmXjJ1A,132548
10
+ uk_bin_collection/tests/input.json,sha256=hy8tlgmuKQWiq3PxNE16kaYHk6XxesuFkBvtpk-9oIw,132590
11
11
  uk_bin_collection/tests/output.schema,sha256=ZwKQBwYyTDEM4G2hJwfLUVM-5v1vKRvRK9W9SS1sd18,1086
12
12
  uk_bin_collection/tests/step_defs/step_helpers/file_handler.py,sha256=Ygzi4V0S1MIHqbdstUlIqtRIwnynvhu4UtpweJ6-5N8,1474
13
13
  uk_bin_collection/tests/step_defs/test_validate_council.py,sha256=VZ0a81sioJULD7syAYHjvK_-nT_Rd36tUyzPetSA0gk,3475
@@ -271,7 +271,7 @@ uk_bin_collection/uk_bin_collection/councils/SouthKestevenDistrictCouncil.py,sha
271
271
  uk_bin_collection/uk_bin_collection/councils/SouthLanarkshireCouncil.py,sha256=fj-eZI0yrvQVCv8GvhcovZ3b9bV6Xv_ws3IunWjnv4U,3126
272
272
  uk_bin_collection/uk_bin_collection/councils/SouthNorfolkCouncil.py,sha256=C2qIZjjbl9JnuukX9OH2RbfP0hSdp3uX76APGY33qKs,4622
273
273
  uk_bin_collection/uk_bin_collection/councils/SouthOxfordshireCouncil.py,sha256=f9d2YDGv5hnN7Ul-u_I63h_BbpBU7CJFdgv-lOviRGc,4031
274
- uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py,sha256=QujJYORfiQmfBBUPt3Vnb0ryJy1XUiJtli-jLlUt5fs,4695
274
+ uk_bin_collection/uk_bin_collection/councils/SouthRibbleCouncil.py,sha256=5HSTmrPc-gN3ZzLq6n2VDs_NhtCgXhnGqJkEejDmSHI,2900
275
275
  uk_bin_collection/uk_bin_collection/councils/SouthStaffordshireDistrictCouncil.py,sha256=ACQMHWyamnj1ag3gNF-8Jhp-DKUok1GhFdnzH4nCzwU,3201
276
276
  uk_bin_collection/uk_bin_collection/councils/SouthTynesideCouncil.py,sha256=dxXGrJfg_fn2IPTBgq6Duwy0WY8GYLafMuisaCjOnbs,3426
277
277
  uk_bin_collection/uk_bin_collection/councils/SouthamptonCityCouncil.py,sha256=exNoI-Vun_C5FowCYhZ_600MBUe_OPR7MdGZEMNLL0I,1542
@@ -346,8 +346,8 @@ uk_bin_collection/uk_bin_collection/councils/YorkCouncil.py,sha256=I2kBYMlsD4bId
346
346
  uk_bin_collection/uk_bin_collection/councils/council_class_template/councilclasstemplate.py,sha256=QD4v4xpsEE0QheR_fGaNOIRMc2FatcUfKkkhAhseyVU,1159
347
347
  uk_bin_collection/uk_bin_collection/create_new_council.py,sha256=m-IhmWmeWQlFsTZC4OxuFvtw5ZtB8EAJHxJTH4O59lQ,1536
348
348
  uk_bin_collection/uk_bin_collection/get_bin_data.py,sha256=YvmHfZqanwrJ8ToGch34x-L-7yPe31nB_x77_Mgl_vo,4545
349
- uk_bin_collection-0.152.3.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
350
- uk_bin_collection-0.152.3.dist-info/METADATA,sha256=WouCuuXElczpnEgF3wFXEH9BfYqCG33PFpA-GdPPSpA,26688
351
- uk_bin_collection-0.152.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
352
- uk_bin_collection-0.152.3.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
353
- uk_bin_collection-0.152.3.dist-info/RECORD,,
349
+ uk_bin_collection-0.152.4.dist-info/LICENSE,sha256=vABBUOzcrgfaTKpzeo-si9YVEun6juDkndqA8RKdKGs,1071
350
+ uk_bin_collection-0.152.4.dist-info/METADATA,sha256=wK9bVaoTAyW9e1hieARhWnIUnlDdpL6b_h0VNvGP4zw,26688
351
+ uk_bin_collection-0.152.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
352
+ uk_bin_collection-0.152.4.dist-info/entry_points.txt,sha256=36WCSGMWSc916S3Hi1ZkazzDKHaJ6CD-4fCEFm5MIao,90
353
+ uk_bin_collection-0.152.4.dist-info/RECORD,,