Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add lebensmitteltest update #148

Merged
merged 2 commits into from
Jun 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 23 additions & 36 deletions src/deutschland/lebensmittelwarnung/lebensmittelwarnung.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,40 +15,49 @@ class WarningFeedUrl:
VALID_CONTENT_SELECTORS = [
"alle",
"lebensmittel",
"kosmetische+mittel",
"kosmetischemittel",
"bedarfsgegenstaende",
"mittel+zum+taetowieren",
"mittelzumtaetowieren",
"babyundkinderprodukte",
]

VALID_REGION_SELECTORS = [
"alle_bundeslaender",
"baden_wuerttemberg",
"badenwuerttemberg",
"bayern",
"berlin",
"brandenburg",
"bremen",
"hamburg",
"hessen",
"mecklenburg_vorpommern",
"mecklenburgvorpommern",
"niedersachsen",
"nordrhein_westfalen",
"rheinland_pfalz",
"nordrheinwestfalen",
"rheinlandpfalz",
"saarland",
"sachsen",
"sachsen_anhalt",
"schleswig_holstein",
"sachsenanhalt",
"schleswigholstein",
"thueringen",
]

SOURCE_STRING = (
"https://www.lebensmittelwarnung.de/bvl-lmw-de/opensaga/feed/{0}/{1}.rss"
)
SOURCE_STRING = "https://www.lebensmittelwarnung.de/___LMW-Redaktion/RSSNewsfeed/Functions/RssFeeds/rssnewsfeed_Alle_DE.xml?nn=314268{0}{1}"

def __init__(self, content: str, region: str):
if (
content in self.VALID_CONTENT_SELECTORS
and region in self.VALID_REGION_SELECTORS
):
if content == "alle":
content = ""
else:
content = f"&type={content}"

if region == "alle_bundeslaender":
region = ""
else:
region = f"&state={region}"

