We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[Bug]: Harborough District (https://www.fccenvironment.co.uk/) - No longer returning dates
### I Have A Problem With:

A specific source

### What's Your Problem

Integration is no longer reporting the collection dates for Haborough District - Sensor are as reported with the value 'unknown'.

I've attempted to call the api used in the code via postman, but it appears to return the fccenvironment search page or returns nothing?



### Source (if relevant)

https://www.fccenvironment.co.uk/

### Logs

```Shell
This error originated from a custom integration.

Logger: waste_collection_schedule.source_shell
Source: custom_components/waste_collection_schedule/waste_collection_schedule/source_shell.py:136
Integration: waste_collection_schedule (documentation)
First occurred: 9:00:00 AM (1 occurrences)
Last logged: 9:00:00 AM

fetch failed for source FCC Environment: Traceback (most recent call last): File "/config/custom_components/waste_collection_schedule/waste_collection_schedule/source_shell.py", line 134, in fetch entries = self._source.fetch() ^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py", line 131, in fetch return self.harborough() ^^^^^^^^^^^^^^^^^ File "/config/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py", line 110, in harborough ).find_all("li") ^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'find_all'
```


### Relevant Configuration

```YAML
waste_collection_schedule:
    sources:
    - name: fccenvironment_co_uk
      args:
        uprn: <removed for privacy>
        region: harborough
      customize:
        - type: NON-RECYCLABLE WASTE BIN COLLECTION
          alias: Black bin
        - type: GARDEN WASTE COLLECTION
          alias: Green bin
        - type: RECYCLING COLLECTION
          alias: Blue bin
```


### Checklist Source Error

- [X] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)
- [X] Checked that the website of your service provider is still working
- [X] Tested my attributes on the service provider website (if possible)
- [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on "Redownload" and choose master as version)

### Checklist Sensor Error

- [ ] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)

### Required

