Repository: radomirbosak/duden

Issue:
The `--meaning-overview` option contains extra text
Currently, the program parses the text from the correct page paragraph, but includes a lot of unneeded text, such as examples and figure labels.

Example:
```
python -m duden.main 'Hase' --meaning-overview
 0.  a. wild lebendes Säugetier mit langen Ohren, einem dichten, weichen, bräunlichen Fell und langen Hinterbeinen   © jay - Fotolia.comBeispieleer ist furchtsam wie ein Haseder Hase macht Männchen, hoppelt, schlägt Hakeneinen Hasen hetzen, schießen, abziehen, bratenWendungen, Redensarten, Sprichwörterein alter Hase (umgangssprachlich: jemand, der sehr viel Erfahrung [in einer bestimmten Sache] hat)heuriger Hase (umgangssprachlich: Neuling: es macht ihm Spaß, die heurigen Hasen herumzukommandieren; der ältere Hase hat Erfahrung darin, dem Jäger zu entkommen, im Gegensatz zu einem erst einjährigen Hasen)falscher/Falscher Hase (Hackbraten)sehen, wissen, erkennen, begreifen, wie der Hase läuft (umgangssprachlich: erkennen, vorhersagen können, wie eine Sache weitergeht; nach der Vorstellung, dass ein erfahrener Jäger nach kurzer Zeit beobachtenden Abwartens erkennen kann, in welche Richtung ein Hase flieht, auch wenn er viele Haken schlägt)da liegt der Hase im Pfeffer (umgangssprachlich: das ist der entscheidende Punkt, die eigentliche Ursache; mit Bezug auf den fertig zubereiteten Hasenbraten in einer scharf gewürzten Soße, womit angedeutet wird, dass jemand aus einer bestimmten Lage nicht mehr herauskommt)
     b. männlicher Hase (1a)
     c. Hasenbraten, -gerichtBeispieles gibt heute Hase
     d. Kaninchen   © MEV Verlag, AugsburgGebrauchlandschaftlich

 1. Schrittmacher (3)GebrauchSportjargon

 2.  a. Mädchen, FrauGebrauchsaloppBeispieleein scharfer Hasekennst du die Hasen im Klub?
     b. Kosewort, besonders für Kinder
```

Discussion:

Patch:
diff --git a/duden/main.py b/duden/main.py
index 8d48eba..b14f493 100755
--- a/duden/main.py
+++ b/duden/main.py
@@ -251,6 +251,19 @@ class DudenWord():
             or self.soup.find('div', id='bedeutungen')
         if section is None:
             return None
+        section = copy.copy(section)
+        section.header.extract()
+
+        # 1. remove examples
+        for dl in section.find_all('dl', class_='note'):
+            if True or dl.dt.text == 'Beispiele':
+                dl.extract()
+
+        # 2. remove grammar parts
+        for dl in section.find_all('dl', class_='tuple'):
+            if dl.dt.text in ['Grammatik', 'Gebrauch']:
+                dl.extract()
+
         return recursively_extract(
             section, maxdepth=2, exfun=lambda x: x.text.strip())
 


Test patch:
diff --git a/tests/test_data/Kragen.json b/tests/test_data/Kragen.json
index 2a464b7..b422006 100644
--- a/tests/test_data/Kragen.json
+++ b/tests/test_data/Kragen.json
@@ -10,7 +10,7 @@
 
     "word_separation": ["Kra", "gen"],
 
-    "meaning_overview": [["den Hals teilweise oder ganz umschließender Teil der Kleidung", "einzelner, nicht fest an ein Kleidungsstück genähter Kragen"], ["(landschaftlich) (meist von Geflügel) Hals", "(landschaftlich) Hals einer Flasche"], "(Jägersprache) gegen das übrige Fell oder Gefieder abstechender Streifen um den, am Hals von Tieren", "in »jemandem platzt der Kragen« und anderen Wendungen, Redensarten oder Sprichwörtern"],
+    "meaning_overview": [["den Hals teilweise oder ganz umschließender Teil der Kleidung", "einzelner, nicht fest an ein Kleidungsstück genähter Kragen (1a)"], ["(meist von Geflügel) Hals", "Hals einer Flasche"], "gegen das übrige Fell oder Gefieder abstechender Streifen um den, am Hals von Tieren", ""],
     "origin": "mittelhochdeutsch krage = Hals, Kehle, Nacken; Kragen (1), ursprünglich = Schlund",
     "compounds": null,
     "grammar_raw": [],
