We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Food Warehouse spider missing a handful of stores
The spider for "The Food Warehouse" at https://github.com/alltheplaces/alltheplaces/blob/master/locations/spiders/the_food_warehouse_gb.py appears to be missing a small number (probably around 8) stores. These include:

* https://www.thefoodwarehouse.com/store-locator/exeter
* https://www.thefoodwarehouse.com/store-locator/falkirk
* https://www.thefoodwarehouse.com/store-locator/Norwich-Longwater
* https://www.thefoodwarehouse.com/store-locator/york-foss-islands

The spider gets the store details from https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/ . The above stores are all listed there, and I can't see any obvious problems with the data for them, but they're not returned in the dataset at https://alltheplaces-data.openaddresses.io/runs/2024-04-13-13-32-00/output/the_food_warehouse_gb.geojson . The number of stores returned by the spider appears stable, and it looks like the stores above are consistently absent from the returned datasets.

There's nothing in the error log to indicate any problems. I don't know what it signifies, but the stats at https://alltheplaces-data.openaddresses.io/runs/2024-04-13-13-32-00/stats/the_food_warehouse_gb.json say item_dropped_count=8 and 
item_dropped_reasons_count/DropItem=8. I'm guessing that these could be the missing stores, but I don't know why they've been 'dropped'.

There are currently 187 items in the JSON at https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/ . 5 include "coming soon" in the name, so (correctly) aren't returned by the spider. There's another two that include "now open", so may have been "coming soon" at the last run. That would leave 180 stores to be returned. The number actually returned at the last run was 172, which probably matches the 8 described as being dropped in the stats.

Can anyone see what's going wrong here, and why these stores aren't being returned?

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `locations/spiders/the_food_warehouse_gb.py`
Content:
```
1 from scrapy import Spider
2 
3 from locations.categories import Categories
4 from locations.dict_parser import DictParser
5 from locations.hours import OpeningHours
6 
7 
8 class TheFoodWarehouseGBSpider(Spider):
9     name = "the_food_warehouse_gb"
10     item_attributes = {
11         "brand": "The Food Warehouse",
12         "brand_wikidata": "Q87263899",
13         "extras": Categories.SHOP_SUPERMARKET.value,
14     }
15     allowed_domains = ["www.thefoodwarehouse.com"]
16     start_urls = ["https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/"]
17 
18     def parse(self, response):
19         for store in response.json():
20             item = DictParser.parse(store)
21             if "CLOSED" in item["name"].upper() or "COMING SOON" in item["name"].upper():
22                 continue
23             item["ref"] = store["storeNo"]
24             item["website"] = "https://www.thefoodwarehouse.com" + store["url"]
25             item["phone"] = store.get("store-number")
26             item["addr_full"] = (
27                 item["addr_full"].replace("<br>", "").replace("<br />", "").replace("<p>", "").replace("</p>", "")
28             )
29             item["opening_hours"] = OpeningHours()
30             item["opening_hours"].add_ranges_from_string(store.get("opening-times", ""))
31             yield item
32
```
--- 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/locations/spiders/the_food_warehouse_gb.py b/locations/spiders/the_food_warehouse_gb.py
--- a/locations/spiders/the_food_warehouse_gb.py
+++ b/locations/spiders/the_food_warehouse_gb.py
@@ -1,8 +1,9 @@
-from scrapy import Spider
+from scrapy import Selector, Spider
 
 from locations.categories import Categories
 from locations.dict_parser import DictParser
 from locations.hours import OpeningHours
+from locations.pipelines.address_clean_up import merge_address_lines
 
 
 class TheFoodWarehouseGBSpider(Spider):
@@ -14,18 +15,18 @@
     }
     allowed_domains = ["www.thefoodwarehouse.com"]
     start_urls = ["https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/"]
+    no_refs = True  # https://github.com/alltheplaces/alltheplaces/issues/8237
 
     def parse(self, response):
         for store in response.json():
             item = DictParser.parse(store)
             if "CLOSED" in item["name"].upper() or "COMING SOON" in item["name"].upper():
                 continue