- [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.
- [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py`
Content:
```
1 from urllib.parse import urlparse
2 
3 import requests
4 import urllib3
5 from bs4 import BeautifulSoup
6 from dateutil import parser
7 from waste_collection_schedule import Collection
8 
9 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
10 
11 TITLE = "FCC Environment"
12 DESCRIPTION = """
13     Consolidated source for waste collection services for ~60 local authorities.
14     Currently supports:
15     West Devon (Generic Provider)
16     South Hams (Generic Provider)
17     Market Harborough (Custom Provider)
18     """
19 URL = "https://fccenvironment.co.uk"
20 EXTRA_INFO = [
21     {"title": "Harborough District Council", "url": "https://harborough.gov.uk"},
22     {"title": "South Hams District Council", "url": "https://southhams.gov.uk/"},
23     {"title": "West Devon Borough Council", "url": "https://www.westdevon.gov.uk/"},
24 ]
25 
26 TEST_CASES = {
27     "14_LE16_9QX": {"uprn": "100030491624"},  # region omitted to test default values
28     "4_LE16_9QX": {"uprn": "100030491614", "region": "harborough"},
29     "16_LE16_7NA": {"uprn": "100030493289", "region": "harborough"},
30     "10_LE16_8ER": {"uprn": "200001136341", "region": "harborough"},
31     "9_PL20_7SH": {"uprn": "10001326315", "region": "westdevon"},
32     "3_PL20_7RY": {"uprn": "10001326041", "region": "westdevon"},
33     "2_PL21_9BN": {"uprn": "100040279446", "region": "southhams"},
34     "4_SL21_0HZ": {"uprn": "100040281987", "region": "southhams"},
35 }
36 
37 ICON_MAP = {
38     "Refuse": "mdi:trash-can",
39     "Recycling": "mdi:recycle",
40     "Garden": "mdi:leaf",
41 }
42 
43 
44 class Source:
45     def __init__(self, uprn: str, region: str = "harborough") -> None:
46         self.uprn = uprn
47         self.region = region
48 
49     def getcollectiondetails(self, endpoint: str) -> list[Collection]:
50         domain = urlparse(endpoint).netloc
51         session = requests.Session()
52         cookies = session.get(f"https://{domain}/", verify=False)
53         response = session.post(
54             endpoint,
55             headers={
56                 "x-requested-with": "XMLHttpRequest",
57             },
58             data={
59                 "fcc_session_token": cookies.cookies["fcc_session_cookie"],
60                 "uprn": self.uprn,
61             },
62             verify=False,
63         )
64         results = {}
65         for item in response.json()["binCollections"]["tile"]:
66             try:
67                 soup = BeautifulSoup(item[0], "html.parser")
68                 date = parser.parse(soup.find_all("b")[2].text.split(",")[1].strip()).date()
69                 service = soup.text.split("\n")[0]
70             except parser._parser.ParserError:
71                 continue
72 
73             """
74             Handle duplication before creating the list of Collections
75             """
76             for type in ICON_MAP:
77                 if type in service:
78                     if type in results.keys():
79                         if date < results[type]:
80                             results[type] = date
81                     else:
82                         results[type] = date
83 
84         entries = []
85         for result in results:
86             entries.append(
87                 Collection(
88                     date=results[result],
89                     t=result,
90                     icon=ICON_MAP.get(result),
91                 )
92             )
93         return entries
94 
95     def harborough(self) -> list[Collection]:
96         _icons = {
97             "NON-RECYCLABLE WASTE BIN COLLECTION": "mdi:trash-can",
98             "RECYCLING COLLECTION": "mdi:recycle",
99             "GARDEN WASTE COLLECTION": "mdi:leaf",
100         }  # Custom icons to avoid a breaking change
101         r = requests.post(
102             "https://www.fccenvironment.co.uk/harborough/detail-address",
103             data={"Uprn": self.uprn},
104             verify=False,
105         )
106         soup = BeautifulSoup(r.text, "html.parser")
107         services = soup.find(
108             "div",
109             attrs={"class": "blocks block-your-next-scheduled-bin-collection-days"},
110         ).find_all("li")
111         entries = []
112         for service in services:
113             for type in _icons:
114                 if type.lower() in service.text.lower():
115                     try:
116                         date = parser.parse(service.find("span", attrs={"class": "pull-right"}).text.strip()).date()
117                     except parser._parser.ParserError:
118                         continue
119 
120                     entries.append(
121                         Collection(
122                             date=date,
123                             t=type,
124                             icon=_icons[type.upper()],
125                         )
126                     )
127         return entries
128 
129     def fetch(self) -> list[Collection]:
130         if self.region == "harborough":
131             return self.harborough()
132         elif self.region == "westdevon":
133             return self.getcollectiondetails(
134                 endpoint="https://westdevon.fccenvironment.co.uk/ajaxprocessor/getcollectiondetails"
135             )
136         elif self.region == "southhams":
137             return self.getcollectiondetails(
138                 endpoint="https://waste.southhams.gov.uk/mycollections/getcollectiondetails"
139             )
140
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py
--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py
+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py
@@ -99,7 +99,7 @@
             "GARDEN WASTE COLLECTION": "mdi:leaf",
         }  # Custom icons to avoid a breaking change
         r = requests.post(
-            "https://www.fccenvironment.co.uk/harborough/detail-address",
+            "https://harborough.fccenvironment.co.uk/detail-address",
             data={"Uprn": self.uprn},
             verify=False,
         )

{"golden_diff": "diff --git a/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py b/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py\n--- a/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py\n+++ b/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py\n@@ -99,7 +99,7 @@\n             \"GARDEN WASTE COLLECTION\": \"mdi:leaf\",\n         }  # Custom icons to avoid a breaking change\n         r = requests.post(\n-            \"https://www.fccenvironment.co.uk/harborough/detail-address\",\n+            \"https://harborough.fccenvironment.co.uk/detail-address\",\n             data={\"Uprn\": self.uprn},\n             verify=False,\n         )\n", "issue": "[Bug]: Harborough District (https://www.fccenvironment.co.uk/) - No longer returning dates\n### I Have A Problem With:\n\nA specific source\n\n### What's Your Problem\n\nIntegration is no longer reporting the collection dates for Haborough District - Sensor are as reported with the value 'unknown'.\r\n\r\nI've attempted to call the api used in the code via postman, but it appears to return the fccenvironment search page or returns nothing?\r\n\r\n\n\n### Source (if relevant)\n\nhttps://www.fccenvironment.co.uk/\n\n### Logs\n\n```Shell\nThis error originated from a custom integration.\r\n\r\nLogger: waste_collection_schedule.source_shell\r\nSource: custom_components/waste_collection_schedule/waste_collection_schedule/source_shell.py:136\r\nIntegration: waste_collection_schedule (documentation)\r\nFirst occurred: 9:00:00 AM (1 occurrences)\r\nLast logged: 9:00:00 AM\r\n\r\nfetch failed for source FCC Environment: Traceback (most recent call last): File \"/config/custom_components/waste_collection_schedule/waste_collection_schedule/source_shell.py\", line 134, in fetch entries = self._source.fetch() ^^^^^^^^^^^^^^^^^^^^ File \"/config/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py\", line 131, in fetch return self.harborough() ^^^^^^^^^^^^^^^^^ File \"/config/custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py\", line 110, in harborough ).find_all(\"li\") ^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'find_all'\n```\n\n\n### Relevant Configuration\n\n```YAML\nwaste_collection_schedule:\r\n    sources:\r\n    - name: fccenvironment_co_uk\r\n      args:\r\n        uprn: <removed for privacy>\r\n        region: harborough\r\n      customize:\r\n        - type: NON-RECYCLABLE WASTE BIN COLLECTION\r\n          alias: Black bin\r\n        - type: GARDEN WASTE COLLECTION\r\n          alias: Green bin\r\n        - type: RECYCLING COLLECTION\r\n          alias: Blue bin\n```\n\n\n### Checklist Source Error\n\n- [X] Use the example parameters for your source (often available in the documentation) (don't forget to restart Home Assistant after changing the configuration)\n- [X] Checked that the website of your service provider is still working\n- [X] Tested my attributes on the service provider website (if possible)\n- [X] I have tested with the latest version of the integration (master) (for HACS in the 3 dot menu of the integration click on \"Redownload\" and choose master as version)\n\n### Checklist Sensor Error\n\n- [ ] Checked in the Home Assistant Calendar tab if the event names match the types names (if types argument is used)\n\n### Required\n\n- [X] I have searched past (closed AND opened) issues to see if this bug has already been reported, and it hasn't been.\n- [X] I understand that people give their precious time for free, and thus I've done my very best to make this problem as easy as possible to investigate.\n", "before_files": [{"content": "from urllib.parse import urlparse\n\nimport requests\nimport urllib3\nfrom bs4 import BeautifulSoup\nfrom dateutil import parser\nfrom waste_collection_schedule import Collection\n\nurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\n\nTITLE = \"FCC Environment\"\nDESCRIPTION = \"\"\"\n    Consolidated source for waste collection services for ~60 local authorities.\n    Currently supports:\n    West Devon (Generic Provider)\n    South Hams (Generic Provider)\n    Market Harborough (Custom Provider)\n    \"\"\"\nURL = \"https://fccenvironment.co.uk\"\nEXTRA_INFO = [\n    {\"title\": \"Harborough District Council\", \"url\": \"https://harborough.gov.uk\"},\n    {\"title\": \"South Hams District Council\", \"url\": \"https://southhams.gov.uk/\"},\n    {\"title\": \"West Devon Borough Council\", \"url\": \"https://www.westdevon.gov.uk/\"},\n]\n\nTEST_CASES = {\n    \"14_LE16_9QX\": {\"uprn\": \"100030491624\"},  # region omitted to test default values\n    \"4_LE16_9QX\": {\"uprn\": \"100030491614\", \"region\": \"harborough\"},\n    \"16_LE16_7NA\": {\"uprn\": \"100030493289\", \"region\": \"harborough\"},\n    \"10_LE16_8ER\": {\"uprn\": \"200001136341\", \"region\": \"harborough\"},\n    \"9_PL20_7SH\": {\"uprn\": \"10001326315\", \"region\": \"westdevon\"},\n    \"3_PL20_7RY\": {\"uprn\": \"10001326041\", \"region\": \"westdevon\"},\n    \"2_PL21_9BN\": {\"uprn\": \"100040279446\", \"region\": \"southhams\"},\n    \"4_SL21_0HZ\": {\"uprn\": \"100040281987\", \"region\": \"southhams\"},\n}\n\nICON_MAP = {\n    \"Refuse\": \"mdi:trash-can\",\n    \"Recycling\": \"mdi:recycle\",\n    \"Garden\": \"mdi:leaf\",\n}\n\n\nclass Source:\n    def __init__(self, uprn: str, region: str = \"harborough\") -> None:\n        self.uprn = uprn\n        self.region = region\n\n    def getcollectiondetails(self, endpoint: str) -> list[Collection]:\n        domain = urlparse(endpoint).netloc\n        session = requests.Session()\n        cookies = session.get(f\"https://{domain}/\", verify=False)\n        response = session.post(\n            endpoint,\n            headers={\n                \"x-requested-with\": \"XMLHttpRequest\",\n            },\n            data={\n                \"fcc_session_token\": cookies.cookies[\"fcc_session_cookie\"],\n                \"uprn\": self.uprn,\n            },\n            verify=False,\n        )\n        results = {}\n        for item in response.json()[\"binCollections\"][\"tile\"]:\n            try:\n                soup = BeautifulSoup(item[0], \"html.parser\")\n                date = parser.parse(soup.find_all(\"b\")[2].text.split(\",\")[1].strip()).date()\n                service = soup.text.split(\"\\n\")[0]\n            except parser._parser.ParserError:\n                continue\n\n            \"\"\"\n            Handle duplication before creating the list of Collections\n            \"\"\"\n            for type in ICON_MAP:\n                if type in service:\n                    if type in results.keys():\n                        if date < results[type]:\n                            results[type] = date\n                    else:\n                        results[type] = date\n\n        entries = []\n        for result in results:\n            entries.append(\n                Collection(\n                    date=results[result],\n                    t=result,\n                    icon=ICON_MAP.get(result),\n                )\n            )\n        return entries\n\n    def harborough(self) -> list[Collection]:\n        _icons = {\n            \"NON-RECYCLABLE WASTE BIN COLLECTION\": \"mdi:trash-can\",\n            \"RECYCLING COLLECTION\": \"mdi:recycle\",\n            \"GARDEN WASTE COLLECTION\": \"mdi:leaf\",\n        }  # Custom icons to avoid a breaking change\n        r = requests.post(\n            \"https://www.fccenvironment.co.uk/harborough/detail-address\",\n            data={\"Uprn\": self.uprn},\n            verify=False,\n        )\n        soup = BeautifulSoup(r.text, \"html.parser\")\n        services = soup.find(\n            \"div\",\n            attrs={\"class\": \"blocks block-your-next-scheduled-bin-collection-days\"},\n        ).find_all(\"li\")\n        entries = []\n        for service in services:\n            for type in _icons:\n                if type.lower() in service.text.lower():\n                    try:\n                        date = parser.parse(service.find(\"span\", attrs={\"class\": \"pull-right\"}).text.strip()).date()\n                    except parser._parser.ParserError:\n                        continue\n\n                    entries.append(\n                        Collection(\n                            date=date,\n                            t=type,\n                            icon=_icons[type.upper()],\n                        )\n                    )\n        return entries\n\n    def fetch(self) -> list[Collection]:\n        if self.region == \"harborough\":\n            return self.harborough()\n        elif self.region == \"westdevon\":\n            return self.getcollectiondetails(\n                endpoint=\"https://westdevon.fccenvironment.co.uk/ajaxprocessor/getcollectiondetails\"\n            )\n        elif self.region == \"southhams\":\n            return self.getcollectiondetails(\n                endpoint=\"https://waste.southhams.gov.uk/mycollections/getcollectiondetails\"\n            )\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py"}], "after_files": [{"content": "from urllib.parse import urlparse\n\nimport requests\nimport urllib3\nfrom bs4 import BeautifulSoup\nfrom dateutil import parser\nfrom waste_collection_schedule import Collection\n\nurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\n\nTITLE = \"FCC Environment\"\nDESCRIPTION = \"\"\"\n    Consolidated source for waste collection services for ~60 local authorities.\n    Currently supports:\n    West Devon (Generic Provider)\n    South Hams (Generic Provider)\n    Market Harborough (Custom Provider)\n    \"\"\"\nURL = \"https://fccenvironment.co.uk\"\nEXTRA_INFO = [\n    {\"title\": \"Harborough District Council\", \"url\": \"https://harborough.gov.uk\"},\n    {\"title\": \"South Hams District Council\", \"url\": \"https://southhams.gov.uk/\"},\n    {\"title\": \"West Devon Borough Council\", \"url\": \"https://www.westdevon.gov.uk/\"},\n]\n\nTEST_CASES = {\n    \"14_LE16_9QX\": {\"uprn\": \"100030491624\"},  # region omitted to test default values\n    \"4_LE16_9QX\": {\"uprn\": \"100030491614\", \"region\": \"harborough\"},\n    \"16_LE16_7NA\": {\"uprn\": \"100030493289\", \"region\": \"harborough\"},\n    \"10_LE16_8ER\": {\"uprn\": \"200001136341\", \"region\": \"harborough\"},\n    \"9_PL20_7SH\": {\"uprn\": \"10001326315\", \"region\": \"westdevon\"},\n    \"3_PL20_7RY\": {\"uprn\": \"10001326041\", \"region\": \"westdevon\"},\n    \"2_PL21_9BN\": {\"uprn\": \"100040279446\", \"region\": \"southhams\"},\n    \"4_SL21_0HZ\": {\"uprn\": \"100040281987\", \"region\": \"southhams\"},\n}\n\nICON_MAP = {\n    \"Refuse\": \"mdi:trash-can\",\n    \"Recycling\": \"mdi:recycle\",\n    \"Garden\": \"mdi:leaf\",\n}\n\n\nclass Source:\n    def __init__(self, uprn: str, region: str = \"harborough\") -> None:\n        self.uprn = uprn\n        self.region = region\n\n    def getcollectiondetails(self, endpoint: str) -> list[Collection]:\n        domain = urlparse(endpoint).netloc\n        session = requests.Session()\n        cookies = session.get(f\"https://{domain}/\", verify=False)\n        response = session.post(\n            endpoint,\n            headers={\n                \"x-requested-with\": \"XMLHttpRequest\",\n            },\n            data={\n                \"fcc_session_token\": cookies.cookies[\"fcc_session_cookie\"],\n                \"uprn\": self.uprn,\n            },\n            verify=False,\n        )\n        results = {}\n        for item in response.json()[\"binCollections\"][\"tile\"]:\n            try:\n                soup = BeautifulSoup(item[0], \"html.parser\")\n                date = parser.parse(soup.find_all(\"b\")[2].text.split(\",\")[1].strip()).date()\n                service = soup.text.split(\"\\n\")[0]\n            except parser._parser.ParserError:\n                continue\n\n            \"\"\"\n            Handle duplication before creating the list of Collections\n            \"\"\"\n            for type in ICON_MAP:\n                if type in service:\n                    if type in results.keys():\n                        if date < results[type]:\n                            results[type] = date\n                    else:\n                        results[type] = date\n\n        entries = []\n        for result in results:\n            entries.append(\n                Collection(\n                    date=results[result],\n                    t=result,\n                    icon=ICON_MAP.get(result),\n                )\n            )\n        return entries\n\n    def harborough(self) -> list[Collection]:\n        _icons = {\n            \"NON-RECYCLABLE WASTE BIN COLLECTION\": \"mdi:trash-can\",\n            \"RECYCLING COLLECTION\": \"mdi:recycle\",\n            \"GARDEN WASTE COLLECTION\": \"mdi:leaf\",\n        }  # Custom icons to avoid a breaking change\n        r = requests.post(\n            \"https://harborough.fccenvironment.co.uk/detail-address\",\n            data={\"Uprn\": self.uprn},\n            verify=False,\n        )\n        soup = BeautifulSoup(r.text, \"html.parser\")\n        services = soup.find(\n            \"div\",\n            attrs={\"class\": \"blocks block-your-next-scheduled-bin-collection-days\"},\n        ).find_all(\"li\")\n        entries = []\n        for service in services:\n            for type in _icons:\n                if type.lower() in service.text.lower():\n                    try:\n                        date = parser.parse(service.find(\"span\", attrs={\"class\": \"pull-right\"}).text.strip()).date()\n                    except parser._parser.ParserError:\n                        continue\n\n                    entries.append(\n                        Collection(\n                            date=date,\n                            t=type,\n                            icon=_icons[type.upper()],\n                        )\n                    )\n        return entries\n\n    def fetch(self) -> list[Collection]:\n        if self.region == \"harborough\":\n            return self.harborough()\n        elif self.region == \"westdevon\":\n            return self.getcollectiondetails(\n                endpoint=\"https://westdevon.fccenvironment.co.uk/ajaxprocessor/getcollectiondetails\"\n            )\n        elif self.region == \"southhams\":\n            return self.getcollectiondetails(\n                endpoint=\"https://waste.southhams.gov.uk/mycollections/getcollectiondetails\"\n            )\n", "path": "custom_components/waste_collection_schedule/waste_collection_schedule/source/fccenvironment_co_uk.py"}]}