self.url = self.SOURCE_STRING.format(content, region)
else:
raise ValueError(
Expand Down Expand Up @@ -117,33 +126,11 @@ def __init__(self, warning_raw: PageElement):

def __parse(self, warning_raw: PageElement) -> str:
guid = warning_raw.find("guid").text
self.dict["id"] = int(guid.split("/")[-1])
self.dict["guid"] = guid
self.dict["pubDate"] = warning_raw.find("pubDate").text

cdata_soup = BeautifulSoup(
# use description instead of content:encoded, wierd parsing issue
warning_raw.find("description").text,
"html.parser",
)
image_elem = cdata_soup.find("img")
if image_elem:
self.dict["imgSrc"] = image_elem["src"]
content_attrs = cdata_soup.find_all("b")
for attr in content_attrs:
attr_name = attr.text
attr_value = str(attr.next_sibling).strip()
if attr_name == "Produktbezeichnung:":
self.dict["title"] = attr_value
elif attr_name == "Typ:":
self.dict["type"] = attr_value
elif attr_name == "Hersteller (Inverkehrbringer):":
self.dict["manufacturer"] = attr_value
elif attr_name == "Grund der Warnung:":
self.dict["warning"] = attr_value
elif attr_name == "Betroffene Länder:":
affected_arr = [x.strip() for x in attr_value.split(",")]
self.dict["affectedStates"] = affected_arr
self.dict["description"] = warning_raw.find("description").text
self.dict["link"] = guid
self.dict["title"] = warning_raw.find("title").text

def get_warning(self) -> dict:
return self.dict
Expand Down
77 changes: 60 additions & 17 deletions tests/lebensmittelwarnung_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,21 @@ def test_lebensmittelwarnung_warningfeedurl_create():
Checks if the WarningFeedUrl() works correctly.
"""
url = WarningFeedUrl("alle", "berlin").get_url()
correct_url = (
"https://www.lebensmittelwarnung.de/bvl-lmw-de/opensaga/feed/alle/berlin.rss"
)
correct_url = "https://www.lebensmittelwarnung.de/___LMW-Redaktion/RSSNewsfeed/Functions/RssFeeds/rssnewsfeed_Alle_DE.xml?nn=314268&state=berlin"
assert url == correct_url, "WarningFeedUrl creation failed (result: " + url + ")"


def test_lebensmittelwarnung_warning_parsing():
"""
Checks if the Warning parsing works correctly.
"""
warning_raw_string = '<item> <title>TITLE</title> <link>https://www.lebensmittelwarnung.de/bvl-lmw-de/detail/lebensmittel/1</link> <description><![CDATA[<img src="IMG_URL" width="100" /><br/> <b>Produktbezeichnung:</b> TITLE<br/> <b>Typ:</b> TYPE<br/> <b>Hersteller (Inverkehrbringer):</b> MANUFACTURER<br/> <b>Grund der Warnung:</b> WARNING<br/> <b>Betroffene Länder:</b> STATE A, STATE B<br/> ]]></description> <content:encoded><![CDATA[<img src="IMG_URL" width="100" /><br/> <b>Produktbezeichnung:</b> TITLE<br/> <b>Typ:</b> TYPE<br/> <b>Hersteller (Inverkehrbringer):</b> MANUFACTURER<br/> <b>Grund der Warnung:</b> WARNING<br/> <b>Betroffene Länder:</b> STATE A, STATE B<br/> ]]></content:encoded> <pubDate>Wed, 08 Sep 2021 10:00:00 +0000</pubDate> <guid>https://www.lebensmittelwarnung.de/bvl-lmw-de/detail/lebensmittel/1</guid> </item>'
warning_raw_string = "<item><title>Spirit Motors Johnny Bglove Lederhandschuh Kurz</title><link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html</link><pubDate>Fri, 14 Jun 2024 14:12:17 +0200</pubDate><description/><guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html</guid></item>"
warning_correct = {
"id": 1,
"guid": "https://www.lebensmittelwarnung.de/bvl-lmw-de/detail/lebensmittel/1",
"pubDate": "Wed, 08 Sep 2021 10:00:00 +0000",
"imgSrc": "IMG_URL",
"title": "TITLE",
"type": "TYPE",
"manufacturer": "MANUFACTURER",
"warning": "WARNING",
"affectedStates": ["STATE A", "STATE B"],
"guid": "https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html",
"pubDate": "Fri, 14 Jun 2024 14:12:17 +0200",
"title": "Spirit Motors Johnny Bglove Lederhandschuh Kurz",
"link": "https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html",
"description": "",
}
warning_raw = BeautifulSoup(warning_raw_string, "xml").find("item")
warning = Warning(warning_raw).get_warning()
Expand All @@ -79,12 +73,61 @@ def test_lebensmittelwarnung_warningfeed_parsing():
"""
Checks if the WarningFeed parsing works correctly.
"""
item_count = 5
warning_raw_item = '<item> <title>TITLE</title> <link>https://www.lebensmittelwarnung.de/bvl-lmw-de/detail/lebensmittel/1</link> <description><![CDATA[<img src="IMG_URL" width="100" /><br/> <b>Produktbezeichnung:</b> TITLE<br/> <b>Typ:</b> TYPE<br/> <b>Hersteller (Inverkehrbringer):</b> MANUFACTURER<br/> <b>Grund der Warnung:</b> WARNING<br/> <b>Betroffene Länder:</b> STATE A, STATE B<br/> ]]></description> <content:encoded><![CDATA[<img src="IMG_URL" width="100" /><br/> <b>Produktbezeichnung:</b> TITLE<br/> <b>Typ:</b> TYPE<br/> <b>Hersteller (Inverkehrbringer):</b> MANUFACTURER<br/> <b>Grund der Warnung:</b> WARNING<br/> <b>Betroffene Länder:</b> STATE A, STATE B<br/> ]]></content:encoded> <pubDate>Wed, 08 Sep 2021 10:00:00 +0000</pubDate> <guid>https://www.lebensmittelwarnung.de/bvl-lmw-de/detail/lebensmittel/1</guid> </item>'
item_count = 7
warning_raw_item = """
<item>
<title>Spirit Motors Johnny Bglove Lederhandschuh Kurz</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html</link>
<pubDate>Fri, 14 Jun 2024 14:12:17 +0200</pubDate>
<description/>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_10_NW_Handschuhe/240614_NW_Handschuhe_Meldung.html</guid>
</item>
<item>
<title>Hähnchengeschnetzeltes in Champignon – Rahmsauce mit Spiralnudeln 400 Gramm</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_12_BY_Haenchengeschnetzeltes/240614_11_BY_Haenchengeschnetzeltes.html</link>
<pubDate>Fri, 14 Jun 2024 10:23:00 +0200</pubDate>
<description>27.07.24: K219193; 01.08.24: K219194, K219195; 30.07.24: K226282, K226281, K232681</description>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240614_12_BY_Haenchengeschnetzeltes/240614_11_BY_Haenchengeschnetzeltes.html</guid>
</item>
<item>
<title>Alpina Nylon Küchenzubehör</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240610_08_NW_Kuechenzubehoer/240610_NW_Kuechenzubehoer_Meldung.html</link>
<pubDate>Mon, 10 Jun 2024 16:00:00 +0200</pubDate>
<description>alle</description>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240610_08_NW_Kuechenzubehoer/240610_NW_Kuechenzubehoer_Meldung.html</guid>
</item>
<item>
<title>Diverse Salamiprodukte</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240607_07_SH_diverse_Salamiprodukte/240607_1_SH_diverse_Salamiprodukte.html</link>
<pubDate>Mon, 10 Jun 2024 07:12:12 +0200</pubDate>
<description/>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240607_07_SH_diverse_Salamiprodukte/240607_1_SH_diverse_Salamiprodukte.html</guid>
</item>
<item>
<title>Gel Mouse Pad</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240606_05_NW_Mousepad/240606_NW_Mousepad_Meldung.html</link>
<pubDate>Thu, 6 Jun 2024 11:23:00 +0200</pubDate>
<description/>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240606_05_NW_Mousepad/240606_NW_Mousepad_Meldung.html</guid>
</item>
<item>
<title>Thüringer Knacker 4x75g (300g)</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240605_03_TH_Thueringer_Knacker/240605_TH_Thueringer_Knacker.html</link>
<pubDate>Wed, 5 Jun 2024 10:12:00 +0200</pubDate>
<description>982203</description>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/06_Juni/240605_03_TH_Thueringer_Knacker/240605_TH_Thueringer_Knacker.html</guid>
</item>
<item>
<title>Honig Herbal Paste</title>
<link>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/05_Mai/240529_6_BW_Honig_Paste/240529_6_BW_Honig_Paste.html</link>
<pubDate>Wed, 29 May 2024 19:00:00 +0200</pubDate>
<description>Alle Chargen</description>
<guid>https://www.lebensmittelwarnung.de/___lebensmittelwarnung.de/Meldungen/2024/05_Mai/240529_6_BW_Honig_Paste/240529_6_BW_Honig_Paste.html</guid>
</item>
"""
warning_raw_pre = "<rss><channel>"
warning_raw_post = "</channel></rss>"
warning_raw = warning_raw_pre + (warning_raw_item * item_count) + warning_raw_post
print(warning_raw)
warning_raw = warning_raw_pre + (warning_raw_item) + warning_raw_post
feed = WarningFeed(warning_raw).get_output()
assert (
len(feed) == item_count
Expand Down
Loading