-            item["ref"] = store["storeNo"]
-            item["website"] = "https://www.thefoodwarehouse.com" + store["url"]
+            if store["url"] != "/store-locator/default-store":
+                item["website"] = "https://www.thefoodwarehouse.com" + store["url"]
+            item["branch"] = item.pop("name").removesuffix(" - Now Open")
             item["phone"] = store.get("store-number")
-            item["addr_full"] = (
-                item["addr_full"].replace("<br>", "").replace("<br />", "").replace("<p>", "").replace("</p>", "")
-            )
+            item["addr_full"] = merge_address_lines(Selector(text=item["addr_full"]).xpath("//text()").getall())
             item["opening_hours"] = OpeningHours()
             item["opening_hours"].add_ranges_from_string(store.get("opening-times", ""))
             yield item

{"golden_diff": "diff --git a/locations/spiders/the_food_warehouse_gb.py b/locations/spiders/the_food_warehouse_gb.py\n--- a/locations/spiders/the_food_warehouse_gb.py\n+++ b/locations/spiders/the_food_warehouse_gb.py\n@@ -1,8 +1,9 @@\n-from scrapy import Spider\n+from scrapy import Selector, Spider\n \n from locations.categories import Categories\n from locations.dict_parser import DictParser\n from locations.hours import OpeningHours\n+from locations.pipelines.address_clean_up import merge_address_lines\n \n \n class TheFoodWarehouseGBSpider(Spider):\n@@ -14,18 +15,18 @@\n     }\n     allowed_domains = [\"www.thefoodwarehouse.com\"]\n     start_urls = [\"https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/\"]\n+    no_refs = True  # https://github.com/alltheplaces/alltheplaces/issues/8237\n \n     def parse(self, response):\n         for store in response.json():\n             item = DictParser.parse(store)\n             if \"CLOSED\" in item[\"name\"].upper() or \"COMING SOON\" in item[\"name\"].upper():\n                 continue\n-            item[\"ref\"] = store[\"storeNo\"]\n-            item[\"website\"] = \"https://www.thefoodwarehouse.com\" + store[\"url\"]\n+            if store[\"url\"] != \"/store-locator/default-store\":\n+                item[\"website\"] = \"https://www.thefoodwarehouse.com\" + store[\"url\"]\n+            item[\"branch\"] = item.pop(\"name\").removesuffix(\" - Now Open\")\n             item[\"phone\"] = store.get(\"store-number\")\n-            item[\"addr_full\"] = (\n-                item[\"addr_full\"].replace(\"<br>\", \"\").replace(\"<br />\", \"\").replace(\"<p>\", \"\").replace(\"</p>\", \"\")\n-            )\n+            item[\"addr_full\"] = merge_address_lines(Selector(text=item[\"addr_full\"]).xpath(\"//text()\").getall())\n             item[\"opening_hours\"] = OpeningHours()\n             item[\"opening_hours\"].add_ranges_from_string(store.get(\"opening-times\", \"\"))\n             yield item\n", "issue": "Food Warehouse spider missing a handful of stores\nThe spider for \"The Food Warehouse\" at https://github.com/alltheplaces/alltheplaces/blob/master/locations/spiders/the_food_warehouse_gb.py appears to be missing a small number (probably around 8) stores. These include:\r\n\r\n* https://www.thefoodwarehouse.com/store-locator/exeter\r\n* https://www.thefoodwarehouse.com/store-locator/falkirk\r\n* https://www.thefoodwarehouse.com/store-locator/Norwich-Longwater\r\n* https://www.thefoodwarehouse.com/store-locator/york-foss-islands\r\n\r\nThe spider gets the store details from https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/ . The above stores are all listed there, and I can't see any obvious problems with the data for them, but they're not returned in the dataset at https://alltheplaces-data.openaddresses.io/runs/2024-04-13-13-32-00/output/the_food_warehouse_gb.geojson . The number of stores returned by the spider appears stable, and it looks like the stores above are consistently absent from the returned datasets.\r\n\r\nThere's nothing in the error log to indicate any problems. I don't know what it signifies, but the stats at https://alltheplaces-data.openaddresses.io/runs/2024-04-13-13-32-00/stats/the_food_warehouse_gb.json say item_dropped_count=8 and \r\nitem_dropped_reasons_count/DropItem=8. I'm guessing that these could be the missing stores, but I don't know why they've been 'dropped'.\r\n\r\nThere are currently 187 items in the JSON at https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/ . 5 include \"coming soon\" in the name, so (correctly) aren't returned by the spider. There's another two that include \"now open\", so may have been \"coming soon\" at the last run. That would leave 180 stores to be returned. The number actually returned at the last run was 172, which probably matches the 8 described as being dropped in the stats.\r\n\r\nCan anyone see what's going wrong here, and why these stores aren't being returned?\n", "before_files": [{"content": "from scrapy import Spider\n\nfrom locations.categories import Categories\nfrom locations.dict_parser import DictParser\nfrom locations.hours import OpeningHours\n\n\nclass TheFoodWarehouseGBSpider(Spider):\n    name = \"the_food_warehouse_gb\"\n    item_attributes = {\n        \"brand\": \"The Food Warehouse\",\n        \"brand_wikidata\": \"Q87263899\",\n        \"extras\": Categories.SHOP_SUPERMARKET.value,\n    }\n    allowed_domains = [\"www.thefoodwarehouse.com\"]\n    start_urls = [\"https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/\"]\n\n    def parse(self, response):\n        for store in response.json():\n            item = DictParser.parse(store)\n            if \"CLOSED\" in item[\"name\"].upper() or \"COMING SOON\" in item[\"name\"].upper():\n                continue\n            item[\"ref\"] = store[\"storeNo\"]\n            item[\"website\"] = \"https://www.thefoodwarehouse.com\" + store[\"url\"]\n            item[\"phone\"] = store.get(\"store-number\")\n            item[\"addr_full\"] = (\n                item[\"addr_full\"].replace(\"<br>\", \"\").replace(\"<br />\", \"\").replace(\"<p>\", \"\").replace(\"</p>\", \"\")\n            )\n            item[\"opening_hours\"] = OpeningHours()\n            item[\"opening_hours\"].add_ranges_from_string(store.get(\"opening-times\", \"\"))\n            yield item\n", "path": "locations/spiders/the_food_warehouse_gb.py"}], "after_files": [{"content": "from scrapy import Selector, Spider\n\nfrom locations.categories import Categories\nfrom locations.dict_parser import DictParser\nfrom locations.hours import OpeningHours\nfrom locations.pipelines.address_clean_up import merge_address_lines\n\n\nclass TheFoodWarehouseGBSpider(Spider):\n    name = \"the_food_warehouse_gb\"\n    item_attributes = {\n        \"brand\": \"The Food Warehouse\",\n        \"brand_wikidata\": \"Q87263899\",\n        \"extras\": Categories.SHOP_SUPERMARKET.value,\n    }\n    allowed_domains = [\"www.thefoodwarehouse.com\"]\n    start_urls = [\"https://www.thefoodwarehouse.com/assets/foodwarehouse/ajax/\"]\n    no_refs = True  # https://github.com/alltheplaces/alltheplaces/issues/8237\n\n    def parse(self, response):\n        for store in response.json():\n            item = DictParser.parse(store)\n            if \"CLOSED\" in item[\"name\"].upper() or \"COMING SOON\" in item[\"name\"].upper():\n                continue\n            if store[\"url\"] != \"/store-locator/default-store\":\n                item[\"website\"] = \"https://www.thefoodwarehouse.com\" + store[\"url\"]\n            item[\"branch\"] = item.pop(\"name\").removesuffix(\" - Now Open\")\n            item[\"phone\"] = store.get(\"store-number\")\n            item[\"addr_full\"] = merge_address_lines(Selector(text=item[\"addr_full\"]).xpath(\"//text()\").getall())\n            item[\"opening_hours\"] = OpeningHours()\n            item[\"opening_hours\"].add_ranges_from_string(store.get(\"opening-times\", \"\"))\n            yield item\n", "path": "locations/spiders/the_food_warehouse_gb.py"}]}