diff --git a/tests/test_data/laufen.json b/tests/test_data/laufen.json
index d0f0469..2b921e5 100644
--- a/tests/test_data/laufen.json
+++ b/tests/test_data/laufen.json
@@ -10,7 +10,7 @@
 
     "word_separation": ["lau", "fen"],
 
-    "meaning_overview": [["sich in aufrechter Haltung auf den Füßen in schnellerem Tempo so fortbewegen, dass sich jeweils schrittweise für einen kurzen Augenblick beide Sohlen vom Boden lösen", "(umgangssprachlich) gehen", "zu Fuß gehen", "die Fähigkeit haben, sich auf den Beinen gehend fortzubewegen", "beim Laufen an, gegen etwas geraten, stoßen", "(von bestimmten Tieren) sich [schnell, flink] fortbewegen"], "eine bestimmte Strecke gehend zurücklegen", ["sich durch Laufen in einen bestimmten Zustand versetzen", "durch Laufen etwas, einen bestimmten Körperteil in einen bestimmten Zustand versetzen", "[unter bestimmten Umständen] in bestimmter Weise gehen können"], "(umgangssprachlich; meist leicht abwertend) sich ständig [aus Gewohnheit] irgendwohin begeben", ["an einem Laufwettbewerb, Rennen teilnehmen", "in einem sportlichen Wettbewerb, Rennen als Läufer eine bestimmte Zeit erzielen, erreichen", "in einem sportlichen Wettbewerb eine bestimmte Strecke zurücklegen", "sich unter bestimmten Umständen, in bestimmter Weise als Läufer betätigen"], ["die Fähigkeit haben, sich mit einem an den Füßen befestigten Sportgerät fortzubewegen", "sich auf einem an den Füßen befestigten Sportgerät fortbewegen"], ["in Gang, in Betrieb sein", "sich [gleichmäßig, gleitend] durch, über, um etwas bewegen"], "(gelegentlich Fachsprache) fahren", ["fließen", "Wasser, Flüssigkeit austreten, ausfließen lassen"], "sich in bestimmter Richtung erstrecken; in bestimmter Richtung verlaufen", ["[in bestimmter Weise] vor sich gehen, vonstattengehen, verlaufen", "eingeleitet, aber nicht abgeschlossen oder entschieden sein"], "Gültigkeit haben; wirksam sein", "in einer Kartei o.\u2002Ä. geführt, registriert, festgehalten sein", "programmgemäß vorgeführt, dargeboten, ausgestrahlt werden", "(umgangssprachlich) sich günstig entwickeln"],
+    "meaning_overview": [["sich in aufrechter Haltung auf den Füßen in schnellerem Tempo so fortbewegen, dass sich jeweils schrittweise für einen kurzen Augenblick beide Sohlen vom Boden lösen", "gehen (1)", "zu Fuß gehen", "die Fähigkeit haben, sich auf den Beinen gehend fortzubewegen", "beim Laufen (1a, b) an, gegen etwas geraten, stoßen", "(von bestimmten Tieren) sich [schnell, flink] fortbewegen"], "eine bestimmte Strecke gehend zurücklegen", ["sich durch Laufen in einen bestimmten Zustand versetzen", "durch Laufen etwas, einen bestimmten Körperteil in einen bestimmten Zustand versetzen", "[unter bestimmten Umständen] in bestimmter Weise gehen (1) können"], "sich ständig [aus Gewohnheit] irgendwohin begeben", ["an einem Laufwettbewerb, Rennen teilnehmen", "in einem sportlichen Wettbewerb, Rennen als Läufer eine bestimmte Zeit erzielen, erreichen", "in einem sportlichen Wettbewerb eine bestimmte Strecke zurücklegen", "sich unter bestimmten Umständen, in bestimmter Weise als Läufer betätigen"], ["die Fähigkeit haben, sich mit einem an den Füßen befestigten Sportgerät fortzubewegen", "sich auf einem an den Füßen befestigten Sportgerät fortbewegen"], ["in Gang, in Betrieb sein", "sich [gleichmäßig, gleitend] durch, über, um etwas bewegen"], "fahren (1a)", ["fließen", "Wasser, Flüssigkeit austreten, ausfließen lassen"], "sich in bestimmter Richtung erstrecken; in bestimmter Richtung verlaufen", ["[in bestimmter Weise] vor sich gehen, vonstattengehen, verlaufen", "eingeleitet, aber nicht abgeschlossen oder entschieden sein"], "Gültigkeit haben; wirksam sein", "in einer Kartei o.\u00A0Ä. geführt, registriert, festgehalten sein", "programmgemäß vorgeführt, dargeboten, ausgestrahlt werden", "sich günstig entwickeln"],
     "origin": "mittelhochdeutsch loufen, althochdeutsch (h)louf(f)an, wahrscheinlich ursprünglich = (im Kreise) hüpfen, tanzen",
     "compounds": {"adjektive": ["schief", "gut", "dumm", "parallel", "glatt", "rot", "optimal", "reibungslos"], "substantive": ["Gefahr", "Hochtour", "Ruder", "Geschäft", "Amok", "Vertrag", "Vorbereitung"]},
     "grammar_raw": [[["Indikativ", "Person I", "Singular", "Präsens"], "ich laufe"], [["Konjunktiv I", "Person I", "Singular", "Präsens"], "ich laufe"], [["Imperativ", "Singular", "Person I", "Präsens"], "–"], [["Person II", "Indikativ", "Singular", "Präsens"], "du läufst"], [["Konjunktiv I", "Person II", "Singular", "Präsens"], "du laufest"], [["Person II", "Imperativ", "Singular", "Präsens"], "lauf, laufe!"], [["Indikativ", "Person III", "Singular", "Präsens"], "er/sie/es läuft"], [["Konjunktiv I", "Person III", "Singular", "Präsens"], "er/sie/es laufe"], [["Person III", "Imperativ", "Singular", "Präsens"], "–"], [["Indikativ", "Person I", "Präsens", "Plural"], "wir laufen"], [["Konjunktiv I", "Person I", "Präsens", "Plural"], "wir laufen"], [["Imperativ", "Person I", "Präsens", "Plural"], "–"], [["Indikativ", "Person II", "Präsens", "Plural"], "ihr lauft"], [["Konjunktiv I", "Person II", "Präsens", "Plural"], "ihr laufet"], [["Person II", "Imperativ", "Plural", "Präsens"], "lauft!"], [["Indikativ", "Person III", "Präsens", "Plural"], "sie laufen"], [["Konjunktiv I", "Person III", "Präsens", "Plural"], "sie laufen"], [["Person III", "Imperativ", "Präsens", "Plural"], "–"], [["Indikativ", "Person I", "Präteritum", "Singular"], "ich lief"], [["Person I", "Präteritum", "Konjunktiv II", "Singular"], "ich liefe"], [["Person II", "Indikativ", "Präteritum", "Singular"], "du liefst"], [["Person II", "Präteritum", "Konjunktiv II", "Singular"], "du liefest"], [["Indikativ", "Person III", "Präteritum", "Singular"], "er/sie/es lief"], [["Person III", "Präteritum", "Konjunktiv II", "Singular"], "er/sie/es liefe"], [["Person I", "Präteritum", "Indikativ", "Plural"], "wir liefen"], [["Person I", "Präteritum", "Konjunktiv II", "Plural"], "wir liefen"], [["Person II", "Präteritum", "Indikativ", "Plural"], "ihr lieft"], [["Person II", "Präteritum", "Konjunktiv II", "Plural"], "ihr liefet"], [["Person III", "Präteritum", "Indikativ", "Plural"], "sie liefen"], [["Person III", "Präteritum", "Konjunktiv II", "Plural"], "sie liefen"], [["Partizip I"], "laufend"], [["Partizip II"], "gelaufen"], [["Infinitiv mit zu"], "zu laufen"]],
diff --git a/tests/test_online_attributes.py b/tests/test_online_attributes.py
index c60f41e..d929dd5 100644
--- a/tests/test_online_attributes.py
+++ b/tests/test_online_attributes.py
@@ -50,7 +50,6 @@ def test_basic_attributes(parsed_word, expected_json, attribute):
     assert getattr(parsed_word, attribute) == expected_json[attribute]
 
 
-@pytest.mark.xfail
 @word_param
 def test_meaning_overview(parsed_word, expected_json):
     assert parsed_word.meaning_overview == expected_json['meaning_overview']