diff --git a/README.md b/README.md index eb49c562..ee4e7c37 100644 --- a/README.md +++ b/README.md @@ -68,24 +68,25 @@ That's already it! If you run this code, it should print out something like this: ```console -Fundus-Article: +Fundus-Article including 1 image(s): - Title: "Feinstein's Return Not Enough for Confirmation of Controversial New [...]" -- Text: "Democrats jammed three of President Joe Biden's controversial court nominees - through committee votes on Thursday thanks to a last-minute [...]" +- Text: "89-year-old California senator arrived hour late to Judiciary Committee hearing + to advance President Biden's stalled nominations Democrats [...]" - URL: https://freebeacon.com/politics/feinsteins-return-not-enough-for-confirmation-of-controversial-new-hampshire-judicial-nominee/ -- From: FreeBeacon (2023-05-11 18:41) +- From: The Washington Free Beacon (2023-05-11 18:41) -Fundus-Article: +Fundus-Article including 3 image(s): - Title: "Northwestern student government freezes College Republicans funding over [...]" - Text: "Student government at Northwestern University in Illinois "indefinitely" froze the funds of the university's chapter of College Republicans [...]" - URL: https://www.foxnews.com/us/northwestern-student-government-freezes-college-republicans-funding-poster-critical-lgbtq-community -- From: FoxNews (2023-05-09 14:37) +- From: Fox News (2023-05-09 14:37) ``` This printout tells you that you successfully crawled two articles! For each article, the printout details: +- the number of images included in the article - the "Title" of the article, i.e. its headline - the "Text", i.e. the main article body text - the "URL" from which it was crawled @@ -146,6 +147,57 @@ for article in crawler.crawl(max_articles=1000000): ```` +## Example 4: Crawl some images + +By default, Fundus tries to parse the images included in every crawled article. +Let's crawl an article and print out the images for some more details. + +```python +from fundus import PublisherCollection, Crawler + +# initialize the crawler for The LA Times +crawler = Crawler(PublisherCollection.us.LATimes) + +# crawl 1 article and print the images +for article in crawler.crawl(max_articles=1): + for image in article.images: + print(image) +``` + +For [this article](https://www.latimes.com/sports/lakers/story/2024-12-13/lakers-lebron-james-away-from-team-timberwolves) you will get the following output: + +```console +Fundus-Article Cover-Image: +-URL: 'https://ca-times.brightspotcdn.com/dims4/default/41c9bc4/2147483647/strip/true/crop/4598x3065+0+0/resize/1200x800!/format/webp/quality/75/?url=https%3A%2F%2Fcalifornia-times-brightspot.s3.amazonaws.com%2F77%2Feb%2F7fed2d3942fd97b0f7325e7060cf%2Flakers-timberwolves-basketball-33765.jpg' +-Description: 'Minnesota Timberwolves forward Julius Randle (30) works toward the basket.' +-Caption: 'Minnesota Timberwolves forward Julius Randle, left, controls the ball in front of Lakers forward Anthony Davis during the first half of the Lakers’ 97-87 loss Friday.' +-Authors: ['Abbie Parr / Associated Press'] +-Versions: [320x213, 568x379, 768x512, 1024x683, 1200x800] + +Fundus-Article Image: +-URL: 'https://ca-times.brightspotcdn.com/dims4/default/9a22715/2147483647/strip/true/crop/4706x3137+0+0/resize/1200x800!/format/webp/quality/75/?url=https%3A%2F%2Fcalifornia-times-brightspot.s3.amazonaws.com%2Ff7%2F52%2Fdcd6b263480ab579ac583a4fdbbf%2Flakers-timberwolves-basketball-48004.jpg' +-Description: 'Lakers coach JJ Redick talks with forward Anthony Davis during a loss to the Timberwolves.' +-Caption: 'Lakers coach JJ Redick, right, talks with forward Anthony Davis during the first half of a 97-87 loss to the Timberwolves on Friday night.' +-Authors: ['Abbie Parr / Associated Press'] +-Versions: [320x213, 568x379, 768x512, 1024x683, 1200x800] + +Fundus-Article Image: +-URL: 'https://ca-times.brightspotcdn.com/dims4/default/580bae4/2147483647/strip/true/crop/5093x3470+0+0/resize/1200x818!/format/webp/quality/75/?url=https%3A%2F%2Fcalifornia-times-brightspot.s3.amazonaws.com%2F3b%2Fdf%2F64c0198b4c2fb2b5824aaccb64b7%2F1486148-sp-nba-lakers-trailblazers-25-gmf.jpg' +-Description: 'Lakers star LeBron James sits in street clothes on the bench next to his son, Bronny James.' +-Caption: 'Lakers star LeBron James sits in street clothes on the bench next to his son, Bronny James, during a win over Portland at Crypto.com Arena on Dec. 8.' +-Authors: ['Gina Ferazzi / Los Angeles Times'] +-Versions: [320x218, 568x387, 768x524, 1024x698, 1200x818] +``` + +For each image, the printout details: +- The cover image designation (if applicable). +- The URL for the highest-resolution version of the image. +- A description of the image. +- The image's caption. +- The name of the copyright holder. +- A list of all available versions of the image. + + ## Tutorials We provide **quick tutorials** to get you started with the library: diff --git a/docs/3_the_article_class.md b/docs/3_the_article_class.md index 1ee03e9d..dc5884e6 100644 --- a/docs/3_the_article_class.md +++ b/docs/3_the_article_class.md @@ -4,6 +4,7 @@ * [What is an `Article`](#what-is-an-article) * [The articles' body](#the-articles-body) * [HTML](#html) + * [Images](#images) * [Language detection](#language-detection) * [Saving an Article](#saving-an-article) @@ -117,6 +118,22 @@ Here you have access to the following information: 4. `crawl_date: datetime`: The exact timestamp the article was crawled. 5. `source_info: SourceInfo`: Some information about the HTML's origins, mostly for debugging purpose. +## Images + +Some publishers provide images with their articles. +To encompass all necessary information, the articles `images` attribute returns a list of custom `Image` objects. +Each `Image` object contains the following attributes: +- `url`: the URL of the image with the largest dimensions. +- `versions`: a list of custom `ImageVersion` objects, each containing the following attributes: + - `url`: the URL of the image with the specific dimensions. + - `size`: a `Dimension` object with attributes `width` and `height`. + - `type`: the image format (e.g. `jpeg`, `png`). +- `is_cover`: a boolean indicating whether the image is the cover image of the article. +- `description`: a string describing the image (usually the alt-text). +- `caption`: the image caption as used in the article. +- `authors`: a list of strings representing the authors of the image. +- `position`: an integer describing the position of the image in the DOM-tree. + ## Language detection Sometimes publishers support articles in different languages. diff --git a/docs/how_to_add_a_publisher.md b/docs/how_to_add_a_publisher.md index c011c36d..f0205a5a 100644 --- a/docs/how_to_add_a_publisher.md +++ b/docs/how_to_add_a_publisher.md @@ -17,7 +17,8 @@ * [Working with `lxml`](#working-with-lxml) * [CSS-Select](#css-select) * [XPath](#xpath) - * [Extract the ArticleBody](#extract-the-articlebody) + * [Extracting the ArticleBody](#extracting-the-articlebody) + * [Extracting the Images](#extracting-the-images) * [Checking the free_access attribute](#checking-the-free_access-attribute) * [Finishing the Parser](#finishing-the-parser) * [6. Generate unit tests and update tables](#6-generate-unit-tests-and-update-tables) @@ -533,7 +534,7 @@ Instead, we recommend referring to [this](https://devhints.io/xpath) documentati Make sure to examine other parsers and consult the [attribute guidelines](attribute_guidelines.md) for specifics on attribute implementation. We strongly encourage utilizing these utility functions, especially when parsing the `ArticleBody`. -### Extract the ArticleBody +### Extracting the ArticleBody In the context of Fundus, an article's body typically includes multiple paragraphs, and optionally, a summary and several subheadings. It's important to note that article layouts can vary significantly between publishers, with the most common layouts being: @@ -546,6 +547,39 @@ To accurately extract the body of an article, use the `extract_article_body_with This function accepts selectors for the different body parts as input and returns a parsed `ArticleBody`. For practical examples, refer to existing parser implementations to understand how everything integrates. +### Extracting the images + +Fundus offers a utility function `image_extraction` to extract images from the article. +This function only requires the `doc` element of the article and the `_paragraph_selector` of the parser with further optional attributes that can be used if necessary. +The skeleton of the function looks like this: + +```python +from fundus.parser.utility import image_extraction +from fundus.parser import Image + +@attribute +def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + ) +``` + +Once you have implemented this, you can try to extract your first images from the article body! +What can happen now, is that you get an IndexError. +This is caused by the `upper_boundary_selector` not selecting an element. +You have to adjust it to select an element above the cover image, all images that lie before this upper boundary are discarded. +Once you get your first images, you can further fine-tune your results: + +- `image_selector`: This selector is used to filter which image elements are selected. +- `lower_boundary_selector`: By default, all images after the last paragraph are discarded. With this selector, you can define your custom boundary. +- `caption_selector`: This selector is used to extract the caption of the image and should usually be of the form `XPath("./ancestor::...")` +- `alt_selector`: This selector selects the alt text (description) of the image. +- `author_selector`: You have two options, when selecting the author of the image: + - Preferably, the credits are within their own HTML element and can be directly addressed using a XPath selector. + - Alternatively, a `re.Pattern` object can be passed to select the authors from the caption. In this case, a selection group named `credits` is saved as the author, while the entire `Match` will be removed from the caption. +- `relative_urls`: If set, an attempt will be made to complete relative URLs. +- `size_pattern`: A `re.Pattern` object that can be used to extract the image sizes. ### Checking the free_access attribute diff --git a/docs/supported_publishers.md b/docs/supported_publishers.md index fa8a4c80..b8162a4b 100644 --- a/docs/supported_publishers.md +++ b/docs/supported_publishers.md @@ -982,6 +982,21 @@ + + + LaVanguardia + + +
La Vanguardia
+ + + + www.lavanguardia.com + + +   +   + ABC @@ -1024,9 +1039,7 @@ elpais.com - - images - +     @@ -1137,9 +1150,7 @@ www.bhaskar.com - - images - +     @@ -1186,9 +1197,7 @@ japannews.yomiuri.co.jp - - images - +     @@ -1203,9 +1212,7 @@ www.yomiuri.co.jp - - images - +     diff --git a/src/fundus/parser/data.py b/src/fundus/parser/data.py index 96b4a014..96a44f89 100644 --- a/src/fundus/parser/data.py +++ b/src/fundus/parser/data.py @@ -558,7 +558,7 @@ def __str__(self) -> str: f"-Description:\t {self.description!r}\n" f"-Caption:\t\t {self.caption!r}\n" f"-Authors:\t\t {self.authors}\n" - f"-Sizes:\t\t\t {sorted(set(v.size for v in self.versions if v.size is not None))}\n" + f"-Versions:\t\t {sorted(set(v.size for v in self.versions if v.size is not None))}\n" ) return representation diff --git a/src/fundus/parser/utility.py b/src/fundus/parser/utility.py index 07189280..b998b283 100644 --- a/src/fundus/parser/utility.py +++ b/src/fundus/parser/utility.py @@ -338,7 +338,7 @@ def generic_author_parsing( A parsed and striped list of authors """ - common_delimiters = [",", ";", " und ", " and ", " & ", " \| "] + common_delimiters = [",", ";", " und ", " and ", " & ", r" \| "] parameter_type_error: TypeError = TypeError( f" '{value}' has an unsupported type {type(value)}. " @@ -397,7 +397,7 @@ def generic_topic_parsing(keywords: Optional[Union[str, List[str]]], delimiter: elif isinstance(keywords, str): topics = [cleaned for keyword in keywords.split(delimiter) if (cleaned := keyword.strip())] elif isinstance(keywords, list) and all(isinstance(s, str) for s in keywords): - topics = keywords + topics = [cleaned for keyword in keywords if (cleaned := keyword.strip())] else: raise TypeError(f"Encountered unexpected type {type(keywords)} as keyword parameter") @@ -432,11 +432,28 @@ def preprocess_url(url: str, domain: str) -> str: return url -def image_author_parsing(authors: Union[str, List[str]], author_filter: Optional[Pattern[str]] = None) -> List[str]: +def image_author_parsing(authors: Union[str, List[str]]) -> List[str]: + credit_keywords = [ + "credits?", + "quellen?", + "bild(rechte)?", + "sources?", + r"(((f|ph)oto(graph)?s?|image|illustrations?|cartoons?|pictures?)\s*)+(by|:|courtesy)", + "©", + "– alle rechte vorbehalten", + "copyright", + "all rights reserved", + "courtesy of", + "=", + ] + author_filter = re.compile(r"(?is)^(" + r"|".join(credit_keywords) + r"):?\s*") + def clean(author: str): - if author_filter: - author = re.sub(author_filter, "", author) - author = re.sub(r"©|((f|ph)oto|image)\s*(by|:)", "", author, flags=re.IGNORECASE) + author = re.sub(r"^\((.*)\)$", r"\1", author).strip() + # filtering credit keywords + author = re.sub(author_filter, "", author, count=1) + # filtering bloat follwing the author + author = re.sub(r"(?i)/?copyright.*", "", author) return author.strip() if isinstance(authors, list): @@ -584,7 +601,6 @@ def parse_image_nodes( caption_selector: XPath, alt_selector: XPath, author_selector: Union[XPath, Pattern[str]], - author_filter: Optional[Pattern[str]] = None, domain: Optional[str] = None, size_pattern: Optional[Pattern[str]] = None, ) -> Iterator[Image]: @@ -596,8 +612,6 @@ def parse_image_nodes( alt_selector: Selector selecting the descriptive text of an image. Defaults to selecting alt value. author_selector: Selector selecting the credits for an image. Defaults to selecting an arbitrary child of figure with copyright or credit in its class attribute. - author_filter: In case the author_selector cannot adequately select the author, this filter can be used to - remove unwanted substrings domain: If set, the domain will be prepended to URLs in case they are relative size_pattern: Regular expression to select , and from the image URL. The given regExp will be matched with re.findall and overwrites existing values. Defaults to None. @@ -622,6 +636,9 @@ def nodes_to_text(nodes: List[Union[lxml.html.HtmlElement, str]]) -> Optional[st # parse caption caption = nodes_to_text(caption_selector(node)) + # parse description + description = nodes_to_text(alt_selector(node)) + # parse authors authors = [] if isinstance(author_selector, Pattern): @@ -629,14 +646,14 @@ def nodes_to_text(nodes: List[Union[lxml.html.HtmlElement, str]]) -> Optional[st if caption and (match := re.search(author_selector, caption)): authors = [match.group("credits")] caption = re.sub(author_selector, "", caption).strip() or None + elif description and (match := re.search(author_selector, description)): + authors = [match.group("credits")] + description = re.sub(author_selector, "", description).strip() or None else: # author is selectable as node if author_nodes := author_selector(node): authors = generic_nodes_to_text(author_nodes, normalize=True) - authors = image_author_parsing(authors, author_filter) - - # parse description - description = nodes_to_text(alt_selector(node)) + authors = image_author_parsing(authors) yield Image( versions=versions, @@ -692,7 +709,6 @@ def image_extraction( author_selector: Union[XPath, Pattern[str]] = XPath( "(./ancestor::figure//*[(contains(@class, 'copyright') or contains(@class, 'credit')) and text()])[1]" ), - author_filter: Optional[Pattern[str]] = None, relative_urls: Union[bool, XPath] = False, size_pattern: Pattern[str] = re.compile( r"width([=-])(?P[0-9.]+)|height([=-])(?P[0-9.]+)|dpr=(?P[0-9.]+|)" @@ -718,8 +734,6 @@ def image_extraction( alt_selector: Selector selecting the descriptive text of an image. Defaults to selecting alt value. author_selector: Selector selecting the credits for an image. Defaults to selecting an arbitrary child of figure with copyright or credit in its class attribute. - author_filter: In case the author_selector cannot adequately select the author, this filter can be used to - remove unwanted substrings. relative_urls: If True, the extractor assumes that image src URLs are relative and prepends the publisher domain size_pattern: Regular expression to select , and from the image URL. The given regExp @@ -759,7 +773,6 @@ def image_extraction( caption_selector=caption_selector, alt_selector=alt_selector, author_selector=author_selector, - author_filter=author_filter, domain=domain, size_pattern=size_pattern, ) diff --git a/src/fundus/publishers/au/west_australian.py b/src/fundus/publishers/au/west_australian.py index feeab151..8baefe8d 100644 --- a/src/fundus/publishers/au/west_australian.py +++ b/src/fundus/publishers/au/west_australian.py @@ -64,5 +64,4 @@ def images(self) -> List[Image]: lower_boundary_selector=CSSSelector("div#footer"), caption_selector=XPath("./ancestor::figure //span[contains(@class, 'CaptionText')] /span[1]"), author_selector=XPath("./ancestor::figure //span[contains(@class, 'CaptionText')] /span[last()]"), - author_filter=re.compile(r"Credit:\s*"), ) diff --git a/src/fundus/publishers/de/boersenzeitung.py b/src/fundus/publishers/de/boersenzeitung.py index 47ce9680..5f6b28cb 100644 --- a/src/fundus/publishers/de/boersenzeitung.py +++ b/src/fundus/publishers/de/boersenzeitung.py @@ -65,5 +65,4 @@ def images(self) -> List[Image]: upper_boundary_selector=XPath("//h1|//script"), image_selector=XPath("//storefront-image|//figure//img"), author_selector=XPath("./ancestor::storefront-section//storefront-html[@class='image-copyright']"), - author_filter=re.compile(r"(?i)^(quelle|source):\s*"), ) diff --git a/src/fundus/publishers/de/br.py b/src/fundus/publishers/de/br.py index d13a8796..8f443ae8 100644 --- a/src/fundus/publishers/de/br.py +++ b/src/fundus/publishers/de/br.py @@ -66,7 +66,6 @@ def images(self) -> List[Image]: f"re:match(./@title, '{author_pattern}')", namespaces={"re": "http://exslt.org/regular-expressions"}, ), - author_filter=re.compile(r".*bild:", re.IGNORECASE), ) class V1_1(V1): diff --git a/src/fundus/publishers/de/die_welt.py b/src/fundus/publishers/de/die_welt.py index 3eed07cc..b922baf0 100644 --- a/src/fundus/publishers/de/die_welt.py +++ b/src/fundus/publishers/de/die_welt.py @@ -60,7 +60,6 @@ def images(self) -> List[Image]: image_selector=CSSSelector("figure:not(.c-inline-video) img"), caption_selector=XPath("./ancestor::figure//span[@class='c-content-image__caption-alt']"), author_selector=XPath("./ancestor::figure//span[@class='c-content-image__caption-source']"), - author_filter=re.compile(r"(?i)quelle:\s*"), lower_boundary_selector=XPath("//section[@class='c-attached-content']"), size_pattern=re.compile(r"-w(?P[0-9]+)/"), ) diff --git a/src/fundus/publishers/de/frankfurter_rundschau.py b/src/fundus/publishers/de/frankfurter_rundschau.py index 04c801c3..815ac24f 100644 --- a/src/fundus/publishers/de/frankfurter_rundschau.py +++ b/src/fundus/publishers/de/frankfurter_rundschau.py @@ -53,6 +53,5 @@ def images(self) -> List[Image]: doc=self.precomputed.doc, paragraph_selector=self._paragraph_selector, upper_boundary_selector=CSSSelector("article"), - author_selector=XPath("./ancestor::figure//figcaption"), - author_filter=re.compile(r"(?s).*©"), + author_selector=re.compile(r"©(?P.+)"), ) diff --git a/src/fundus/publishers/de/freiepresse.py b/src/fundus/publishers/de/freiepresse.py index abac850e..38665406 100644 --- a/src/fundus/publishers/de/freiepresse.py +++ b/src/fundus/publishers/de/freiepresse.py @@ -17,8 +17,11 @@ class FreiePresseParser(ParserProxy): class V1(BaseParser): + VALID_UNTIL = datetime.date(2024, 8, 4) _summary_selector = CSSSelector("#artikel-content > p.bold") - _paragraph_selector = CSSSelector("#artikel-content p:not(.bold)") + _paragraph_selector = XPath( + "//*[@id='artikel-content']//p[not(ancestor::div[@class='pw-layer'] or @class='bold')]" + ) _subheadline_selector = CSSSelector("#artikel-content h2") @attribute @@ -36,16 +39,41 @@ def publishing_date(self) -> Optional[datetime.datetime]: @attribute def authors(self) -> List[str]: - return generic_author_parsing(self.precomputed.ld.xpath_search("NewsArticle/author")) + if not (authors := self.precomputed.ld.xpath_search("NewsArticle/author")): + return [] + else: + return generic_author_parsing( + [author for author in authors if not author == "Chemnitzer Verlag und Druck GmbH & Co. KG"] + ) @attribute def title(self) -> Optional[str]: - return self.precomputed.meta.get("og:title") + if title := self.precomputed.meta.get("og:title"): + return re.sub(r"\s*\|.*", "", title) + return None @attribute def topics(self) -> List[str]: return generic_topic_parsing(self.precomputed.ld.bf_search("keywords"), delimiter="/") + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + image_selector=XPath( + "((//div[contains(@class,'wrapImg')]//picture)[1])//img | //img[@class='media-image']" + ), + lower_boundary_selector=XPath("//div[@class='section-topic']"), + caption_selector=XPath("./ancestor::li[@class='img gallery-item']//span[@class='img-info']"), + author_selector=re.compile(r"(?i)bild:(?P.*)"), + relative_urls=True, + ) + + class V1_1(V1): + VALID_UNTIL = datetime.date.today() + _paragraph_selector = CSSSelector("#artikel-content p:not(.bold)") + @attribute def images(self) -> List[Image]: return image_extraction( diff --git a/src/fundus/publishers/de/heise.py b/src/fundus/publishers/de/heise.py index d5d0f56f..ef115515 100644 --- a/src/fundus/publishers/de/heise.py +++ b/src/fundus/publishers/de/heise.py @@ -89,5 +89,4 @@ def images(self) -> List[Image]: "./ancestor::figure//p[@class='a-caption__source']|" "./ancestor::div[@class='article-gallery ']//span[@class='copyright']" ), - author_filter=re.compile(r"(?i)\(|bild:|\)"), ) diff --git a/src/fundus/publishers/de/hessenschau.py b/src/fundus/publishers/de/hessenschau.py index a8a77ab4..91b23e66 100644 --- a/src/fundus/publishers/de/hessenschau.py +++ b/src/fundus/publishers/de/hessenschau.py @@ -62,5 +62,4 @@ def images(self) -> List[Image]: image_selector=XPath("//figure[not(@class='ar-1-1')]//*[not(self::noscript)]/img"), caption_selector=XPath("./ancestor::figure//span[@class='pr-3']"), author_selector=XPath("./ancestor::figure//span[@class='text-gray-scorpion dark:text-text-dark']"), - author_filter=re.compile(r"(?i)bild\s*©"), ) diff --git a/src/fundus/publishers/de/mdr.py b/src/fundus/publishers/de/mdr.py index e25b2b98..57986451 100644 --- a/src/fundus/publishers/de/mdr.py +++ b/src/fundus/publishers/de/mdr.py @@ -72,5 +72,4 @@ def images(self) -> List[Image]: image_selector=XPath("//div[contains(@class,'mediaCon ') and not(@data-ctrl-player)]//noscript/img"), caption_selector=XPath("./ancestor::div[@class='media mediaA ']//span[@class='mediaSubtitle']"), author_selector=XPath("./ancestor::div[@class='media mediaA ']//span[@class='mediaRights copyright']"), - author_filter=re.compile(r"(?i)bildrechte:"), ) diff --git a/src/fundus/publishers/de/merkur.py b/src/fundus/publishers/de/merkur.py index 3a94154e..304ae998 100644 --- a/src/fundus/publishers/de/merkur.py +++ b/src/fundus/publishers/de/merkur.py @@ -48,6 +48,5 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, upper_boundary_selector=XPath("//article"), image_selector=XPath("//figure[@class='id-StoryElement-image']//img"), - author_selector=XPath("./ancestor::figure//figcaption"), - author_filter=re.compile(r".*©"), + author_selector=re.compile(r"©(?P.+)"), ) diff --git a/src/fundus/publishers/de/motorsport_magazin.py b/src/fundus/publishers/de/motorsport_magazin.py index c7ad085b..35340fee 100644 --- a/src/fundus/publishers/de/motorsport_magazin.py +++ b/src/fundus/publishers/de/motorsport_magazin.py @@ -56,7 +56,6 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, image_selector=XPath("//*[not(self::figure)]/picture//img"), caption_selector=XPath("(./ancestor::picture/following-sibling::figcaption)[1]"), - author_selector=XPath("(./ancestor::picture/following-sibling::figcaption)[1]"), - author_filter=re.compile(r"(?i).*foto:"), + author_selector=re.compile(r"(?i),?\s*foto:(?P.+)"), relative_urls=True, ) diff --git a/src/fundus/publishers/de/ndr.py b/src/fundus/publishers/de/ndr.py index 600f575d..1845bb6a 100644 --- a/src/fundus/publishers/de/ndr.py +++ b/src/fundus/publishers/de/ndr.py @@ -60,6 +60,5 @@ def images(self) -> List[Image]: ), relative_urls=XPath("string(//link[@rel='canonical']/@href)"), caption_selector=XPath("./ancestor::div[contains(@class,'contentimage')]//span[@class='caption']"), - author_filter=re.compile(r".*©"), - author_selector=XPath("./@alt"), + author_selector=re.compile(r"(?i)©\s*(ndr)?\s*(foto)?:?\s*(?P.+)"), ) diff --git a/src/fundus/publishers/de/netzpolitik_org.py b/src/fundus/publishers/de/netzpolitik_org.py index e40ffccd..b49c9f04 100644 --- a/src/fundus/publishers/de/netzpolitik_org.py +++ b/src/fundus/publishers/de/netzpolitik_org.py @@ -59,5 +59,4 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, caption_selector=XPath("./ancestor::figure//figcaption/text()"), author_selector=XPath("./ancestor::figure//figcaption/span"), - author_filter=re.compile(r"(?i)– alle rechte vorbehalten"), ) diff --git a/src/fundus/publishers/de/ntv.py b/src/fundus/publishers/de/ntv.py index 6e8f8901..deef8f9c 100644 --- a/src/fundus/publishers/de/ntv.py +++ b/src/fundus/publishers/de/ntv.py @@ -61,7 +61,6 @@ def images(self) -> List[Image]: upper_boundary_selector=XPath("//article[@class='article']"), caption_selector=XPath("./ancestor::figure//figcaption/p[@class='article__caption']"), author_selector=XPath("./ancestor::figure//figcaption/p[@class='article__credit']"), - author_filter=re.compile(r"[()]"), ) class V1_1(V1): diff --git a/src/fundus/publishers/de/sportschau.py b/src/fundus/publishers/de/sportschau.py index fab4cf08..adb5d199 100644 --- a/src/fundus/publishers/de/sportschau.py +++ b/src/fundus/publishers/de/sportschau.py @@ -59,8 +59,8 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, image_selector=XPath("//article//picture[not(contains(@class,'--list'))]//img"), lower_boundary_selector=XPath("//div[contains(@class, 'back-to-top')]"), - author_selector=XPath("./@title"), - author_filter=re.compile(r".*\|"), + alt_selector=XPath("./@title"), + author_selector=re.compile(r"\|(?P.+)"), caption_selector=XPath( "./ancestor::div[contains(@class, 'absatzbild ')]/div[@class='absatzbild__info']" ), diff --git a/src/fundus/publishers/de/sz.py b/src/fundus/publishers/de/sz.py index 953c31f2..68872c05 100644 --- a/src/fundus/publishers/de/sz.py +++ b/src/fundus/publishers/de/sz.py @@ -54,7 +54,6 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, caption_selector=XPath("./ancestor::figure//figcaption/text()"), author_selector=XPath("./ancestor::figure//figcaption/small"), - author_filter=re.compile(r"[()]"), ) class V1_1(V1): diff --git a/src/fundus/publishers/de/tagesschau.py b/src/fundus/publishers/de/tagesschau.py index 099c52d5..75716a91 100644 --- a/src/fundus/publishers/de/tagesschau.py +++ b/src/fundus/publishers/de/tagesschau.py @@ -60,8 +60,8 @@ def images(self) -> List[Image]: image_selector=XPath( "//*[not(self::div and @class='teaser-absatz__image')]/div[@class='ts-picture__wrapper']//img" ), - author_filter=re.compile(r".*\|"), - author_selector=XPath("./@title"), + alt_selector=XPath("./@title"), + author_selector=re.compile(r"\|(?P.+)"), caption_selector=XPath("./ancestor::div[contains(@class, 'absatzbild ')]"), lower_boundary_selector=self._topic_selector, ) diff --git a/src/fundus/publishers/de/wdr.py b/src/fundus/publishers/de/wdr.py index e0a04117..f718a3bf 100644 --- a/src/fundus/publishers/de/wdr.py +++ b/src/fundus/publishers/de/wdr.py @@ -57,8 +57,8 @@ def images(self) -> List[Image]: ), upper_boundary_selector=XPath("//div[@class='segment']"), lower_boundary_selector=XPath("//div[@class='shareCon']"), - author_selector=XPath("./@title"), - author_filter=re.compile(r"(?i).*bildquelle:"), + alt_selector=XPath("./@title"), + author_selector=re.compile(r"(?i)\|\s*bildquelle:(?P.+)"), relative_urls=True, caption_selector=XPath("./ancestor::div[@class='media mediaA']//p[@class='infotext']"), ) diff --git a/src/fundus/publishers/es/__init__.py b/src/fundus/publishers/es/__init__.py index cd531756..0eb80013 100644 --- a/src/fundus/publishers/es/__init__.py +++ b/src/fundus/publishers/es/__init__.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime from dateutil.rrule import MONTHLY, rrule @@ -6,6 +6,7 @@ from fundus.publishers.es.abc import ABCParser from fundus.publishers.es.el_mundo import ElMundoParser from fundus.publishers.es.el_pais import ElPaisParser +from fundus.publishers.es.la_vanguardia import LaVanguardiaParser from fundus.scraping.url import NewsMap, RSSFeed, Sitemap @@ -17,9 +18,41 @@ class ES(metaclass=PublisherGroup): sources=[RSSFeed("https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/portada")] + [ Sitemap(f"https://elpais.com/sitemaps/{d.year}/{str(d.month).zfill(2)}/sitemap_0.xml") - for d in reversed( - list(rrule(MONTHLY, dtstart=datetime.datetime(1976, 5, 1), until=datetime.datetime.now())) - ) + for d in reversed(list(rrule(MONTHLY, dtstart=datetime(1976, 5, 1), until=datetime.now()))) + ], + ) + ElMundo = Publisher( + name="El Mundo", + domain="https://www.elmundo.es/", + parser=ElMundoParser, + sources=[ + RSSFeed("https://e00-elmundo.uecdn.es/elmundo/rss/portada.xml"), + RSSFeed("https://e00-elmundo.uecdn.es/elmundo/rss/espana.xml"), + ], + ) + ABC = Publisher( + name="ABC", + domain="https://www.abc.es/", + parser=ABCParser, + sources=[ + NewsMap("https://www.abc.es/sitemap.xml"), + RSSFeed("https://www.abc.es/rss/2.0/espana/"), + RSSFeed("https://www.abc.es/rss/2.0/portada/"), + ], + ) + LaVanguardia = Publisher( + name=" La Vanguardia", + domain="https://www.lavanguardia.com/", + parser=LaVanguardiaParser, + sources=[ + NewsMap("https://www.lavanguardia.com/sitemap-google-news.xml"), + NewsMap("https://www.lavanguardia.com/sitemap-news-agencias.xml"), + RSSFeed("https://www.lavanguardia.com/rss/home.xml"), + RSSFeed("https://www.lavanguardia.com/rss/internacional.xml"), + ] + + [ + Sitemap(f"https://www.lavanguardia.com/sitemap-noticias-{d.year}{str(d.month).zfill(2)}.xml.gz") + for d in reversed(list(rrule(MONTHLY, dtstart=datetime(2019, 1, 1), until=datetime.now()))) ], ) ElMundo = Publisher( diff --git a/src/fundus/publishers/es/el_pais.py b/src/fundus/publishers/es/el_pais.py index 60c4781b..8e12d4d9 100644 --- a/src/fundus/publishers/es/el_pais.py +++ b/src/fundus/publishers/es/el_pais.py @@ -1,14 +1,16 @@ import datetime from typing import List, Optional +from lxml.cssselect import CSSSelector from lxml.etree import XPath -from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute +from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, generic_topic_parsing, + image_extraction, ) @@ -42,3 +44,15 @@ def authors(self) -> List[str]: @attribute def topics(self) -> List[str]: return generic_topic_parsing(self.precomputed.ld.bf_search("keywords")) + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + upper_boundary_selector=XPath("//article"), + lower_boundary_selector=CSSSelector("aside.a_com"), + image_selector=CSSSelector("figure.a_m img"), + caption_selector=XPath("./ancestor::figure//figcaption/span[1]"), + author_selector=XPath("./ancestor::figure//figcaption/span[last()]"), + ) diff --git a/src/fundus/publishers/es/la_vanguardia.py b/src/fundus/publishers/es/la_vanguardia.py new file mode 100644 index 00000000..a1610b9f --- /dev/null +++ b/src/fundus/publishers/es/la_vanguardia.py @@ -0,0 +1,69 @@ +import datetime +import re +from typing import List, Optional + +from lxml.etree import XPath + +from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute +from fundus.parser.utility import ( + extract_article_body_with_selector, + generic_author_parsing, + generic_date_parsing, + generic_nodes_to_text, + generic_topic_parsing, + image_extraction, +) + + +class LaVanguardiaParser(ParserProxy): + class V1(BaseParser): + _paragraph_selector = XPath( + "//div[@class='article-modules']//p[@class='paragraph']|" + "//div[@class='widget' and not(@id)]//p[not(@class='creditos')]" + ) + _subheadline_selector = XPath( + "//div[@class='article-modules']//h3[@class='subtitle']|" + "//div[@class='widget' and not(@id)]//h2|//span[@class='ubicacion']" + ) + _summary_selector = XPath("//h2[@class='epigraph']|//div[@id='slide-content-1']/p") + + _topic_selector = XPath("//div[contains(@class, 'tags-container')]//li") + + @attribute + def body(self) -> Optional[ArticleBody]: + return extract_article_body_with_selector( + self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + subheadline_selector=self._subheadline_selector, + summary_selector=self._summary_selector, + ) + + @attribute + def publishing_date(self) -> Optional[datetime.datetime]: + return generic_date_parsing(self.precomputed.ld.bf_search("datePublished")) + + @attribute + def title(self) -> Optional[str]: + return self.precomputed.meta.get("title") + + @attribute + def authors(self) -> List[str]: + return [ + re.sub(r"(?u)\s*\u200b.*", "", author) + for author in generic_author_parsing(self.precomputed.ld.bf_search("author")) + ] + + @attribute + def topics(self) -> List[str]: + return generic_topic_parsing(generic_nodes_to_text(self._topic_selector(self.precomputed.doc))) + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + image_selector=XPath("//figure[contains(@class,'composite-image')]//img"), + caption_selector=XPath("./ancestor::figure//figcaption/p"), + author_selector=XPath("./ancestor::figure//figcaption/span"), + relative_urls=True, + ) diff --git a/src/fundus/publishers/ind/bhaskar.py b/src/fundus/publishers/ind/bhaskar.py index 15d5a273..ea90bdfb 100644 --- a/src/fundus/publishers/ind/bhaskar.py +++ b/src/fundus/publishers/ind/bhaskar.py @@ -4,12 +4,13 @@ from lxml.etree import XPath -from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute +from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, generic_topic_parsing, + image_extraction, ) @@ -45,3 +46,13 @@ def topics(self) -> List[str]: for topic in generic_topic_parsing(self.precomputed.ld.bf_search("keywords")) if not re.search(self._topic_bloat_pattern, topic) ] + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + image_selector=XPath("//article//picture//img"), + upper_boundary_selector=XPath("//article"), + caption_selector=XPath("(./ancestor::div[@class='f3e032cb']/following-sibling::*[1])/span[text()]"), + ) diff --git a/src/fundus/publishers/jp/the_japan_news.py b/src/fundus/publishers/jp/the_japan_news.py index 0a4793ba..65b7390f 100644 --- a/src/fundus/publishers/jp/the_japan_news.py +++ b/src/fundus/publishers/jp/the_japan_news.py @@ -4,12 +4,13 @@ from lxml.etree import XPath -from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute +from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, generic_topic_parsing, + image_extraction, ) @@ -44,3 +45,12 @@ def topics(self) -> List[str]: re.sub(r"\([0-9]+\)", "", topic).strip() for topic in generic_topic_parsing(self.precomputed.ld.bf_search("keywords")) ] + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + caption_selector=XPath("./ancestor::figure/figcaption/text()"), + author_selector=XPath("./ancestor::figure/figcaption/span"), + ) diff --git a/src/fundus/publishers/jp/thejapannews.py b/src/fundus/publishers/jp/thejapannews.py deleted file mode 100644 index 0a4793ba..00000000 --- a/src/fundus/publishers/jp/thejapannews.py +++ /dev/null @@ -1,46 +0,0 @@ -import datetime -import re -from typing import List, Optional - -from lxml.etree import XPath - -from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute -from fundus.parser.utility import ( - extract_article_body_with_selector, - generic_author_parsing, - generic_date_parsing, - generic_topic_parsing, -) - - -class TheJapanNewsParser(ParserProxy): - class V1(BaseParser): - _subheadline_selector = XPath("//div[@id='p-article-block']/h2") - _paragraph_selector = XPath("//div[@id='p-article-block']//p[not(@class)]") - - @attribute - def body(self) -> Optional[ArticleBody]: - return extract_article_body_with_selector( - self.precomputed.doc, - paragraph_selector=self._paragraph_selector, - subheadline_selector=self._subheadline_selector, - ) - - @attribute - def title(self) -> Optional[str]: - return self.precomputed.meta.get("og:title") - - @attribute - def publishing_date(self) -> Optional[datetime.datetime]: - return generic_date_parsing(self.precomputed.meta.get("article:published_time")) - - @attribute - def authors(self) -> List[str]: - return generic_author_parsing(self.precomputed.ld.bf_search("author")) - - @attribute - def topics(self) -> List[str]: - return [ - re.sub(r"\([0-9]+\)", "", topic).strip() - for topic in generic_topic_parsing(self.precomputed.ld.bf_search("keywords")) - ] diff --git a/src/fundus/publishers/jp/yomiuri_shimbun.py b/src/fundus/publishers/jp/yomiuri_shimbun.py index 200c2fce..b3fa4797 100644 --- a/src/fundus/publishers/jp/yomiuri_shimbun.py +++ b/src/fundus/publishers/jp/yomiuri_shimbun.py @@ -4,12 +4,13 @@ from lxml.etree import XPath -from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute +from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, generic_topic_parsing, + image_extraction, ) @@ -17,7 +18,7 @@ class YomiuriShimbunParser(ParserProxy): class V1(BaseParser): _paragraph_selector = XPath("//div[@class='p-main-contents ']/p") - _topic_selector = XPath("//div[@class='p-related-tags']/ul/li/a") + _topic_selector = XPath("//div[contains(@class,'p-related-tags')]/ul/li/a") @attribute def body(self) -> Optional[ArticleBody]: @@ -41,3 +42,14 @@ def authors(self) -> List[str]: @attribute def topics(self) -> List[str]: return [node.text_content() for node in self._topic_selector(self.precomputed.doc)] + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + image_selector=XPath("//div[@class='p-main-contents ']//img"), + upper_boundary_selector=XPath("//article"), + relative_urls=True, + author_selector=re.compile(r"(?P=.*)"), + ) diff --git a/src/fundus/publishers/shared/euronews.py b/src/fundus/publishers/shared/euronews.py index e2cd168a..a45d64b4 100644 --- a/src/fundus/publishers/shared/euronews.py +++ b/src/fundus/publishers/shared/euronews.py @@ -69,5 +69,4 @@ def images(self) -> List[Image]: "//div[contains(@class, 'c-article-image-copyright')]|" "./ancestor::figure//span[@class='widget__captionCredit']" ), - author_filter=re.compile(r"(?i)(copyright\s*|the ap\. all rights reserved)"), ) diff --git a/src/fundus/publishers/uk/metro.py b/src/fundus/publishers/uk/metro.py index 9d5c6b5a..bc49f335 100644 --- a/src/fundus/publishers/uk/metro.py +++ b/src/fundus/publishers/uk/metro.py @@ -1,6 +1,6 @@ import datetime import re -from typing import List, Optional +from typing import List, Optional, Union from lxml.cssselect import CSSSelector from lxml.etree import XPath @@ -17,8 +17,9 @@ class MetroParser(ParserProxy): class V1(BaseParser): + VALID_UNTIL = datetime.date(2024, 11, 17) _summary_selector = XPath("//article / div[@class='article-body'] / p[1]") - _subheadline_selector = CSSSelector("article > div.article-body > h2") + _subheadline_selector: Union[CSSSelector, XPath] = CSSSelector("article > div.article-body > h2") _bloat_regex_ = ( r"^Got a story|" @@ -74,3 +75,9 @@ def images(self) -> List[Image]: upper_boundary_selector=XPath("//article"), author_selector=re.compile(r"(?P\([^(]+\)$)"), ) + + class V1_1(V1): + VALID_UNTIL = datetime.date.today() + _summary_selector = XPath("//article//div[@class='article__content__inner']/p[1]") + _paragraph_selector = XPath("//article//div[@class='article__content__inner']/p[not(@class) and position()>1]") + _subheadline_selector = XPath("//article//div[@class='article__content__inner']/h2") diff --git a/src/fundus/publishers/us/fox_news.py b/src/fundus/publishers/us/fox_news.py index 48310f3c..1108a243 100644 --- a/src/fundus/publishers/us/fox_news.py +++ b/src/fundus/publishers/us/fox_news.py @@ -56,5 +56,4 @@ def images(self) -> List[Image]: author_selector=XPath( "(./ancestor::div[@class='image-ct inline']//div[@class='caption']/p/span)[last()]" ), - author_filter=re.compile(r"[()]"), ) diff --git a/src/fundus/publishers/us/free_beacon.py b/src/fundus/publishers/us/free_beacon.py index 18b8731a..61fbd364 100644 --- a/src/fundus/publishers/us/free_beacon.py +++ b/src/fundus/publishers/us/free_beacon.py @@ -49,6 +49,5 @@ def images(self) -> List[Image]: return image_extraction( doc=self.precomputed.doc, paragraph_selector=self._paragraph_selector, - author_selector=XPath("./ancestor::figure//figcaption"), - author_filter=re.compile(r"(?i).*\(|\)"), + author_selector=re.compile(r"\((?P.+)\)$"), ) diff --git a/src/fundus/publishers/us/la_times.py b/src/fundus/publishers/us/la_times.py index ffb802cb..54438724 100644 --- a/src/fundus/publishers/us/la_times.py +++ b/src/fundus/publishers/us/la_times.py @@ -47,7 +47,6 @@ def images(self) -> List[Image]: doc=self.precomputed.doc, paragraph_selector=self._paragraph_selector, upper_boundary_selector=XPath("//div[@class='page-lead']|//h1[@class='headline']"), - author_filter=re.compile(r"(?i)[()]|photos? by|photo illustration by"), caption_selector=XPath("./ancestor::figure//div[@class='figure-caption']"), author_selector=XPath("./ancestor::figure//div[@class='figure-credit']"), ) diff --git a/src/fundus/publishers/us/techcrunch.py b/src/fundus/publishers/us/techcrunch.py index f84dfbfe..63ebdc37 100644 --- a/src/fundus/publishers/us/techcrunch.py +++ b/src/fundus/publishers/us/techcrunch.py @@ -92,6 +92,5 @@ def images(self) -> List[Image]: "//h1[@class='wp-block-post-title']" ), caption_selector=XPath("./ancestor::figure//figcaption"), - author_selector=XPath("./ancestor::figure//figcaption"), - author_filter=re.compile(r"(?i)(.*image credits:|^(?!.*image credits:).*)"), + author_selector=re.compile(r"(?i)image credits:(?P.*)"), ) diff --git a/src/fundus/publishers/us/the_gateway_pundit.py b/src/fundus/publishers/us/the_gateway_pundit.py index edf26cb7..82a8c606 100644 --- a/src/fundus/publishers/us/the_gateway_pundit.py +++ b/src/fundus/publishers/us/the_gateway_pundit.py @@ -50,5 +50,4 @@ def images(self) -> List[Image]: paragraph_selector=self._paragraph_selector, image_selector=XPath("//div[@class='entry-content']//img"), author_selector=XPath("./ancestor::figure//figcaption"), - author_filter=re.compile(r"(?i).*\(credit:|\)|.*photo:|^(?!.*(credit:|photo:)).*$"), ) diff --git a/src/fundus/publishers/us/the_nation.py b/src/fundus/publishers/us/the_nation.py index 3b16e3ca..09529553 100644 --- a/src/fundus/publishers/us/the_nation.py +++ b/src/fundus/publishers/us/the_nation.py @@ -127,6 +127,5 @@ def images(self) -> List[Image]: doc=self.precomputed.doc, paragraph_selector=self._paragraph_selector, upper_boundary_selector=XPath("//h1[contains(@class,'title')]"), - author_filter=re.compile(r"[()]"), caption_selector=XPath("./ancestor::figure//figcaption/text()|./ancestor::figure//figcaption/p"), ) diff --git a/src/fundus/publishers/us/the_new_yorker.py b/src/fundus/publishers/us/the_new_yorker.py index 414bc986..18bba3f7 100644 --- a/src/fundus/publishers/us/the_new_yorker.py +++ b/src/fundus/publishers/us/the_new_yorker.py @@ -77,5 +77,4 @@ def images(self) -> List[Image]: author_selector=XPath( "(./ancestor::*[self::figure or self::header]//*[(self::span and contains(@class, 'caption__credit')) or (self::div and contains(@class, '__credit'))])[last()]" ), - author_filter=re.compile(r"(?i)(photographs?|cartoons?|illustrations?) (by|courtesy)"), ) diff --git a/src/fundus/publishers/us/wired.py b/src/fundus/publishers/us/wired.py index bdb489ae..d609079d 100644 --- a/src/fundus/publishers/us/wired.py +++ b/src/fundus/publishers/us/wired.py @@ -60,5 +60,4 @@ def images(self) -> List[Image]: "./ancestor::*[self::figure or (self::div and contains(@class, 'ProductEmbedWrapper'))]" "//*[contains(@class, 'caption__credit') or contains(@class, 'CreditWrapper')]" ), - author_filter=re.compile(r"(?i)(photograph|illustration):"), ) diff --git a/src/fundus/scraping/article.py b/src/fundus/scraping/article.py index 386e3328..89bba3ac 100644 --- a/src/fundus/scraping/article.py +++ b/src/fundus/scraping/article.py @@ -157,8 +157,12 @@ def __str__(self): f"{Fore.RED}--missing plaintext--{Style.RESET_ALL}" if self.plaintext is None else self.plaintext.strip() ) + image_text = ( + f" including {len(self.images)} image(s)" if self.images and not isinstance(self.images, Exception) else "" + ) + text = ( - f"Fundus-Article:" + f"Fundus-Article{image_text}:" f'\n- Title: "{wrapped_title}"' f'\n- Text: "{wrapped_plaintext}"' f"\n- URL: {self.html.requested_url}" diff --git a/src/fundus/scraping/crawler.py b/src/fundus/scraping/crawler.py index 2f70b56e..393f9408 100644 --- a/src/fundus/scraping/crawler.py +++ b/src/fundus/scraping/crawler.py @@ -10,6 +10,7 @@ import re import threading import time +import traceback from abc import ABC, abstractmethod from datetime import datetime from functools import lru_cache, partial, wraps @@ -68,6 +69,10 @@ _stop_event = threading.Event() +class RemoteException(Exception): + pass + + class TQDMManager(BaseManager): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -113,7 +118,24 @@ def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _T: return self._deserialize()(*args, **kwargs) -def queue_wrapper(queue: Queue[_T], target: Callable[_P, Iterator[_T]]) -> Callable[_P, None]: +def get_execution_context(): + """ + Determines whether the current execution context is in a thread or process. + Returns: + context (str): "thread" or "process" + ident (int): Thread ID or Process ID + """ + if multiprocessing.current_process().name != "MainProcess": + # In a child process + current_process = multiprocessing.current_process() + return current_process.name, current_process.ident + else: + # In the main process, check for threading + current_thread = threading.current_thread() + return current_thread.name, current_thread.ident + + +def queue_wrapper(queue: Queue[Union[_T, Exception]], target: Callable[_P, Iterator[_T]]) -> Callable[_P, None]: """Wraps the target callable to add its results to the queue instead of returning them directly. Args: @@ -126,13 +148,22 @@ def queue_wrapper(queue: Queue[_T], target: Callable[_P, Iterator[_T]]) -> Calla @wraps(target) def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> None: - for obj in target(*args, **kwargs): - queue.put(obj) + try: + for obj in target(*args, **kwargs): + queue.put(obj) + except Exception as err: + tb_str = "".join(traceback.TracebackException.from_exception(err).format()) + context, ident = get_execution_context() + queue.put( + RemoteException( + f"There was a(n) {type(err).__name__!r} occurring in {context} with ident {ident}\n{tb_str}" + ) + ) return wrapper -def pool_queue_iter(handle: MapResult[Any], queue: Queue[_T]) -> Iterator[_T]: +def pool_queue_iter(handle: MapResult[Any], queue: Queue[Union[_T, Exception]]) -> Iterator[_T]: """Utility function to iterate exhaustively over a pool queue. The underlying iterator of this function repeatedly exhausts the given queue. @@ -140,15 +171,17 @@ def pool_queue_iter(handle: MapResult[Any], queue: Queue[_T]) -> Iterator[_T]: Otherwise, it waits for the queue to be populated with the next result from the pool. Args: - handle (MapResult[Any]): A handle o the MappedResult of the underling multiprocessing pool. - queue (Queue[_T]): The pool queue. + handle: A handle of the MappedResult of the underling multiprocessing pool. + queue: The pool queue. Returns: Iterator[_T]: The iterator over the queue as it is populated. """ while True: try: - yield queue.get(timeout=0.1) + if isinstance(nxt := queue.get_nowait(), Exception): + raise Exception("There was an exception occurring in a remote thread/process") from nxt + yield nxt except Empty: try: handle.get(timeout=0.1) @@ -415,11 +448,11 @@ def _single_crawl( def _threaded_crawl( publishers: Tuple[Publisher, ...], article_task: Callable[[Publisher], Iterator[Article]] ) -> Iterator[Article]: - article_queue: Queue[Article] = Queue(len(publishers)) - wrapped_article_task = queue_wrapper(article_queue, article_task) + result_queue: Queue[Union[Article, Exception]] = Queue(len(publishers)) + wrapped_article_task = queue_wrapper(result_queue, article_task) with ThreadPool(processes=len(publishers) or None) as pool, session_handler.context(len(publishers), 1): - yield from pool_queue_iter(pool.map_async(wrapped_article_task, publishers), article_queue) + yield from pool_queue_iter(pool.map_async(wrapped_article_task, publishers), result_queue) def _build_article_iterator( self, @@ -549,11 +582,11 @@ def _parallel_crawl( processes=min(self.processes, len(warc_paths)), initializer=initializer, ) as pool: - article_queue: Queue[Article] = manager.Queue(maxsize=1000) + result_queue: Queue[Union[Article, Exception]] = manager.Queue(maxsize=1000) # Because multiprocessing.Pool does not support iterators as targets, # we wrap the article_task to write the articles to a queue instead of returning them directly. - wrapped_article_task: Callable[[str], None] = queue_wrapper(article_queue, article_task) + wrapped_article_task: Callable[[str], None] = queue_wrapper(result_queue, article_task) # To avoid 503 errors we spread tasks to not start all at once spread_article_task = random_sleep(wrapped_article_task, (0, 3)) @@ -562,7 +595,7 @@ def _parallel_crawl( serialized_article_task = dill_wrapper(spread_article_task) # Finally, we build an iterator around the queue, exhausting the queue until the pool is finished. - yield from pool_queue_iter(pool.map_async(serialized_article_task, warc_paths), article_queue) + yield from pool_queue_iter(pool.map_async(serialized_article_task, warc_paths), result_queue) def _get_warc_paths(self) -> List[str]: # Date regex examples: https://regex101.com/r/yDX3G6/1 diff --git a/tests/resources/parser/test_data/au/NineNews.json b/tests/resources/parser/test_data/au/NineNews.json index 6d7f3827..c87cfcb0 100644 --- a/tests/resources/parser/test_data/au/NineNews.json +++ b/tests/resources/parser/test_data/au/NineNews.json @@ -154,7 +154,7 @@ "description": null, "caption": "More than 3,000 court documents have been released on Jeffrey Epstein.", "authors": [ - "(AP)" + "AP" ], "position": 449 }, @@ -219,7 +219,7 @@ "description": null, "caption": "The islands where notorious pedophile Jeffrey Epstein exploited and abused young women and girls.", "authors": [ - "(Christie's)" + "Christie's" ], "position": 499 }, @@ -284,7 +284,7 @@ "description": "Prosecutors argued Ghislaine Maxwell and Jeffrey Epstein conspired to set up a scheme to lure young girls into sexual relationships with Epstein from 1994 to 2004 in New York, Florida, New Mexico and the US Virgin Islands.", "caption": "Ghislaine Maxwell is serving a 20-year sentence for her involvement with the Jeffrey Epstein case.", "authors": [ - "(AP)" + "AP" ], "position": 544 }, @@ -349,7 +349,7 @@ "description": "Prince Andrew releases statement on Jeffrey Epstein scandal", "caption": "Prince Andrew has denied having sex with Giuffre and said he couldn't recall ever meeting her.", "authors": [ - "(AAP)" + "AAP" ], "position": 584 }, @@ -414,7 +414,7 @@ "description": null, "caption": "Former US president Bill Clinton has been named as one of Jeffrey Epstein's associates.", "authors": [ - "(Nine)" + "Nine" ], "position": 621 }, @@ -479,7 +479,7 @@ "description": "Jeffrey Epstein island Caribbean real estate property", "caption": "The Caribbean Islands formerly owned by Jeffrey Epstein have been listed for sale.", "authors": [ - "(Bespoke Real Estate)" + "Bespoke Real Estate" ], "position": 652 } diff --git a/tests/resources/parser/test_data/de/Bild.json b/tests/resources/parser/test_data/de/Bild.json index 4f8bed55..25a9e27d 100644 --- a/tests/resources/parser/test_data/de/Bild.json +++ b/tests/resources/parser/test_data/de/Bild.json @@ -110,7 +110,7 @@ "description": "Reif ist Live: Müller-Rückkehr, Haller-Doppelpack und Hertha-Frust", "caption": null, "authors": [ - "Quelle: BILD 15.05.2023" + "BILD 15.05.2023" ], "position": 956 } diff --git a/tests/resources/parser/test_data/de/DW.json b/tests/resources/parser/test_data/de/DW.json index a45b0041..4b29e193 100644 --- a/tests/resources/parser/test_data/de/DW.json +++ b/tests/resources/parser/test_data/de/DW.json @@ -1,70 +1,66 @@ { - "V1": { + "V2_1": { "authors": [ - "Roman Goncharenko" + "Jennifer Pahlke" ], "body": { "summary": [ - "Die Ukraine bereitet sich auf eine womöglich entscheidende Gegenoffensive vor, um die von Russland besetzten Gebiete zu befreien. Je länger Kiew wartet, desto besser scheinen seine Chancen." + "Tausende standen für ihn stundenlang in der Kälte: Boris Nadeschdin will bei der Präsidentschaftswahl am 17. März gegen Wladimir Putin antreten. Doch wer sind seine Wähler? Und hat der Kriegsgegner überhaupt eine Chance?" ], "sections": [ { "headline": [], "paragraphs": [ - "Eine Autobahn in Polen nahe der Grenze zur Ukraine. Eine Kolonne aus einem Dutzend olivgrüner Armee-Trucks fährt an einem Aprilmorgen aus Richtung Ukraine kommend. Ihre Tieflader sind leer. \"Ich habe sie vor einer Woche gesehen. Sie haben Panzer in die Ukraine gebracht\", sagt der Taxifahrer. \"Es waren sehr große Panzer.\"", - "Jeden dieser Panzer wird die Ukraine in den kommenden Wochen und Monaten brauchen. Die ukrainische Armee beendet gerade ihre Vorbereitungen auf eine vor Monaten angekündigte und mit Spannung erwartete Gegenoffensive. Sie soll eine Wende im bisherigen zermürbenden Stellungskrieg bringen. Und sie soll Russland aus den besetzten Gebieten vertreiben. Es könnte eine entscheidende Schlacht werden. Ein Befreiungsschlag." + "Die erste Hürde hat er gemeistert: Boris Nadeschdin darf 100.000 Unterschriften sammeln. Unterschriften, die er braucht, um bei der russischen Präsidentschaftswahl im März gegen Amtsinhaber Wladimir Putin antreten zu dürfen. Nach eigenen Angaben hat er sogar schon 200.000 zusammen - mehr als genug, um sie bei der Zentralen Wahlkommission der Russischen Föderation einzureichen, selbst wenn diese einige nicht anerkennen sollte. Erst nach Prüfung durch die Wahlkommission kann Nadeschdin als Präsidentschaftskandidat registriert werden. In der Vergangenheit waren bereits mehrfach Kandidaten wegen angeblicher \"Formfehler\" nicht zugelassen worden - etwa, weil Wahlhelfer angeblich teilweise Unterschriften nicht korrekt erfasst haben.", + "Nadeschdins Helfer aber fühlen sich gut vorbereitet. \"Wir sammeln Unterschriften aus 200 Städten, 65 Regionen Russlands und von russischen Wahlberechtigten in 30 anderen Ländern, darunter Deutschland\", erklärt Boris Nadeschdin im DW-Interview. Sollte die Zentrale Wahlkommission sich weigern, ihn zur Wahl zuzulassen, will er Massenkundgebungen in 150 Städten des Landes beantragen. Das hatte er bei einem Treffen mit seinen Anhängern in Moskau verkündet. Aber wer ist dieser Mann, der es wagt, Wladimir Putin politisch die Stirn zu bieten?" ] }, { "headline": [ - "Kämpfe um Bachmut, um Zeit zu gewinnen" + "Wer ist Boris Nadeschdin?" ], "paragraphs": [ - "Wer in diesen Tagen nach Kiew reist, erlebt die buchstäbliche Ruhe vor dem Sturm. Russische Raketenangriffe wie am Freitag, 28. April, waren zuletzt selten geworden. Auf gut gepflegten Straßen der Hauptstadt blühen Bäume und Blumen, Cafés sind voll, der Krieg scheint weit weg. Und doch wird man immer wieder daran erinnert. An jeder Ecke hängen Plakate mit Aufrufen, sich freiwillig zu melden oder für die Armee zu spenden. Auf dem Majdan, dem Platz der Unabhängigkeit, werden fast täglich Särge mit prominenten gefallenen Kämpfern aufgestellt.", - "Besonders viele sterben bei Bachmut. Die Stadt im Gebiet Donezk ist seit Monaten hart umkämpft und nun größenteils unter russischer Kontrolle. Doch die ukrainische Armee gibt nicht auf. Die Staats- und Armeeführung erklärt das mit dem Schutz anderer Städte in der Nähe. Doch Kiew will bei Bachmut nicht nur russische Kräfte binden, sondern auch Zeit für die Vorbereitung der Gegenoffensive gewinnen. Die ukrainische Armee hat ihre Reserven deshalb lange geschont und sehr hohe Verluste in Kauf genommen. Genaue Zahlen sind unbekannt.", - "Auch Andrij und Maxym (Namen von der Redaktion geändert) haben bei Bachmut gekämpft. Derzeit sind sie wieder in Kiew - endlich Zeit zur Erholung. \"Ich hoffe sehr, dass es sich gelohnt hat\", sagt Andrij über die Entscheidung, Bachmut unbedingt zu halten. Er selbst scheint sich nicht sicher zu sein. Maxym erzählt von der zahlenmäßigen Überlegenheit russischer Kräfte, schlechter Vorbereitung und schwacher Ausrüstung seiner Einheit. Was die beiden von der Gegenoffensive erwarten? \"Endlich wieder befreite Gebiete\", sagt Maxym." + "Politisch gesehen ist der heute 60-jährige Nadeschdin kein unbeschriebenes Blatt. Seine politische Karriere begann in den 1990er Jahren als Berater des damaligen Vizepremierministers Boris Nemzow und Assistent von Ministerpräsident Sergej Kirijenko. Auch stand er mit Wladimir Putin nach dessen erster Wahl zum Präsidenten im Jahre 2000 in engem Kontakt. Dieser brach jedoch nach der Festnahme des Oligarchen Michail Chodorkowski im Jahr 2003 ab. Schon damals festigte Putin seine Macht und begann rücksichtslos gegen seine Gegner vorzugehen.", + "Heute ist Nadeschdin der einzige Antikriegskandidat, der zur Wahl zugelassen werden könnte. \"Putin hat einen fatalen Fehler begangen, als er die Spezielle Militäroperation ins Leben rief. Keines der erklärten Ziele ist erfüllt worden. Und es ist unwahrscheinlich, dass sie erfüllt werden, ohne der Wirtschaft großen Schaden zuzufügen und Russlands Demographie einen irreparablen Schlag zu versetzen\", schreibt Nadeschdin auf seiner Website. Für ihn ist das Russland der Zukunft eines, in das freie und gebildete Menschen zurückkehren wollen und das den Krieg in der Ukraine beendet. Nadeschdin zeichnet damit ein völlig anderes Bild seines Landes als Putin." ] }, { "headline": [ - "Darum wartet Kiew ab" + "Vor allem junge Menschen unterstützen Nadeschdin" ], "paragraphs": [ - "In ukrainischen Medien ist die Gegenoffensive ein Dauerthema, doch die Armeevertreter hüllen sich in Schweigen. Auf alle Anfragen heißt es: \"Abwarten.\" Das hat viele Gründe. So sind zum Beispiel noch nicht alle erwarteten westlichen Waffen eingetroffen. Seit Jahresbeginn hat die Ukraine von NATO-Partnern viel \"Heavy Metal\" bekommen, wie es umgangssprachlich heißt, vieles davon zum ersten Mal: dutzende moderne Kampf- und Schützenpanzer aus deutscher und britischer Produktion, US-amerikanische Patriot-Flugabwehrsysteme, sowjetische Kampfjets.", - "Für die Offensive haben die Armee und die Nationalgarde nach Schätzungen der Online-Zeitung \"Ukrajinska Prawda\" mindestens 16 neue Brigaden gegründet, insgesamt bis zu 50.000 Mann. Diese neuen Einheiten brauchen Zeit für die Vorbereitung, auch, um sich mit neuen Waffen vertraut zu machen. Zusätzliche Herausforderung ist der koordinierte Einsatz vieler Verbände, eine Großoffensive eben. Bisher hatte die Ukraine wenig Erfahrung damit. Mögliche Szenarien wurden auf Computern durchgespielt, heißt es in Kiewer Fachkreisen.", - "Die Wetterbedingungen sind noch ungünstig. Regen hat viele Landstraßen für schwere Kriegstechnik kaum passierbar gemacht. Außerdem müssen die ukrainischen Soldaten warten, bis dichteres Laub auf den Bäumen gewachsen ist, um sich besser tarnen zu können. Bis es ausreichend trocken und grün ist, wird es noch einige Tage dauern." + "Vor Nadeschdins Wahlbüro haben sich schon mehrfach lange Schlangen gebildet. Tausende, meist junge Menschen harren stundenlang in bitterer Kälte aus, um für ihn zu unterschreiben. \"Die meisten meiner Unterstützer sind ziemlich jung, zwischen 20 und 30. Aber es gibt auch Ältere, die mich unterstützen. Die älteste Person, die für mich unterschrieben hat, ist eine Frau aus Orjol, die 1936 geboren wurde\", erzählt Nadeschdin der DW.", + "Vor allem der jungen Generation ist es wichtig, sich zu positionieren, zu demonstrieren und nicht in den Krieg ziehen zu müssen. Sie sind die potenziellen Wähler Nadeschdins.", + "Der Politologe Dmitri Oreschkin kann sich vorstellen, dass Nadeschdin besonders junge Menschen mobilisieren kann: \"20 bis 25 Prozent der Bevölkerung unterstützen Putin nicht. Das Problem ist, dass sie nicht wählen gehen.\" Sie hätten weder für den russischen Präsidenten noch für das politische System insgesamt etwas übrig und verachteten das Wahlverfahren. Daraus erwachse die wichtigste Ressource für Putins Sieg, erläutert Oreschkin. \"Wenn Nadeschdin also nicht gestört würde - und er wird gestört werden, daran besteht kein Zweifel! - könnte er zehn oder fünfzehn Prozent der Stimmen bekommen.\"" ] }, { "headline": [ - "Krim als strategische Stoßrichtung" + "Unterstützung durch die Opposition" ], "paragraphs": [ - "Wo, wann und wie die Ukraine zuschlagen wird, ist gerade eines der am besten gehüteten Geheimnisse. Es dürfte mindestens zwei Stoßrichtungen gebeten. So ist die Armee im Herbst 2022 bei Charkiw und Cherson vorgegangen - mit Erfolg.", - "Der Oberbefehlshaber der ukrainischen Armee, General Walerij Saluschnyj, skizzierte in seinem bisher einzigen programmatischen Artikel im September 2022 nur ansatzweise, wie solch eine ukrainische Gegenoffensive aussehen könnte. Er sprach von \"einigen konsequenten, im Idealfall gleichzeitigen Gegenschlägen\". Als ein strategisch wichtiges Ziel erwähnte Saluschnyj die 2014 von Russland annektierte Halbinsel Krim. Das ist die Hauptrichtung, in die die Ukraine vorzustoßen versuchen dürfte, sagen alle in Kiew. Überraschungen und Täuschungsmanöver sind auch zu erwarten. Viele bezweifeln jedoch, dass die Ukraine die Halbinsel jetzt schon erobern könnte. Dafür gebe es nicht genug Kräfte und Technik.", - "Als Hauptstoßrichtung gilt seit Langem das Gebiet Saporischschja im Süden der Ukraine. Von dort wollen die ukrainischen Streitkräfte weiter bis zur Krim gehen, um russische Truppen von der Versorgung über Land abzuschneiden. Wenn das gelingt, wäre das ein großer Erfolg für Kiew, heißt es. Leicht wird es nicht, denn Russland hat mehrere Verteidigungslinien aufgebaut. Außerdem dürfte Russland diesmal - anders als bei Charkiw oder Cherson - mit Gegenschlägen reagieren, was zu den Risiken der ukrainischen Offensive zählt." + "Ekaterina Duntzowa hat als erste die Nominierung von Boris Nadeschdin unterstützt, nachdem sie selbst von der Zentralen Wahlkommission wegen angeblicher \"zahlreicher Fehler\" von der Kandidatur ausgeschlossen worden war. Er sei der einzige Antikriegskandidat, betont sie. Selbst die üblichen Oppositionskandidaten, die selten einer Meinung ist, haben sich bereit erklärt, Nadeschdin zu unterstützen: Maxim Katz, Michail Chodorkowski, das Korruptionsbekämpfungsteam (FBK) des inhaftierten Kremlkritikers Alexej Nawalny sowie dessen Ehefrau Julia Nawalnaja.", + "\"Ich habe weder mit Chodorkowski noch mit jemand anderem kommuniziert. Ich habe sie weder um Geld noch um Unterstützung gebeten. Aber ich bin jedem russischen Bürger dankbar, der mich in legaler Form unterstützt\", erklärt Nadeschdin der DW.", + "Boris Nadeschdin sei ein eher schwacher Politiker, der nur zur richtigen Zeit am richtigen Ort ist, so Nikolai Petrow, Gastwissenschaftler bei der Stiftung Wissenschaft und Politik in Berlin. In der Vergangenheit galt er eher als Pragmatiker, der auch schon mal mit dem Kreml kooperierte, wenn es seinen eigenen Zwecken dienlich schien. Dass sich die in vielen Fragen grundsätzlich gespaltenen Oppositionskräfte in diesem Fall auf ihn einigen konnten, erklärt Petrow wie folgt: \"Natürlich kann man Nadeschdin nicht als eine einigende Figur der Opposition bezeichnen. Er ist einfach der einzige Kandidat, der sich in irgendeiner Weise gegen den Krieg stellt.\"" ] }, { "headline": [ - "Gegenoffensive dürfte den Krieg nicht beenden" + "Wie realistisch ist ein Sieg Nadeschdins?" ], "paragraphs": [ - "Trotzdem ist die Stimmung in Kiew vorsichtig optimistisch. \"Diese Offensive kann gar nicht scheitern, es werden weitere Gebiete befreit\", sagt ein Militärexperte. \"Die Frage ist nur, wie viel und um welchen Preis\". Diesen Preis sieht der Soldat Andrij jedes Mal, wenn er auf die Kontaktliste auf seinem Handy schaut: \"Viele Kameraden sind gefallen. Ich schaffe es nicht, ihre Nummern zu löschen.\"", - "Auch die Frage, was nach der Gegenoffensive passiert, steht im Raum. Manche befürchten, dass, wenn sie weit hinter den Erwartungen zurück bleibt, der Westen die Ukraine zu einer Verhandlungslösung und zu schmerzhaften Zugeständnissen bewegen könnte. Die Militärführung hat sich klar dagegen ausgesprochen. \"Das wird nicht passieren\", sagt Andrij. Er und viele in Kiew gehen von einem langen Krieg aus, der auch nach der Gegenoffensive nicht zu Ende sein dürfte. Er hofft deshalb auf weitere Konvois mit schwerem Kriegsgerät aus dem Westen." + "Es gilt als sehr wahrscheinlich, dass Wladimir Putin am 17. März zum fünften Mal zum Präsidenten gewählt wird. Wie gering die Chancen für einen Sieg Nadeschdins gesehen werden, lässt sich an einer Antwort von Kremlsprecher Dmitri Peskov auf Fragen von Journalisten ablesen: \"Wir betrachten ihn nicht als Konkurrenten.\"", + "Auch für Dmitri Oreschkin ist klar, dass Boris Nadeschdin keine ernsthafte Gefahr für Putin darstellt. Im Gegenteil: Er könnte für den Kreml von Nutzen sein, zumindest um den Anschein legitimer und freier Wahlen zu bewahren. \"Für den Kreml ist es sicherlich günstig, bequeme oder akzeptable Kandidaten auf der Kandidatenliste zu haben. Ich denke, Boris Nadeschdin fällt in die Kategorie der akzeptablen Kandidaten. Allerdings nur, solange er nicht mehr als fünf Prozent der Stimmen erhält. Im Idealfall sollte Putin 80 Prozent bekommen, der zweite Platz sollte an Leonid Slutsky gehen\", sagt Oreschkin im DW-Interview. Slutsky ist der Vorsitzende der rechtsextremen Partei LDPR, ist aber kein Oppositioneller und unterstützt auch den Krieg in der Ukraine.", + "Sollte Nadeschdin mehr als fünf Prozent der Stimmen bekommen oder sogar Zweiter werden, wäre es, wenn auch kein politischer, so doch zumindest ein ideologischer Sieg: Denn das Bild des Zusammenhalts der russischen Bevölkerung gegen die Ukraine und den Westen, welches der Kreml nur zu gerne nutzt, würde sichtbare Kratzer bekommen." ] } ] }, - "publishing_date": "2023-04-28 00:00:00", - "title": "Ukrainische Gegenoffensive: Ziele, Chancen, Risiken", + "publishing_date": "2024-01-30 14:13:12.269000+00:00", + "title": "Russland-Wahl: Nadeschdin setzt auf ein Ende der Putin-Ära", "topics": [ - "Ukrainekrieg", - "Ukraine", - "Russland", - "Bachmut", - "Waffenlieferungen", - "Gegenoffensive" + "Politik", + "Russische Föderation" ] }, "V2": { @@ -138,68 +134,72 @@ "Coronavirus" ] }, - "V2_1": { + "V1": { "authors": [ - "Jennifer Pahlke" + "Roman Goncharenko" ], "body": { "summary": [ - "Tausende standen für ihn stundenlang in der Kälte: Boris Nadeschdin will bei der Präsidentschaftswahl am 17. März gegen Wladimir Putin antreten. Doch wer sind seine Wähler? Und hat der Kriegsgegner überhaupt eine Chance?" + "Die Ukraine bereitet sich auf eine womöglich entscheidende Gegenoffensive vor, um die von Russland besetzten Gebiete zu befreien. Je länger Kiew wartet, desto besser scheinen seine Chancen." ], "sections": [ { "headline": [], "paragraphs": [ - "Die erste Hürde hat er gemeistert: Boris Nadeschdin darf 100.000 Unterschriften sammeln. Unterschriften, die er braucht, um bei der russischen Präsidentschaftswahl im März gegen Amtsinhaber Wladimir Putin antreten zu dürfen. Nach eigenen Angaben hat er sogar schon 200.000 zusammen - mehr als genug, um sie bei der Zentralen Wahlkommission der Russischen Föderation einzureichen, selbst wenn diese einige nicht anerkennen sollte. Erst nach Prüfung durch die Wahlkommission kann Nadeschdin als Präsidentschaftskandidat registriert werden. In der Vergangenheit waren bereits mehrfach Kandidaten wegen angeblicher \"Formfehler\" nicht zugelassen worden - etwa, weil Wahlhelfer angeblich teilweise Unterschriften nicht korrekt erfasst haben.", - "Nadeschdins Helfer aber fühlen sich gut vorbereitet. \"Wir sammeln Unterschriften aus 200 Städten, 65 Regionen Russlands und von russischen Wahlberechtigten in 30 anderen Ländern, darunter Deutschland\", erklärt Boris Nadeschdin im DW-Interview. Sollte die Zentrale Wahlkommission sich weigern, ihn zur Wahl zuzulassen, will er Massenkundgebungen in 150 Städten des Landes beantragen. Das hatte er bei einem Treffen mit seinen Anhängern in Moskau verkündet. Aber wer ist dieser Mann, der es wagt, Wladimir Putin politisch die Stirn zu bieten?" + "Eine Autobahn in Polen nahe der Grenze zur Ukraine. Eine Kolonne aus einem Dutzend olivgrüner Armee-Trucks fährt an einem Aprilmorgen aus Richtung Ukraine kommend. Ihre Tieflader sind leer. \"Ich habe sie vor einer Woche gesehen. Sie haben Panzer in die Ukraine gebracht\", sagt der Taxifahrer. \"Es waren sehr große Panzer.\"", + "Jeden dieser Panzer wird die Ukraine in den kommenden Wochen und Monaten brauchen. Die ukrainische Armee beendet gerade ihre Vorbereitungen auf eine vor Monaten angekündigte und mit Spannung erwartete Gegenoffensive. Sie soll eine Wende im bisherigen zermürbenden Stellungskrieg bringen. Und sie soll Russland aus den besetzten Gebieten vertreiben. Es könnte eine entscheidende Schlacht werden. Ein Befreiungsschlag." ] }, { "headline": [ - "Wer ist Boris Nadeschdin?" + "Kämpfe um Bachmut, um Zeit zu gewinnen" ], "paragraphs": [ - "Politisch gesehen ist der heute 60-jährige Nadeschdin kein unbeschriebenes Blatt. Seine politische Karriere begann in den 1990er Jahren als Berater des damaligen Vizepremierministers Boris Nemzow und Assistent von Ministerpräsident Sergej Kirijenko. Auch stand er mit Wladimir Putin nach dessen erster Wahl zum Präsidenten im Jahre 2000 in engem Kontakt. Dieser brach jedoch nach der Festnahme des Oligarchen Michail Chodorkowski im Jahr 2003 ab. Schon damals festigte Putin seine Macht und begann rücksichtslos gegen seine Gegner vorzugehen.", - "Heute ist Nadeschdin der einzige Antikriegskandidat, der zur Wahl zugelassen werden könnte. \"Putin hat einen fatalen Fehler begangen, als er die Spezielle Militäroperation ins Leben rief. Keines der erklärten Ziele ist erfüllt worden. Und es ist unwahrscheinlich, dass sie erfüllt werden, ohne der Wirtschaft großen Schaden zuzufügen und Russlands Demographie einen irreparablen Schlag zu versetzen\", schreibt Nadeschdin auf seiner Website. Für ihn ist das Russland der Zukunft eines, in das freie und gebildete Menschen zurückkehren wollen und das den Krieg in der Ukraine beendet. Nadeschdin zeichnet damit ein völlig anderes Bild seines Landes als Putin." + "Wer in diesen Tagen nach Kiew reist, erlebt die buchstäbliche Ruhe vor dem Sturm. Russische Raketenangriffe wie am Freitag, 28. April, waren zuletzt selten geworden. Auf gut gepflegten Straßen der Hauptstadt blühen Bäume und Blumen, Cafés sind voll, der Krieg scheint weit weg. Und doch wird man immer wieder daran erinnert. An jeder Ecke hängen Plakate mit Aufrufen, sich freiwillig zu melden oder für die Armee zu spenden. Auf dem Majdan, dem Platz der Unabhängigkeit, werden fast täglich Särge mit prominenten gefallenen Kämpfern aufgestellt.", + "Besonders viele sterben bei Bachmut. Die Stadt im Gebiet Donezk ist seit Monaten hart umkämpft und nun größenteils unter russischer Kontrolle. Doch die ukrainische Armee gibt nicht auf. Die Staats- und Armeeführung erklärt das mit dem Schutz anderer Städte in der Nähe. Doch Kiew will bei Bachmut nicht nur russische Kräfte binden, sondern auch Zeit für die Vorbereitung der Gegenoffensive gewinnen. Die ukrainische Armee hat ihre Reserven deshalb lange geschont und sehr hohe Verluste in Kauf genommen. Genaue Zahlen sind unbekannt.", + "Auch Andrij und Maxym (Namen von der Redaktion geändert) haben bei Bachmut gekämpft. Derzeit sind sie wieder in Kiew - endlich Zeit zur Erholung. \"Ich hoffe sehr, dass es sich gelohnt hat\", sagt Andrij über die Entscheidung, Bachmut unbedingt zu halten. Er selbst scheint sich nicht sicher zu sein. Maxym erzählt von der zahlenmäßigen Überlegenheit russischer Kräfte, schlechter Vorbereitung und schwacher Ausrüstung seiner Einheit. Was die beiden von der Gegenoffensive erwarten? \"Endlich wieder befreite Gebiete\", sagt Maxym." ] }, { "headline": [ - "Vor allem junge Menschen unterstützen Nadeschdin" + "Darum wartet Kiew ab" ], "paragraphs": [ - "Vor Nadeschdins Wahlbüro haben sich schon mehrfach lange Schlangen gebildet. Tausende, meist junge Menschen harren stundenlang in bitterer Kälte aus, um für ihn zu unterschreiben. \"Die meisten meiner Unterstützer sind ziemlich jung, zwischen 20 und 30. Aber es gibt auch Ältere, die mich unterstützen. Die älteste Person, die für mich unterschrieben hat, ist eine Frau aus Orjol, die 1936 geboren wurde\", erzählt Nadeschdin der DW.", - "Vor allem der jungen Generation ist es wichtig, sich zu positionieren, zu demonstrieren und nicht in den Krieg ziehen zu müssen. Sie sind die potenziellen Wähler Nadeschdins.", - "Der Politologe Dmitri Oreschkin kann sich vorstellen, dass Nadeschdin besonders junge Menschen mobilisieren kann: \"20 bis 25 Prozent der Bevölkerung unterstützen Putin nicht. Das Problem ist, dass sie nicht wählen gehen.\" Sie hätten weder für den russischen Präsidenten noch für das politische System insgesamt etwas übrig und verachteten das Wahlverfahren. Daraus erwachse die wichtigste Ressource für Putins Sieg, erläutert Oreschkin. \"Wenn Nadeschdin also nicht gestört würde - und er wird gestört werden, daran besteht kein Zweifel! - könnte er zehn oder fünfzehn Prozent der Stimmen bekommen.\"" + "In ukrainischen Medien ist die Gegenoffensive ein Dauerthema, doch die Armeevertreter hüllen sich in Schweigen. Auf alle Anfragen heißt es: \"Abwarten.\" Das hat viele Gründe. So sind zum Beispiel noch nicht alle erwarteten westlichen Waffen eingetroffen. Seit Jahresbeginn hat die Ukraine von NATO-Partnern viel \"Heavy Metal\" bekommen, wie es umgangssprachlich heißt, vieles davon zum ersten Mal: dutzende moderne Kampf- und Schützenpanzer aus deutscher und britischer Produktion, US-amerikanische Patriot-Flugabwehrsysteme, sowjetische Kampfjets.", + "Für die Offensive haben die Armee und die Nationalgarde nach Schätzungen der Online-Zeitung \"Ukrajinska Prawda\" mindestens 16 neue Brigaden gegründet, insgesamt bis zu 50.000 Mann. Diese neuen Einheiten brauchen Zeit für die Vorbereitung, auch, um sich mit neuen Waffen vertraut zu machen. Zusätzliche Herausforderung ist der koordinierte Einsatz vieler Verbände, eine Großoffensive eben. Bisher hatte die Ukraine wenig Erfahrung damit. Mögliche Szenarien wurden auf Computern durchgespielt, heißt es in Kiewer Fachkreisen.", + "Die Wetterbedingungen sind noch ungünstig. Regen hat viele Landstraßen für schwere Kriegstechnik kaum passierbar gemacht. Außerdem müssen die ukrainischen Soldaten warten, bis dichteres Laub auf den Bäumen gewachsen ist, um sich besser tarnen zu können. Bis es ausreichend trocken und grün ist, wird es noch einige Tage dauern." ] }, { "headline": [ - "Unterstützung durch die Opposition" + "Krim als strategische Stoßrichtung" ], "paragraphs": [ - "Ekaterina Duntzowa hat als erste die Nominierung von Boris Nadeschdin unterstützt, nachdem sie selbst von der Zentralen Wahlkommission wegen angeblicher \"zahlreicher Fehler\" von der Kandidatur ausgeschlossen worden war. Er sei der einzige Antikriegskandidat, betont sie. Selbst die üblichen Oppositionskandidaten, die selten einer Meinung ist, haben sich bereit erklärt, Nadeschdin zu unterstützen: Maxim Katz, Michail Chodorkowski, das Korruptionsbekämpfungsteam (FBK) des inhaftierten Kremlkritikers Alexej Nawalny sowie dessen Ehefrau Julia Nawalnaja.", - "\"Ich habe weder mit Chodorkowski noch mit jemand anderem kommuniziert. Ich habe sie weder um Geld noch um Unterstützung gebeten. Aber ich bin jedem russischen Bürger dankbar, der mich in legaler Form unterstützt\", erklärt Nadeschdin der DW.", - "Boris Nadeschdin sei ein eher schwacher Politiker, der nur zur richtigen Zeit am richtigen Ort ist, so Nikolai Petrow, Gastwissenschaftler bei der Stiftung Wissenschaft und Politik in Berlin. In der Vergangenheit galt er eher als Pragmatiker, der auch schon mal mit dem Kreml kooperierte, wenn es seinen eigenen Zwecken dienlich schien. Dass sich die in vielen Fragen grundsätzlich gespaltenen Oppositionskräfte in diesem Fall auf ihn einigen konnten, erklärt Petrow wie folgt: \"Natürlich kann man Nadeschdin nicht als eine einigende Figur der Opposition bezeichnen. Er ist einfach der einzige Kandidat, der sich in irgendeiner Weise gegen den Krieg stellt.\"" + "Wo, wann und wie die Ukraine zuschlagen wird, ist gerade eines der am besten gehüteten Geheimnisse. Es dürfte mindestens zwei Stoßrichtungen gebeten. So ist die Armee im Herbst 2022 bei Charkiw und Cherson vorgegangen - mit Erfolg.", + "Der Oberbefehlshaber der ukrainischen Armee, General Walerij Saluschnyj, skizzierte in seinem bisher einzigen programmatischen Artikel im September 2022 nur ansatzweise, wie solch eine ukrainische Gegenoffensive aussehen könnte. Er sprach von \"einigen konsequenten, im Idealfall gleichzeitigen Gegenschlägen\". Als ein strategisch wichtiges Ziel erwähnte Saluschnyj die 2014 von Russland annektierte Halbinsel Krim. Das ist die Hauptrichtung, in die die Ukraine vorzustoßen versuchen dürfte, sagen alle in Kiew. Überraschungen und Täuschungsmanöver sind auch zu erwarten. Viele bezweifeln jedoch, dass die Ukraine die Halbinsel jetzt schon erobern könnte. Dafür gebe es nicht genug Kräfte und Technik.", + "Als Hauptstoßrichtung gilt seit Langem das Gebiet Saporischschja im Süden der Ukraine. Von dort wollen die ukrainischen Streitkräfte weiter bis zur Krim gehen, um russische Truppen von der Versorgung über Land abzuschneiden. Wenn das gelingt, wäre das ein großer Erfolg für Kiew, heißt es. Leicht wird es nicht, denn Russland hat mehrere Verteidigungslinien aufgebaut. Außerdem dürfte Russland diesmal - anders als bei Charkiw oder Cherson - mit Gegenschlägen reagieren, was zu den Risiken der ukrainischen Offensive zählt." ] }, { "headline": [ - "Wie realistisch ist ein Sieg Nadeschdins?" + "Gegenoffensive dürfte den Krieg nicht beenden" ], "paragraphs": [ - "Es gilt als sehr wahrscheinlich, dass Wladimir Putin am 17. März zum fünften Mal zum Präsidenten gewählt wird. Wie gering die Chancen für einen Sieg Nadeschdins gesehen werden, lässt sich an einer Antwort von Kremlsprecher Dmitri Peskov auf Fragen von Journalisten ablesen: \"Wir betrachten ihn nicht als Konkurrenten.\"", - "Auch für Dmitri Oreschkin ist klar, dass Boris Nadeschdin keine ernsthafte Gefahr für Putin darstellt. Im Gegenteil: Er könnte für den Kreml von Nutzen sein, zumindest um den Anschein legitimer und freier Wahlen zu bewahren. \"Für den Kreml ist es sicherlich günstig, bequeme oder akzeptable Kandidaten auf der Kandidatenliste zu haben. Ich denke, Boris Nadeschdin fällt in die Kategorie der akzeptablen Kandidaten. Allerdings nur, solange er nicht mehr als fünf Prozent der Stimmen erhält. Im Idealfall sollte Putin 80 Prozent bekommen, der zweite Platz sollte an Leonid Slutsky gehen\", sagt Oreschkin im DW-Interview. Slutsky ist der Vorsitzende der rechtsextremen Partei LDPR, ist aber kein Oppositioneller und unterstützt auch den Krieg in der Ukraine.", - "Sollte Nadeschdin mehr als fünf Prozent der Stimmen bekommen oder sogar Zweiter werden, wäre es, wenn auch kein politischer, so doch zumindest ein ideologischer Sieg: Denn das Bild des Zusammenhalts der russischen Bevölkerung gegen die Ukraine und den Westen, welches der Kreml nur zu gerne nutzt, würde sichtbare Kratzer bekommen." + "Trotzdem ist die Stimmung in Kiew vorsichtig optimistisch. \"Diese Offensive kann gar nicht scheitern, es werden weitere Gebiete befreit\", sagt ein Militärexperte. \"Die Frage ist nur, wie viel und um welchen Preis\". Diesen Preis sieht der Soldat Andrij jedes Mal, wenn er auf die Kontaktliste auf seinem Handy schaut: \"Viele Kameraden sind gefallen. Ich schaffe es nicht, ihre Nummern zu löschen.\"", + "Auch die Frage, was nach der Gegenoffensive passiert, steht im Raum. Manche befürchten, dass, wenn sie weit hinter den Erwartungen zurück bleibt, der Westen die Ukraine zu einer Verhandlungslösung und zu schmerzhaften Zugeständnissen bewegen könnte. Die Militärführung hat sich klar dagegen ausgesprochen. \"Das wird nicht passieren\", sagt Andrij. Er und viele in Kiew gehen von einem langen Krieg aus, der auch nach der Gegenoffensive nicht zu Ende sein dürfte. Er hofft deshalb auf weitere Konvois mit schwerem Kriegsgerät aus dem Westen." ] } ] }, - "publishing_date": "2024-01-30 14:13:12.269000+00:00", - "title": "Russland-Wahl: Nadeschdin setzt auf ein Ende der Putin-Ära", + "publishing_date": "2023-04-28 00:00:00", + "title": "Ukrainische Gegenoffensive: Ziele, Chancen, Risiken", "topics": [ - "Politik", - "Russische Föderation" + "Ukrainekrieg", + "Ukraine", + "Russland", + "Bachmut", + "Waffenlieferungen", + "Gegenoffensive" ] } } diff --git a/tests/resources/parser/test_data/de/EuronewsDE.json b/tests/resources/parser/test_data/de/EuronewsDE.json index 3cd4c609..b3d4a549 100644 --- a/tests/resources/parser/test_data/de/EuronewsDE.json +++ b/tests/resources/parser/test_data/de/EuronewsDE.json @@ -108,7 +108,7 @@ "description": "Tausende haben am Montag in Tiflis an einer regierungsfreundlichen Kundgebung teilgenommen.", "caption": null, "authors": [ - "Shakh Aivazov/2024" + "Shakh Aivazov" ], "position": 472 } diff --git a/tests/resources/parser/test_data/de/FrankfurterRundschau.json b/tests/resources/parser/test_data/de/FrankfurterRundschau.json index 300a452e..04f1b42b 100644 --- a/tests/resources/parser/test_data/de/FrankfurterRundschau.json +++ b/tests/resources/parser/test_data/de/FrankfurterRundschau.json @@ -96,7 +96,7 @@ ], "is_cover": false, "description": "Mann mit schlimmem Heuschnupfen.", - "caption": "Ambrosia kommt eigentlich aus Nordamerika und ist für Europäer gefährlich - besonders bei Allergikern. © Montage", + "caption": "Ambrosia kommt eigentlich aus Nordamerika und ist für Europäer gefährlich - besonders bei Allergikern.", "authors": [ "Montage" ], diff --git a/tests/resources/parser/test_data/de/FreiePresse.json b/tests/resources/parser/test_data/de/FreiePresse.json index 5dc522af..d1ff8a2a 100644 --- a/tests/resources/parser/test_data/de/FreiePresse.json +++ b/tests/resources/parser/test_data/de/FreiePresse.json @@ -25,11 +25,398 @@ } ] }, - "images": [], + "images": [ + { + "versions": [ + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M400x267.jpg", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M650x433.jpg", + "query_width": null, + "size": { + "width": 650, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M800x534.jpg", + "query_width": null, + "size": { + "width": 800, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M1020x765.jpg", + "query_width": null, + "size": { + "width": 1020, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M1300x866.jpg", + "query_width": null, + "size": { + "width": 1300, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://pics.freiepresse.de/DYNIMG/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird/w213Ko8B60gE5rTmW10p/22/17/13862217_M2040x1530.jpg", + "query_width": null, + "size": { + "width": 2040, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "Chemnitzer Hutfestival: Wann das Fest steigt, was neu ist und wer für eine gute Show sorgen wird - Im Vorjahr zog das Hutfestival Tausende Besucher an.", + "caption": "Im Vorjahr zog das Hutfestival Tausende Besucher an.", + "authors": [ + "Andreas Seidel/Archiv" + ], + "position": 615 + } + ], "publishing_date": "2024-04-30 00:00:00", "title": "Chemnitzer Hutfestival: Wann das Fest steigt, was neu ist und wer für eine gute Show sorgen wird", "topics": [ "Veranstaltungen" ] + }, + "V1_1": { + "authors": [ + "Patrick Hyslop" + ], + "body": { + "summary": [ + "Bijan Djir-Sarai übernimmt die Verantwortung für das Agieren der Partei vor dem Ampel-Aus. Schon zuvor gab es teils heftige Kritik am Strategie-Papier zum Koalitionsbruch." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "Derzeit zeigt sich die FDP von der militärischen Seite. Grund dafür: Das jüngst von ihr veröffentlichte „D-Day-Papier“. Beim Wörtchen D-Day dürften die meisten an den 6. Juni 1944 denken: An dem Tag landeten die Alliierten, um letztlich die Schreckensherrschaft der Nazis und den Zweiten Weltkrieg in Europa zu beenden. Dabei ist D-Day in etwa vergleichbar mit dem deutschen Begriff Tag X.", + "Die Militäroperation 1944 war generalstabsmäßig geplant – und offenbar ebenso militärisch-gründlich wollten die Liberalen in Sachen Ampel-Aus vorgehen. Die Partei unter Christian Lindner (ist Major der Reserve der Luftwaffe) hatte sich laut dem zunächst internen Papier etwa detailliert Gedanken zum idealen Zeitpunkt gemacht, um die Regierung mit SPD und Grünen platzen zu lassen, berechnete etwa die US-Wahlen am 5. November und deren Auswirkungen mit ein." + ] + }, + { + "headline": [ + "Narrativ: Bundesregierung größtes Standortrisiko" + ], + "paragraphs": [ + "Auch ein Narrativ hatten sich die Liberalen zurechtgelegt. „Die fundamentalen Gegensätze zwischen Rot-Grün einerseits und den Liberalen andererseits sind nicht durch Kompromisse zu überbrücken. Die Bundesregierung ist damit selbst zum größten Standortrisiko geworden“, ist etwa im Papier zu lesen.", + "Und man wollte eine Richtungsentscheidung: „Die deutsche Bevölkerung sollte in vorgezogenen Neuwahlen entscheiden, welchen Weg Deutschland zukünftig geht: Subventionen und neue Schulden oder bessere Bedingungen für unsere Unternehmen durch weniger Bürokratie und geringere Steuern. Also: Planwirtschaft oder Soziale Marktwirtschaft. Das sollten wir jetzt entscheiden.“", + "Wie das alles nach außen kommuniziert werden sollte, wurde auch durchgespielt. Von einem Pressestatement, über ein Fernseh-Interview bis zu einem Gastbeitrag in der Frankfurter Allgemeinen Zeitung sind die Überlegungen schriftlich festgehalten." + ] + }, + { + "headline": [ + "Ablauf-Pyramide: Von „Impuls“ bis „Feldschlacht“" + ], + "paragraphs": [ + "Auch die verschiedenen Phasen – die FDP nennt sie eine Ablaufpyramide. Die erste Phase („Impuls“) wäre etwa ein Statement vom ehemaligen Bundeswirtschaftsminister vor der Presse.", + "In der zweiten Phase wollten die Liberalen ihr Narrativ setzen – per Video von Lindner für seine Partei. In der dritten Phase sollte das Narrativ verbreitet werden (zum Beispiel per Kacheln und kurzen Clips in den sozialen Netzwerken), um dann in der letzten Phase – mit dem martialischen Namen „Offene Feldschlacht“ – zu münden.", + "Eine Recherche der „Zeit“ hatte bereits Diskussionen über Ursachen und Urheber des Koalitionsbruchs ausgelöst. In mehreren Treffen der engsten FDP-Führung wurden demnach seit Ende September Szenarien für ein Ende der Ampel-Koalition durchgespielt. Nachdem das Nachrichtenportal Table.Briefings über den internen Marschplan zum D-Day berichtet hatte, stellte die FDP das Papier auf ihre Homepage." + ] + }, + { + "headline": [ + "Generalsekretär Djir-Sarai tritt zurück" + ], + "paragraphs": [ + "Es dauerte nicht lange, bis Kritik daran laut wurde. So fand es FDP-Präsidiumsmitglied Marie-Agnes Strack-Zimmermann zwar gut, dass man sich mit Ausstiegsszenarien auseinandersetzt. Aber: „Die Wortwahl ist der Sache nicht dienlich, eine Verschriftlichung mit dieser Tonalität nicht nachvollziehbar“, ließ sie auf dem Kurznachrichtendienst X wissen.", + "FDP-Generalsekretär Bijan Djir-Sarai musste sich derweil in Schadensbegrenzung bemühen: In einem Interview bei RTL/Ntv am 18. November hatte er mit Blick auf damalige Medienberichte über die „D-Day“-Formulierung noch betont: „Das stimmt nicht. Dieser Begriff ist nicht benutzt worden.“ Nachdem seine Partei das Papier nun online gestellt hatte, erklärte er gegenüber der Welt: „Das Papier ist auf Ebene der Mitarbeiter entstanden. Niemand aus der Führung der FDP kannte das Papier.“ Am Freitagvormittag schließlich wurde bekannt: Djir-Sarai tritt zurück.", + "In einem Statement sagte der 48-Jährige: „Ich habe unwissentlich falsch über ein internes Dokument informiert.“ Das sei nicht seine Absicht gewesen - denn er habe keine Kenntnis von dem Papier gehabt. Als Generalsekretär übernehme er die politische Verantwortung, „um Schaden von meiner Glaubwürdigkeit und der der FDP abzuwenden“. Es war nicht der einzige Rücktritt bei den Liberalen am Freitag. Kurz nach Djir-Sarai nahm FDP-Bundesgeschäftsführer Carsten Reymann seinen Hut.", + "Vom ehemaligen Koalitionspartner SPD gab es warme Worte. Generalsekretär Matthias Miersch warf der Spitze der Liberalen vor, die Öffentlichkeit wiederholt getäuscht zu haben, forderte eine Entschuldigung von Parteichef Lindner. Gegenüber dem Redaktionsnetzwerk Deutschland bezeichnete es Miersch als „zynisch“, dass die FDP in dem Papier für den Zeitpunkt des Ampel-Bruchs in ihrem Papier das Wort „D-Day“ benutzt und den nachfolgenden Wahlkampf als „offene Feldschlacht“ bezeichnet." + ] + }, + { + "headline": [ + "Ricarda Lang an FDP: „Niemand glaubt Euch“" + ], + "paragraphs": [ + "Im Netz sorgte insbesondere die Ablaufpyramide der Liberalen für jede Menge Spott und Hohn. Die Tatsache, dass eine Pyramide von unten nach oben aufgebaut ist, die Liberalen aber ihre Phasen von oben nach unten geplant hatten, nahm dieser User auf X aufs Korn. „Ägypten, wenn der Pharao FDP-Mitglied gewesen wäre“, notierte er zum Bild einer auf dem Kopf stehenden Pyramide.", + "Ex-Grünen-Chefin Ricarda Lang störte sich derweil am militärischen Tonfall. „Wer Politik nur noch als Schlachtfeld begreift und als einziges verbleibendes Ziel Destruktion zum eigenen Nutzen hat, sollte keine politische Verantwortung tragen“, kommentierte sie.", + "In einem weiteren Tweet zitierte sie den schleswig-holsteinischen FDP-Bundestagsabgeordneten Max Mordhorst, empfahl ihm und seiner Partei: „Legt Eure Handys weg, macht Twitter zu. Das Ding ist durch, niemand glaubt Euch.“", + "Der militärische Tonfall des Papiers erinnerte einen User an den Film „Der Untergang“, insbesondere an die bekannte Szene mit Hitler und seinen Militärs im Berliner Führerbunker. „Die FDP-Parteiführung hat soeben Clausewitz ausgegeben“, spöttelt er.", + "Ein anderer Nutzer notierte trocken in Anlehnung an CDU-Mann Wolfgang Schäuble: „Kommunikativer Totalschaden. Isch over.“(phy)" + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M400x267.jpg", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M650x433.jpg", + "query_width": null, + "size": { + "width": 650, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M800x534.jpg", + "query_width": null, + "size": { + "width": 800, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M1020x765.jpg", + "query_width": null, + "size": { + "width": 1020, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M1300x866.jpg", + "query_width": null, + "size": { + "width": 1300, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/32/15125232_M2040x1530.jpg", + "query_width": null, + "size": { + "width": 2040, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "Christian Lindner (FDP, M), scheidender Bundesminister der Finanzen und FDP-Bundesvorsitzender, äußert sich in der FDP-Parteizentrale bei einer Pressekonferenz. Im Hintergrund stehen Marco Buschmann (FDP, l), scheidender Bundesminister der Justiz, und Bijan Djir-Sarai, FDP-Generalsekretär, der mittlerweile zurückgetreten ist.", + "caption": null, + "authors": [], + "position": 431 + }, + { + "versions": [ + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M400x267.jpg", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M650x433.jpg", + "query_width": null, + "size": { + "width": 650, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M800x534.jpg", + "query_width": null, + "size": { + "width": 800, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M1020x765.jpg", + "query_width": null, + "size": { + "width": 1020, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M1300x866.jpg", + "query_width": null, + "size": { + "width": 1300, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/36/15125236_M2040x1530.jpg", + "query_width": null, + "size": { + "width": 2040, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "Die FDP von Parteichef Christian Lindner ist derzeit im Netz in aller Munde - jedoch eher weniger in positivem Kontext.", + "caption": null, + "authors": [], + "position": 448 + }, + { + "versions": [ + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M400x267.jpg", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M650x433.jpg", + "query_width": null, + "size": { + "width": 650, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M800x534.jpg", + "query_width": null, + "size": { + "width": 800, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M1020x765.jpg", + "query_width": null, + "size": { + "width": 1020, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M1300x866.jpg", + "query_width": null, + "size": { + "width": 1300, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/41/15125241_M2040x1530.jpg", + "query_width": null, + "size": { + "width": 2040, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Diese Pyramide zeigt den angedachten Ablauf der einzelnen Phasen zum Ampel-Aus.", + "caption": null, + "authors": [], + "position": 577 + }, + { + "versions": [ + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M400x267.jpg", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M650x433.jpg", + "query_width": null, + "size": { + "width": 650, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M800x534.jpg", + "query_width": null, + "size": { + "width": 800, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M1020x765.jpg", + "query_width": null, + "size": { + "width": 1020, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M1300x866.jpg", + "query_width": null, + "size": { + "width": 1300, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://www.freiepresse.de/DYNIMG/52/46/15125246_M2040x1530.jpg", + "query_width": null, + "size": { + "width": 2040, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Bijan Djir-Sarai am Frei, FDP-Generalsekretär, spricht während eines Statements in der FDP-Bundesgeschäftsstelle. Djir-Sarai zieht die Konsequenzen aus dem Bekanntwerden eines Strategiepapiers der Liberalen zum Ampel-Ausstieg und tritt zurück. Foto: Sebastian Christoph Gollnow/dpa +++ dpa-Bildfunk +++", + "caption": null, + "authors": [], + "position": 608 + } + ], + "publishing_date": "2024-11-29 12:31:54+01:00", + "title": "„Niemand glaubt Euch“, „Totalschaden“: Netz-Spott über FDP - Generalsekretär tritt zurück", + "topics": [ + "Kommunalpolitik" + ] } } diff --git a/tests/resources/parser/test_data/de/FreiePresse_2024_11_29.html.gz b/tests/resources/parser/test_data/de/FreiePresse_2024_11_29.html.gz new file mode 100644 index 00000000..8cae5314 Binary files /dev/null and b/tests/resources/parser/test_data/de/FreiePresse_2024_11_29.html.gz differ diff --git a/tests/resources/parser/test_data/de/Merkur.json b/tests/resources/parser/test_data/de/Merkur.json index b2e31e3b..d15954cc 100644 --- a/tests/resources/parser/test_data/de/Merkur.json +++ b/tests/resources/parser/test_data/de/Merkur.json @@ -85,7 +85,7 @@ ], "is_cover": false, "description": "Collage: Michel de Nostredame (li.) und König Charles III (re.)", - "caption": "Die Interpretation einer Vorhersage von Michel de Nostredame (li.) könnte König Charles III. gar nicht gefallen. © IMAGO / Cinema Publishers Collection /Pool / i-Images", + "caption": "Die Interpretation einer Vorhersage von Michel de Nostredame (li.) könnte König Charles III. gar nicht gefallen.", "authors": [ "IMAGO / Cinema Publishers Collection /Pool / i-Images" ], @@ -141,7 +141,7 @@ ], "is_cover": false, "description": "Prinz Harry", - "caption": "Prinz Harry, Herzog von Sussex. © Victoria Jones/PA Wire/dpa", + "caption": "Prinz Harry, Herzog von Sussex.", "authors": [ "Victoria Jones/PA Wire/dpa" ], diff --git a/tests/resources/parser/test_data/de/MotorSportMagazin.json b/tests/resources/parser/test_data/de/MotorSportMagazin.json index 4310e5da..397096d3 100644 --- a/tests/resources/parser/test_data/de/MotorSportMagazin.json +++ b/tests/resources/parser/test_data/de/MotorSportMagazin.json @@ -95,7 +95,7 @@ ], "is_cover": true, "description": "Die Kawasaki-Superbike-Piloten Axel Bassani und Alex Lowes", - "caption": "Kawasaki wie 2024 wird es 2025 nicht mehr geben, Foto: LAT Images", + "caption": "Kawasaki wie 2024 wird es 2025 nicht mehr geben", "authors": [ "LAT Images" ], @@ -160,7 +160,7 @@ ], "is_cover": false, "description": "Alex Lowes in Barcelona", - "caption": "Alex Lowes fährt bisher eine starke Superbike-Saison 2024, Foto: LAT Images", + "caption": "Alex Lowes fährt bisher eine starke Superbike-Saison 2024", "authors": [ "LAT Images" ], diff --git a/tests/resources/parser/test_data/de/NDR.json b/tests/resources/parser/test_data/de/NDR.json index cb83e6c5..fe505b9a 100644 --- a/tests/resources/parser/test_data/de/NDR.json +++ b/tests/resources/parser/test_data/de/NDR.json @@ -136,10 +136,10 @@ } ], "is_cover": true, - "description": "Ein Meteorit liegt in Elmshorn © NDR Foto: Phillip Eggers", + "description": "Ein Meteorit liegt in Elmshorn", "caption": null, "authors": [ - "NDR Phillip Eggers" + "Phillip Eggers" ], "position": 232 }, @@ -237,10 +237,10 @@ } ], "is_cover": true, - "description": "Ein Meteorit liegt in Elmshorn © NDR Foto: Phillip Eggers", + "description": "Ein Meteorit liegt in Elmshorn", "caption": null, "authors": [ - "NDR Phillip Eggers" + "Phillip Eggers" ], "position": 239 } diff --git a/tests/resources/parser/test_data/de/NTV.json b/tests/resources/parser/test_data/de/NTV.json index 367ccff8..c2b0e6d1 100644 --- a/tests/resources/parser/test_data/de/NTV.json +++ b/tests/resources/parser/test_data/de/NTV.json @@ -1,7 +1,8 @@ { - "V1": { + "V1_1": { "authors": [ - "Juliane Rohr" + "Seb Dumitru", + "Lille" ], "body": { "summary": [], @@ -9,32 +10,56 @@ { "headline": [], "paragraphs": [ - "Leipzig: Hier wurde vor 40 Jahren die Galerie Eigen + Art gegründet, das Label \"Neue Leipziger Schule\" erfunden und in die Welt getragen. Judy Lybke ist der Kopf hinter diesem Erfolg. Kerstin Wahala, die Co-Chefin, ist seit 30 Jahren dabei. ntv.de hat beide in Berlin gesprochen.", - "Meisterhaft schafft er Begehrlichkeiten, seine Begeisterung reißt mit: Gerd Harry Lybke, von allen einfach Judy genannt, ist im komplexen Kunstdickicht der Typ, an den man sich erinnert. Nicht nur wegen seiner farbigen, dreiteiligen Anzüge, die er ausschließlich trägt. Sondern vor allem durch das, was er tut, schafft und bewegt. Noch zu DDR-Zeiten gründete er Eigen + Art, und machte nach der Wende daraus seine international agierende Galerie. Jetzt feiert er 40-jähriges Jubiläum. \"Wir bestehen mit hoher Qualität auf Augenhöhe mit den 100 führenden Galerien der Welt\", sagt Judy Lybke ntv.de selbstbewusst. Dabei hat er die Bodenhaftung offenbar nie verloren: Leipzig ist Basis geblieben. In Berlin betreibt er zwei weitere Standorte.", - "\"Das sind wohl die kleinsten Galerieräume der Stadt\", lacht Kerstin Wahala, Co-Chefin der Galerie, beim Treffen in der Auguststraße. In diesen Räumen zeigen sie seit 1992 große Kunst, etwa die von Neo Rauch. Er ist einer von Judy Lybkes jahrzehntelangen Leipziger Weggefährten. Und fest im Programm der Galerie verankert. Die Malereien des Künstlers sind weltweit begehrt, hängen in Museen und wichtigen Sammlungen. Judy Lybke gilt als der Erfinder des Etiketts \"Neue Leipziger Schule\", das es seit Anfang der 1990er Jahre für die rätselhaften Stimmungsbilder gibt. Er hat die Kunstströmung berühmt gemacht. \"Neo Rauch hat die Tür zur Malerei wieder geöffnet\", erzählt Lybke, denn figürliche Malerei war über die vorangegangenen Jahrzehnte zum No-Go geworden. Mit Rauchs Gemälden kam 2005 der bis heute anhaltende internationale Erfolg für die Galerie.", - "Es ist einerlei, ob ein bekanntes Sammlerpaar, zufällig in die Galerie verirrte Passanten oder eine ganze Schulklasse vor dem gebürtigen Leipziger stehen. \"Sprechen Sie nie mit Unbekannten\" ist das erste Kapitel in seinem schon oft gelesenen Lieblingsbuch \"Der Meister und Margarita\" von Michail Bulgakow überschrieben. Da kann Lybke nur lächeln - er spricht charmant und sehr direkt jede und jeden an, liebt den Kontakt mit Menschen. Das mag so etwas wie das Erfolgsgeheimnis der Galerie sein. Wer hier arbeitet, sei auch Dienstleister, bringt es Kerstin Wahala auf den Punkt. Und wer beim Galeriebesuch nichts kauft, kann sich über ein geglücktes Kunsterlebnis in der Galerie freuen.", - "Es macht dem 62-Jährigen unendlich Spaß, Kunst zu vermitteln. Die Welt der Künstlerinnen und Künstler ist schließlich ein riesiger Kosmos. Als Galerist gehe man schrittweise mit der künstlerischen Entwicklung mit, die Chemie muss stimmen, findet Lybke. Es gehe schließlich nicht nur darum, einen Text und eine Biografie aufzusagen, erklärt Lybke. Dabei ist es egal, ob ein Kunstwerk fünfhundert, zehn- oder hunderttausende Euro kostet. Klar, der Kunsthändler will auch verkaufen, aber eben an die richtige Person oder die richtige Institution." + "Nach 18 spannenden Vorrundenpartien vor rekordträchtiger Kulisse im Pierre Mauroy Stadion von Lille wechselt das olympische Basketballturnier in die Hauptstadt, wo ab Dienstag in der großen Paris Bercy Arena die Medaillen vergeben werden. Die drei Favoriten USA, Kanada und Deutschland blieben unbesiegt. Frankreich, Serbien und Australien wurden jeweils Zweiter in ihren Gruppen; Brasilien und Griechenland qualifizierten sich als bilanzbeste Drittplatzierte ebenfalls für die K.-o.-Runden. Spanien, Japan, Puerto Rico und Süd-Sudan hingegen scheiterten in der Gruppenphase. Deutschlands Nationalmannschaft, der amtierende Weltmeister, rollte nicht nur zu einem makellosen 3:0 Start, sondern bestätigte nach zunehmend dominanten Vorstellungen gegen Japan, Brasilien und Frankreich auch sein Standing als eines der absoluten Top-Teams. Jetzt wartet Griechenland im Viertelfinale." ] }, { "headline": [ - "Eine zweite Chance" + "\"Größte Gefahr für USA\"" ], "paragraphs": [ - "Lebensgeschichte besteht aus Geschichten. Judy Lybke hört man bei der Erzählung seiner DDR-Biografie gerne zu ­- am besten ohne Zeitlimit. Hat was von Abenteuer. Irgendwann schimmert jedoch durch, dass es keines war. Es war kompliziert. In der Armee fiel der junge Mann unangenehm auf. Er bekam eine zweite Chance, sollte lange Jahre in die Sowjetunion zur Ausbildung. Das schlug er aus, auch weil er nicht so weit wegwollte. Das wurde mit einem Berufs- und Studienverbot bestraft. Fortan galt er als asozial, da er keinen Beruf ausüben konnte. Indem man in der DDR keine Arbeit bekam, wurde man kriminalisiert, betont Lybke. Menschen wie ihm blieben oft nur morbide Gelegenheitsjobs, zum Beispiel als Bestatter. Ihn jedoch zog es mitten ins Leben und an die Leipziger Hochschule für Grafik und Buchkunst. Dort saß er stundenlang als Akt-Modell und schmiedete seine lebenslangen Verbindungen zu Künstlern.", - "25 Menschen arbeiten heute für die Galerie. Judy Lybke hält große Stücke auf sein Team. Er hat einen guten Blick für Leute, meint Kerstin Wahala. \"Judy ist ein unheimlich positiver Mensch und setzt nicht auf Zeitgeist. Er braucht das Zwiegespräch und den Austausch, dabei entwickelt er Ideen\", beschreibt Wahala den Galeriegründer. So wie den Einfall, für ein paar Monate nach London, Tokio oder New York zu gehen. Nach Jahren des Eingesperrtseins wollten sie alle raus in die Welt. Kaum zu glauben: Die Mieten in den Traumstädten waren günstig. Jeder Kunstschaffende hat seine Arbeiten selbst nach New York gebracht. Es gab kein Geld für Transportkosten oder gar Versicherung. \"Das ist diese Furchtlosigkeit von Judy. Wir hatten eine irre PR, über uns wurde sogar in den deutschen Abendnachrichten berichtet. Es war ein Erfolg, obwohl das gar nicht das Ziel gewesen war.\" Was wollten sie erreichen? Sie wollten etwas bewegen, der Kunst neue Fenster öffnen.", - "Den Grundstein dafür legte Judy Lybke in seiner Hinterhofwohnung am Körnerplatz in Leipzig. Er gründet im April 1983 Eigen + Art. Alle vier Wochen traf man sich zu Kunstaktionen, Performances und Gesprächen. Dabei soll Lybke die Tür auch mal nackt, mal mit drei Eiern auf dem Kopf, aufgemacht haben - Performance eben. Sehr oft aber war er im dreiteiligen braunen Nadelstreifenanzug unterwegs. Den hatte er von seinem Vater, einem Zimmermann, geliehen. Das verschaffte ihm gegenüber dem Staatssicherheitsdienst ein bisschen Respekt, die hatten ihn ständig im Visier. Die Mitarbeiter gingen bei ihm in der Wohnung ein und aus. Es gibt 18 Stasi-Akten über Judy Lybke inklusive Geruchsproben-Tüchern. Die Eigenart mit dem Dreiteiler ist bis heute geblieben und so was wie sein Markenzeichen. Seine älteste Tochter hat sich sogar schon mal einen für eine besondere Gelegenheit ausgeliehen. \"Da bin ich stolz wie Bolle gewesen. Meine Anzüge sind wie eine Wohnung für mich\", sagt er." + "\"Die erste Halbzeit, die meine Mannschaft heute gespielt hat, war einfach überragend. Das kann man gar nicht richtig beschreiben. Ich bin mehr als zufrieden. Mit den anderen Teams habe ich mich noch nicht beschäftigt, aber wir werden auch im Viertelfinale gut vorbereitet sein.\" Deutschlands Chefcoach Gordon Herbert war bester Laune nach dem dritten Sieg im dritten Spiel - und 18. aus den letzten 20 bei einem internationalen Turnier.", + "Eine 85:71-Demontage der Gastgeber am letzten Gruppenspieltag hat Deutschland endgültig in den Kreis der Top-Medaillenanwärter bugsiert. Die Art und Weise, wie der amtierende Olympia-Zweite deklassiert wurde, ließ aufhorchen. \"Deutschland und Kanada, offensichtlich. Der Augentest zeigt eindrucksvoll, dass diese beiden Teams die größte Gefahr fürs Team USA darstellen\", sagte NBC-Co-Kommentator und dreifach-NBA-Champion Dwyane Wade am Samstag.", + "\"Ich versuche lieber, einen Löwen zu zähmen, als einer Katze das Brüllen beizubringen.\" Mit diesem Zitat, in Anlehnung an das Aggressivitätslevel seiner Truppe, sorgte Herbert in dieser Woche für den Audio-Clip des Turniers bisher. \"Unser Vertrauenslevel ist immens\", sagte Moritz Wagner nach dem Sieg gegen Frankreich. \"Wir wollen immer der Aggressor sein, wissen genau, wer wir sind und wen wir neben uns haben. Wir haben keine Angst, wir greifen an, sind die aggressivere Mannschaft an beiden Enden. Wir sind nicht hier, um zu verlieren.\"", + "Franz Wagner stopfte nicht einen, sondern gleich zwei Monsterdunks über die Franzosen hinweg, während ein lächelnder Dennis Schröder einen Jumpshot nach dem anderen durch die Maschen drückte. Am Ende hatten Deutschlands beste Akteure jeweils 26 Punkte erzielt - die fünfthöchsten Scoring-Games in der Geschichte des DBB bei Olympischen Spielen (Detlef Schrempf hält den Rekord mit 36 Zählern, und die Plätze zwei bis vier gleich dazu).", + "\"Wenn wir so auftreten, können wir jeden schlagen. Aber wir dürfen nicht abheben, es sind noch acht sehr gute Teams im Turnier. Jetzt ist es 'do or die', man kann keine Fehler mehr ausgleichen\", warnt Daniel Theis nicht nur vor dem Auftritt gegen die Griechen am Dienstag (ab 11 Uhr). Die kommen vor allem über die übernatürlichen Kräfte ihres absoluten Megastars Giannis Antetokounmpo. Die athletische Abrissbirne zählt nicht nur in der NBA zur absoluten Elite, sondern ist auch bei diesen Olympischen Spielen nicht zu bremsen.", + "Mit 81 Punkten insgesamt und 27,0 pro Partie führt der \"Greek Freak\" die Scorerliste mit weitem Abstand an. Knapp 70 Prozent aus dem Feld (68,9% FG) und fast zehn Freiwurfversuche pro Spiel illustrieren deutlich: Hält Antetokounmpo den Ball einmal in seinen riesigen Händen, ist es fast immer zu spät. Zum Glück für Deutschland lässt der Rest der Teams zu wünschen übrig. Nur ein anderer Akteur (Vasilis Toliopoulos) punktet zweistellig, \"Hellas\" stellt sowohl nach Offensiv-Rating als auch nach Dreier-Quote das schwächste aller Viertelfinal-Teams.", + "Solange Deutschland im Angriff also Normalform erreicht und hinten entweder Antetokounmpo oder seine Mitspieler neutralisiert, dürfte es keine Probleme haben. Beim bisher letzten Aufeinandertreffen zwischen beiden Teams warf Deutschland die Hellenen im Viertelfinale der EuroBasket 2022 raus - der Anfang eines unvergleichlichen Laufs für den DBB." ] }, { "headline": [ - "Kunstkauf ohne Zinsen" + "Grabenkämpfe bei den Gastgebern" ], "paragraphs": [ - "Momente des kritischen Hinterfragens gibt es immer wieder. So wie 1997 nach einer erfolgreichen Art Cologne. \"Auf der Heimfahrt nach Berlin sprachen wir darüber, dass eine zu homogene Sammlerschaft nie lange gut geht. Judy hatte Sorge, dass das Kaufinteresse nachlässt\", erinnert sich Kerstin Wahala. Eigen + Art brauchte ein frisches Label, so wie die \"Neue Leipziger Schule\". Der Chef hatte den Einfall mit den Jungsammlerinnen und -sammlern. So tituliert bekamen junge Käuferinnen und Käufer Rabatte eingeräumt und sogar die Möglichkeit, den Kunstkauf ohne Zinsen abzustottern. \"Heute haben wir Sammlerinnen und Sammler, die als solche angefangen haben.\"", - "Kreative Erleuchtungen müssen auch mal gebremst werden. Das ist die Aufgabe von Co-Chefin Kerstin Wahala. \"Wir pflegen eine gute Streitkultur. Das geht in Wellenbewegungen, mal ist man toleranter, mal weniger.\" Das Duo kennt sich gut und lange. Judy Lybke hat Kerstin Wahala vor 32 Jahren eingestellt, \"weil sie genauso viel gearbeitet hat wie ich. Das Gleiche gilt für Elke Hannemann, die die Galerie in Leipzig leitet.\" Der Chef arbeitet seit über drei Jahrzehnten mit zwei zusätzlichen Chefinnen.", - "Zurück in die Auguststraße in Berlin. Es war die erste Galerie in der Straße, in der es vor 31 Jahren nicht mal Straßenbeleuchtung gab. Inzwischen gibt es die und viele andere Kunstorte. Was macht für die beiden Eigen + Art aus? \"Begeisterung, Kraft, Zugewandtheit\", findet Kerstin Wahala. \"Die Künstlerinnen und Künstler, die wir vertreten und das Team, das die Galerie nach außen trägt\", ergänzt Judy Lybke. Dafür wird nicht nur in Leipzig und Berlin konstant gewerkelt. Sie wollen den Künstlerinnen und Künstlern den Freiraum schaffen, den sie brauchen, um ihre Kreativität auszuleben. Schließlich sind sie das Herz der Galerie. Lybke, Wahala, Hannemann und alle anderen sind viel auf internationalen Messen und an immer neuen Orten unterwegs, um sie zu promoten. Entspannung findet Judy Lybke auf Hiddensee, bei seiner Familie und \"ich freue mich total, wenn ich in die Galerie komme. Ich liebe, was ich mache.\"", - "Mehr Information zu den Standorten und aktuellen Ausstellungen von Titus Schade in Leipzig sowie Olaf Nicolai in Berlin: Galerie Eigen + Art" + "Wie der deutsche erlebt auch der kanadische Basketball seine beste Phase aller Zeiten. Im Vorjahr gewannen die Nordamerikaner mit Bronze ihre erste WM-Medaille überhaupt. Sie nehmen zum ersten Mal seit Sydney 2000 (Platz sieben) wieder an Olympischen Spielen teil. Ihre einzige Medaille bei Olympia gewannen die Kanadier 1936, als sie den USA im Finale, im Freien, in einem verheerenden Regensturm, mit 19:8 unterlagen.", + "In der \"Group of Death\" blieb die Truppe von Brooklyn-Nets-Headcoach Jordi Fernandez ungeschlagen und gab sich gegen Griechenland, Australien und Spanien keine Blöße. Angeführt von All-NBA-Guard Shai Gilgeous-Alexander (19,0 PPG), der bereits in Manila zu den besten Akteuren zählte, Topscorer RJ Barrett (21,0 PPG) und Dillon Brooks (14,3 PPG bei 60,0 Prozent Dreierquote) fliegt das mit NBA-Kalibern gespickte Team bisher durchs Turnier, dank einer perfekten Mischung aus Offense, Defense und Spieltempo. Dabei ist sogar noch Luft nach oben - vor allem bei Jamal Murray, der seiner Form weit hinterher läuft (nur 5,7 PPG bei 10 Prozent von der Dreierlinie).", + "Dass ausgerechnet die Hausherren zum Stolperstein in Richtung Edelmetall werden könnten, scheint wenig realistisch. Der dreifache Silbermedaillengewinner (1948, 2000, 2021) hat zwar den Heimvorteil und Victor Wembanyama, der sein Team bei den Punkten (17,0 PPG), Rebounds (10,7 RPG), Assists (3,0) und in der Verteidigung (4,7 Steals plus Blocks pro Spiel) anführt. Dafür stimmt sonst kaum etwas bei der \"Equipe Tricolore\", die nicht nur die drittwenigsten Punkte aller Viertelfinalisten erzielt hat, sondern auch beim Spieltempo weit abgeschlagen ist.", + "Veteran Evan Fournier kritisierte Nationaltrainer Vincent Collet und dessen Spielstil nach der deutlichen Niederlage am dritten Spieltag scharf - ein weiteres Anzeichen, dass die Nerven blank liegen. \"Uns fehlen die Grundlagen. Ich glaube unser Spielstil ist nicht mehr zeitgemäß, und dafür zahlen wir den Preis. Heutzutage ist Angriff die beste Verteidigung. Das hier ist nicht mehr der Basketball der 1990er oder 2000er, wo du im Halbfeld verteidigen kannst. Deine Offensive ist entscheidend, Balance, dein Transition-Game. Vor allem gegen ein so starkes Team wie Deutschland.\"", + "Kanada hatte \"Les Bleus\" bereits während der Vorbereitung deutlich geschlagen (85:73). Seither zeigt die Formkurve beider Teams noch klarer in unterschiedliche Richtungen. Auch wenn der Coach der Franzosen sagt: \"Sie haben mehr zu verlieren als wir in dieser Position. Es steht 0:0 am Dienstag.\" Frankreich wirkt klar zwischen den Generationen gefangen und zu wenig gefestigt, um eine der an beiden Enden gefährlichsten Mannschaften dieses Turniers über 40 Minuten zu bedrängen. \"Wir haben gegen viele gute Teams gespielt und sie alle geschlagen\", zeigt sich Gilgeous-Alexander selbstbewusst. \"Wir können ein paar Dinge besser machen, aber das war schon okay so. Wir wollen kein einziges Spiel verlieren. Das ist das Ziel.\"" + ] + }, + { + "headline": [ + "USA: Unschlagbar und immer besser" + ], + "paragraphs": [ + "Brasilien qualifizierte sich aus Gruppe B trotz Niederlagen gegen den DBB und Frankreich als bestes drittplatziertes Team, weil Bruno Caboclo mit 33 Punkten und 17 Rebounds den überdeutlichen Sieg im entscheidenden Spiel gegen Japan sicherstellte. Die Südamerikaner haben nur einen NBA-Spieler im Kader (Gui Santos von den Golden State Warriors), aber sechs Akteure, die mindestens acht Punkte pro Partie erzielen. Sie dominieren am offensiven Brett und sind das bisher beste Dreier-Team im Wettbewerb - mit elf Treffern pro Partie, bei knisternder Trefferquote von 45,3 Prozent. Diese beiden Elemente zählen zu den wenigen Schwachstellen der USA, die Gegner theoretisch ausnutzen können.", + "Der erste Vorstoß der Brasilianer in ein olympisches Halbfinale seit 1968 und die erste Medaille seit Bronze 1964 dürfte dennoch nur ein Träumchen bleiben. Nicht nur, weil sie ihren Viertelfinalgegner bei Olympia noch nie besiegt haben (0:9), sondern weil diese US-Amerikaner bisher absolut unschlagbar wirken. Nach perfekter 5:0 Bilanz in der Vorbereitung pflügten die Favoriten auch durch die Gruppe C und gehen als Nummer eins der Setzliste in die K.-o.-Runden.", + "Zu groß ist die individuelle Qualität im Kader, zu überwältigend der Basketball, den die NBA-Stars aufs Parkett zaubern können, zu vielschichtig das Lineup-Roulette, das Head Coach Steve Kerr spielen kann. Kevin Durant (23 Punkte) brillierte in Spiel eins gegen Serbien, Bam Adebayo (18 Punkte, 7 Rebounds, 2 Blocks) überragte beim Erfolg gegen den Süd-Sudan, und Anthony Edwards lief beim Blowout-Sieg gegen Puerto Rico heiß (26 Punkte in 17 Minuten). Zusammengefügt werden sämtliche Formationen von einem zeitlos dominanten LeBron James, der drittbester Scorer (14.3 PPG), drittbester Rebounder (6,7 RPG) und bester Vorlagengeber ist (7,3 APG) seines Teams ist.", + "\"Sie sind sehr physisch, haben eine Menge guter Schützen, sind das beste Team beim Offensiv-Rebound, und spielen hart. Wir müssen gut vorbereitet sein\", warnt Kerr vor dem Aufeinandertreffen am Dienstag. Trotz fünf Spielern im Kader, die mindestens 40 Prozent ihrer Dreier treffen, stellen die Brasilianer den drittschwächsten Angriff laut Offensiv-Rating und dazu die schlechteste Abwehr aller verbleibenden Teams. Die USA hingegen sind mit zunehmender Turnierdauer immer besser in Schwung gekommen - und dabei ist Steph Curry noch nicht einmal warmgelaufen (7,3 PPG bei 26,3 Prozent Dreierquote). Klare Sache also für die Top-Favoriten." + ] + }, + { + "headline": [ + "FIBA-Bogdanovic läuft heiß" + ], + "paragraphs": [ + "Im Halbfinale wartet dann der Sieger der Partie Serbien gegen Australien. Beide Gegner haben bereits gegen die USA gespielt: Australien beim Test in Abu Dhabi, Serbien sowohl dort, als auch am ersten Spieltag in Gruppe C. Diese Teams kennen sich also. Die \"Boomers\" gewannen zudem am 16. Juli gegen das Team von Svetislav Pesic, 84:73, und demonstrierten schon damals ihre präferierte Sorte Basketball: aggressiv in der Defensive und am Brett, ultraschnell im Umschalten von Abwehr auf Angriff, und viel Balance im Angriff.", + "Gleich fünf NBA-Spieler punkten zweistellig, angeführt von Big Man Jock Landale (17,7 Punkte und 9,7 Rebounds pro Partie), All-Rounder Josh Giddey (15,0 Punkte, 8,7 Rebounds und 6,7 Assists pro Spiel) und \"FIBA-Patty\" Mills. Der Veteran brillierte bereits beim Testspielsieg mit 28 Punkten und hat seine starke Form seither gehalten (13,3 Punkte, 41,2 Prozent Dreier). Um die dritte Halbfinalteilnahme in Folge zu klären, muss das Team von Coach Brian Goorjian den Vizeweltmeister ausschalten. Serbien holte zwei Arbeitssiege gegen Puerto Rico und Süd-Sudan, ohne bisher zu brillieren, erreichte aber dennoch mühelos das Viertelfinale - zum fünften Mal in Folge.", + "Im Gegensatz zum Duell in Abu Dhabi kann Pesic diesmal auf sein volles Spielerkontingent und seine besten Lineups zugreifen. Und das heißt nicht nur, dass der dreifache NBA-MVP Nikola Jokic mehr Minuten gehen und wie gewohnt im Interieur dominieren wird (18,7 Punkte, 11,0 Rebounds und 7,0 Assists im Schnitt bei 75,0 Prozent Zweiern), sondern dass auch einer der gefährlichsten Scorer und Schützen im internationalen Basketball wieder dabei ist.", + "Bogdan Bogdanovic zählt sowohl bei den Punkten (19,0 PPG) als auch bei den Dreiern (52,9 Prozent) zu den besten Spielern in diesem Turnier und avancierte zuletzt zum besten Scorer in der Geschichte des serbischen Basketballverbandes. Beim Sieg am letzten Spieltag nahmen \"Bogi\" (30 Punkte, 8 Assists, 2 Steals, 2 Blocks) und der \"Joker\" (22 Punkte, 13 Rebounds, 4 Assists) den Süd-Sudan in bester One-Two-Punch Manier auseinander.", + "Serbien verteilte als Team 31 Vorlagen - der höchste Wert bisher bei diesen Olympischen Spielen. Und obwohl sie zu Beginn des Turniers kein Scheunentor von Downtown trafen und eigentlich lieber über die Defensive kommen wollen, erzielen sie die zweitmeisten Punkte und stellen den dritteffizientesten Angriff aller Viertelfinalisten. Das gibt Pesics Team den theoretischen Vorteil gegenüber den Aussies - und dann am Donnerstag die Chance auf Wiedergutmachung gegen LeBron, Curry, Durant & Co ...." ] } ] @@ -43,97 +68,96 @@ { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/24077005-1682410865000/16-9/750/judyly.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136611-1722838146000/16-9/750/47887b6d5caf8b0cd0d966244e84878c.jpg", "query_width": null, "size": null, "type": "image/jpeg" } ], "is_cover": true, - "description": "judyly.jpg", - "caption": "Gerd Harry Lybke, bekannt als Judy, in den 80er Jahren in seinen ersten Galerieräumen in Leipzig.", + "description": "Einer der emotionalen Leader im deutschen Team: Moritz Wagner.", + "caption": "Einer der emotionalen Leader im deutschen Team: Moritz Wagner.", "authors": [ - "Galerie EIGEN + ART" + "Pool via REUTERS" ], - "position": 1414 + "position": 1463 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/24077028-1682411297000/16-9/320/dyyly.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136619-1722838211000/16-9/320/fd0756ae1d5fcccecc6291d72cfb7875.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/24077028-1682411297000/16-9/750/dyyly.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136619-1722838211000/16-9/750/fd0756ae1d5fcccecc6291d72cfb7875.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "dyyly.jpg", + "description": "\"Wenn wir so auftreten, können wir jeden schlagen\", sagt Daniel Theis.", "caption": null, "authors": [], - "position": 1450 + "position": 1520 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/24077009-1682410770000/16-9/320/judy.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136620-1722838260000/16-9/320/637c53dc56b40ed18f2398aa1fb04240.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/24077009-1682410770000/16-9/750/judy.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136620-1722838260000/16-9/750/637c53dc56b40ed18f2398aa1fb04240.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "judy.jpg", + "description": "Evan Fournier findet den französischen Spielstil nicht mehr zeitgemäß.", "caption": null, "authors": [], - "position": 1471 + "position": 1564 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/24077020-1682411136000/3-4/320/judylyb.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136621-1722838324000/16-9/320/499bb17c92dfbd2a0827cecfde4b64c7.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/24077020-1682411136000/3-4/750/judylyb.jpg", + "url": "https://apps-cloud.n-tv.de/img/25136621-1722838324000/16-9/750/499bb17c92dfbd2a0827cecfde4b64c7.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "judylyb.jpg", + "description": "Ein olympisches Phänomen: Kevin Durant.", "caption": null, "authors": [], - "position": 1488 + "position": 1583 } ], - "publishing_date": "2023-04-28 18:11:01+02:00", - "title": "Judy Lybke, ganz und gar nicht eigenartig", + "publishing_date": "2024-08-05 20:59:59+02:00", + "title": "Deutscher Aggressor beeindruckt, Frankreich hadert", "topics": [ - "Leben", - "Kunst", - "Berlin", - "KunstKultur" + "Basketball", + "NBA", + "Olympische Spiele 2024 in Paris", + "Olympische Spiele" ] }, - "V1_1": { + "V1": { "authors": [ - "Seb Dumitru", - "Lille" + "Juliane Rohr" ], "body": { "summary": [], @@ -141,56 +165,32 @@ { "headline": [], "paragraphs": [ - "Nach 18 spannenden Vorrundenpartien vor rekordträchtiger Kulisse im Pierre Mauroy Stadion von Lille wechselt das olympische Basketballturnier in die Hauptstadt, wo ab Dienstag in der großen Paris Bercy Arena die Medaillen vergeben werden. Die drei Favoriten USA, Kanada und Deutschland blieben unbesiegt. Frankreich, Serbien und Australien wurden jeweils Zweiter in ihren Gruppen; Brasilien und Griechenland qualifizierten sich als bilanzbeste Drittplatzierte ebenfalls für die K.-o.-Runden. Spanien, Japan, Puerto Rico und Süd-Sudan hingegen scheiterten in der Gruppenphase. Deutschlands Nationalmannschaft, der amtierende Weltmeister, rollte nicht nur zu einem makellosen 3:0 Start, sondern bestätigte nach zunehmend dominanten Vorstellungen gegen Japan, Brasilien und Frankreich auch sein Standing als eines der absoluten Top-Teams. Jetzt wartet Griechenland im Viertelfinale." - ] - }, - { - "headline": [ - "\"Größte Gefahr für USA\"" - ], - "paragraphs": [ - "\"Die erste Halbzeit, die meine Mannschaft heute gespielt hat, war einfach überragend. Das kann man gar nicht richtig beschreiben. Ich bin mehr als zufrieden. Mit den anderen Teams habe ich mich noch nicht beschäftigt, aber wir werden auch im Viertelfinale gut vorbereitet sein.\" Deutschlands Chefcoach Gordon Herbert war bester Laune nach dem dritten Sieg im dritten Spiel - und 18. aus den letzten 20 bei einem internationalen Turnier.", - "Eine 85:71-Demontage der Gastgeber am letzten Gruppenspieltag hat Deutschland endgültig in den Kreis der Top-Medaillenanwärter bugsiert. Die Art und Weise, wie der amtierende Olympia-Zweite deklassiert wurde, ließ aufhorchen. \"Deutschland und Kanada, offensichtlich. Der Augentest zeigt eindrucksvoll, dass diese beiden Teams die größte Gefahr fürs Team USA darstellen\", sagte NBC-Co-Kommentator und dreifach-NBA-Champion Dwyane Wade am Samstag.", - "\"Ich versuche lieber, einen Löwen zu zähmen, als einer Katze das Brüllen beizubringen.\" Mit diesem Zitat, in Anlehnung an das Aggressivitätslevel seiner Truppe, sorgte Herbert in dieser Woche für den Audio-Clip des Turniers bisher. \"Unser Vertrauenslevel ist immens\", sagte Moritz Wagner nach dem Sieg gegen Frankreich. \"Wir wollen immer der Aggressor sein, wissen genau, wer wir sind und wen wir neben uns haben. Wir haben keine Angst, wir greifen an, sind die aggressivere Mannschaft an beiden Enden. Wir sind nicht hier, um zu verlieren.\"", - "Franz Wagner stopfte nicht einen, sondern gleich zwei Monsterdunks über die Franzosen hinweg, während ein lächelnder Dennis Schröder einen Jumpshot nach dem anderen durch die Maschen drückte. Am Ende hatten Deutschlands beste Akteure jeweils 26 Punkte erzielt - die fünfthöchsten Scoring-Games in der Geschichte des DBB bei Olympischen Spielen (Detlef Schrempf hält den Rekord mit 36 Zählern, und die Plätze zwei bis vier gleich dazu).", - "\"Wenn wir so auftreten, können wir jeden schlagen. Aber wir dürfen nicht abheben, es sind noch acht sehr gute Teams im Turnier. Jetzt ist es 'do or die', man kann keine Fehler mehr ausgleichen\", warnt Daniel Theis nicht nur vor dem Auftritt gegen die Griechen am Dienstag (ab 11 Uhr). Die kommen vor allem über die übernatürlichen Kräfte ihres absoluten Megastars Giannis Antetokounmpo. Die athletische Abrissbirne zählt nicht nur in der NBA zur absoluten Elite, sondern ist auch bei diesen Olympischen Spielen nicht zu bremsen.", - "Mit 81 Punkten insgesamt und 27,0 pro Partie führt der \"Greek Freak\" die Scorerliste mit weitem Abstand an. Knapp 70 Prozent aus dem Feld (68,9% FG) und fast zehn Freiwurfversuche pro Spiel illustrieren deutlich: Hält Antetokounmpo den Ball einmal in seinen riesigen Händen, ist es fast immer zu spät. Zum Glück für Deutschland lässt der Rest der Teams zu wünschen übrig. Nur ein anderer Akteur (Vasilis Toliopoulos) punktet zweistellig, \"Hellas\" stellt sowohl nach Offensiv-Rating als auch nach Dreier-Quote das schwächste aller Viertelfinal-Teams.", - "Solange Deutschland im Angriff also Normalform erreicht und hinten entweder Antetokounmpo oder seine Mitspieler neutralisiert, dürfte es keine Probleme haben. Beim bisher letzten Aufeinandertreffen zwischen beiden Teams warf Deutschland die Hellenen im Viertelfinale der EuroBasket 2022 raus - der Anfang eines unvergleichlichen Laufs für den DBB." - ] - }, - { - "headline": [ - "Grabenkämpfe bei den Gastgebern" - ], - "paragraphs": [ - "Wie der deutsche erlebt auch der kanadische Basketball seine beste Phase aller Zeiten. Im Vorjahr gewannen die Nordamerikaner mit Bronze ihre erste WM-Medaille überhaupt. Sie nehmen zum ersten Mal seit Sydney 2000 (Platz sieben) wieder an Olympischen Spielen teil. Ihre einzige Medaille bei Olympia gewannen die Kanadier 1936, als sie den USA im Finale, im Freien, in einem verheerenden Regensturm, mit 19:8 unterlagen.", - "In der \"Group of Death\" blieb die Truppe von Brooklyn-Nets-Headcoach Jordi Fernandez ungeschlagen und gab sich gegen Griechenland, Australien und Spanien keine Blöße. Angeführt von All-NBA-Guard Shai Gilgeous-Alexander (19,0 PPG), der bereits in Manila zu den besten Akteuren zählte, Topscorer RJ Barrett (21,0 PPG) und Dillon Brooks (14,3 PPG bei 60,0 Prozent Dreierquote) fliegt das mit NBA-Kalibern gespickte Team bisher durchs Turnier, dank einer perfekten Mischung aus Offense, Defense und Spieltempo. Dabei ist sogar noch Luft nach oben - vor allem bei Jamal Murray, der seiner Form weit hinterher läuft (nur 5,7 PPG bei 10 Prozent von der Dreierlinie).", - "Dass ausgerechnet die Hausherren zum Stolperstein in Richtung Edelmetall werden könnten, scheint wenig realistisch. Der dreifache Silbermedaillengewinner (1948, 2000, 2021) hat zwar den Heimvorteil und Victor Wembanyama, der sein Team bei den Punkten (17,0 PPG), Rebounds (10,7 RPG), Assists (3,0) und in der Verteidigung (4,7 Steals plus Blocks pro Spiel) anführt. Dafür stimmt sonst kaum etwas bei der \"Equipe Tricolore\", die nicht nur die drittwenigsten Punkte aller Viertelfinalisten erzielt hat, sondern auch beim Spieltempo weit abgeschlagen ist.", - "Veteran Evan Fournier kritisierte Nationaltrainer Vincent Collet und dessen Spielstil nach der deutlichen Niederlage am dritten Spieltag scharf - ein weiteres Anzeichen, dass die Nerven blank liegen. \"Uns fehlen die Grundlagen. Ich glaube unser Spielstil ist nicht mehr zeitgemäß, und dafür zahlen wir den Preis. Heutzutage ist Angriff die beste Verteidigung. Das hier ist nicht mehr der Basketball der 1990er oder 2000er, wo du im Halbfeld verteidigen kannst. Deine Offensive ist entscheidend, Balance, dein Transition-Game. Vor allem gegen ein so starkes Team wie Deutschland.\"", - "Kanada hatte \"Les Bleus\" bereits während der Vorbereitung deutlich geschlagen (85:73). Seither zeigt die Formkurve beider Teams noch klarer in unterschiedliche Richtungen. Auch wenn der Coach der Franzosen sagt: \"Sie haben mehr zu verlieren als wir in dieser Position. Es steht 0:0 am Dienstag.\" Frankreich wirkt klar zwischen den Generationen gefangen und zu wenig gefestigt, um eine der an beiden Enden gefährlichsten Mannschaften dieses Turniers über 40 Minuten zu bedrängen. \"Wir haben gegen viele gute Teams gespielt und sie alle geschlagen\", zeigt sich Gilgeous-Alexander selbstbewusst. \"Wir können ein paar Dinge besser machen, aber das war schon okay so. Wir wollen kein einziges Spiel verlieren. Das ist das Ziel.\"" + "Leipzig: Hier wurde vor 40 Jahren die Galerie Eigen + Art gegründet, das Label \"Neue Leipziger Schule\" erfunden und in die Welt getragen. Judy Lybke ist der Kopf hinter diesem Erfolg. Kerstin Wahala, die Co-Chefin, ist seit 30 Jahren dabei. ntv.de hat beide in Berlin gesprochen.", + "Meisterhaft schafft er Begehrlichkeiten, seine Begeisterung reißt mit: Gerd Harry Lybke, von allen einfach Judy genannt, ist im komplexen Kunstdickicht der Typ, an den man sich erinnert. Nicht nur wegen seiner farbigen, dreiteiligen Anzüge, die er ausschließlich trägt. Sondern vor allem durch das, was er tut, schafft und bewegt. Noch zu DDR-Zeiten gründete er Eigen + Art, und machte nach der Wende daraus seine international agierende Galerie. Jetzt feiert er 40-jähriges Jubiläum. \"Wir bestehen mit hoher Qualität auf Augenhöhe mit den 100 führenden Galerien der Welt\", sagt Judy Lybke ntv.de selbstbewusst. Dabei hat er die Bodenhaftung offenbar nie verloren: Leipzig ist Basis geblieben. In Berlin betreibt er zwei weitere Standorte.", + "\"Das sind wohl die kleinsten Galerieräume der Stadt\", lacht Kerstin Wahala, Co-Chefin der Galerie, beim Treffen in der Auguststraße. In diesen Räumen zeigen sie seit 1992 große Kunst, etwa die von Neo Rauch. Er ist einer von Judy Lybkes jahrzehntelangen Leipziger Weggefährten. Und fest im Programm der Galerie verankert. Die Malereien des Künstlers sind weltweit begehrt, hängen in Museen und wichtigen Sammlungen. Judy Lybke gilt als der Erfinder des Etiketts \"Neue Leipziger Schule\", das es seit Anfang der 1990er Jahre für die rätselhaften Stimmungsbilder gibt. Er hat die Kunstströmung berühmt gemacht. \"Neo Rauch hat die Tür zur Malerei wieder geöffnet\", erzählt Lybke, denn figürliche Malerei war über die vorangegangenen Jahrzehnte zum No-Go geworden. Mit Rauchs Gemälden kam 2005 der bis heute anhaltende internationale Erfolg für die Galerie.", + "Es ist einerlei, ob ein bekanntes Sammlerpaar, zufällig in die Galerie verirrte Passanten oder eine ganze Schulklasse vor dem gebürtigen Leipziger stehen. \"Sprechen Sie nie mit Unbekannten\" ist das erste Kapitel in seinem schon oft gelesenen Lieblingsbuch \"Der Meister und Margarita\" von Michail Bulgakow überschrieben. Da kann Lybke nur lächeln - er spricht charmant und sehr direkt jede und jeden an, liebt den Kontakt mit Menschen. Das mag so etwas wie das Erfolgsgeheimnis der Galerie sein. Wer hier arbeitet, sei auch Dienstleister, bringt es Kerstin Wahala auf den Punkt. Und wer beim Galeriebesuch nichts kauft, kann sich über ein geglücktes Kunsterlebnis in der Galerie freuen.", + "Es macht dem 62-Jährigen unendlich Spaß, Kunst zu vermitteln. Die Welt der Künstlerinnen und Künstler ist schließlich ein riesiger Kosmos. Als Galerist gehe man schrittweise mit der künstlerischen Entwicklung mit, die Chemie muss stimmen, findet Lybke. Es gehe schließlich nicht nur darum, einen Text und eine Biografie aufzusagen, erklärt Lybke. Dabei ist es egal, ob ein Kunstwerk fünfhundert, zehn- oder hunderttausende Euro kostet. Klar, der Kunsthändler will auch verkaufen, aber eben an die richtige Person oder die richtige Institution." ] }, { "headline": [ - "USA: Unschlagbar und immer besser" + "Eine zweite Chance" ], "paragraphs": [ - "Brasilien qualifizierte sich aus Gruppe B trotz Niederlagen gegen den DBB und Frankreich als bestes drittplatziertes Team, weil Bruno Caboclo mit 33 Punkten und 17 Rebounds den überdeutlichen Sieg im entscheidenden Spiel gegen Japan sicherstellte. Die Südamerikaner haben nur einen NBA-Spieler im Kader (Gui Santos von den Golden State Warriors), aber sechs Akteure, die mindestens acht Punkte pro Partie erzielen. Sie dominieren am offensiven Brett und sind das bisher beste Dreier-Team im Wettbewerb - mit elf Treffern pro Partie, bei knisternder Trefferquote von 45,3 Prozent. Diese beiden Elemente zählen zu den wenigen Schwachstellen der USA, die Gegner theoretisch ausnutzen können.", - "Der erste Vorstoß der Brasilianer in ein olympisches Halbfinale seit 1968 und die erste Medaille seit Bronze 1964 dürfte dennoch nur ein Träumchen bleiben. Nicht nur, weil sie ihren Viertelfinalgegner bei Olympia noch nie besiegt haben (0:9), sondern weil diese US-Amerikaner bisher absolut unschlagbar wirken. Nach perfekter 5:0 Bilanz in der Vorbereitung pflügten die Favoriten auch durch die Gruppe C und gehen als Nummer eins der Setzliste in die K.-o.-Runden.", - "Zu groß ist die individuelle Qualität im Kader, zu überwältigend der Basketball, den die NBA-Stars aufs Parkett zaubern können, zu vielschichtig das Lineup-Roulette, das Head Coach Steve Kerr spielen kann. Kevin Durant (23 Punkte) brillierte in Spiel eins gegen Serbien, Bam Adebayo (18 Punkte, 7 Rebounds, 2 Blocks) überragte beim Erfolg gegen den Süd-Sudan, und Anthony Edwards lief beim Blowout-Sieg gegen Puerto Rico heiß (26 Punkte in 17 Minuten). Zusammengefügt werden sämtliche Formationen von einem zeitlos dominanten LeBron James, der drittbester Scorer (14.3 PPG), drittbester Rebounder (6,7 RPG) und bester Vorlagengeber ist (7,3 APG) seines Teams ist.", - "\"Sie sind sehr physisch, haben eine Menge guter Schützen, sind das beste Team beim Offensiv-Rebound, und spielen hart. Wir müssen gut vorbereitet sein\", warnt Kerr vor dem Aufeinandertreffen am Dienstag. Trotz fünf Spielern im Kader, die mindestens 40 Prozent ihrer Dreier treffen, stellen die Brasilianer den drittschwächsten Angriff laut Offensiv-Rating und dazu die schlechteste Abwehr aller verbleibenden Teams. Die USA hingegen sind mit zunehmender Turnierdauer immer besser in Schwung gekommen - und dabei ist Steph Curry noch nicht einmal warmgelaufen (7,3 PPG bei 26,3 Prozent Dreierquote). Klare Sache also für die Top-Favoriten." + "Lebensgeschichte besteht aus Geschichten. Judy Lybke hört man bei der Erzählung seiner DDR-Biografie gerne zu ­- am besten ohne Zeitlimit. Hat was von Abenteuer. Irgendwann schimmert jedoch durch, dass es keines war. Es war kompliziert. In der Armee fiel der junge Mann unangenehm auf. Er bekam eine zweite Chance, sollte lange Jahre in die Sowjetunion zur Ausbildung. Das schlug er aus, auch weil er nicht so weit wegwollte. Das wurde mit einem Berufs- und Studienverbot bestraft. Fortan galt er als asozial, da er keinen Beruf ausüben konnte. Indem man in der DDR keine Arbeit bekam, wurde man kriminalisiert, betont Lybke. Menschen wie ihm blieben oft nur morbide Gelegenheitsjobs, zum Beispiel als Bestatter. Ihn jedoch zog es mitten ins Leben und an die Leipziger Hochschule für Grafik und Buchkunst. Dort saß er stundenlang als Akt-Modell und schmiedete seine lebenslangen Verbindungen zu Künstlern.", + "25 Menschen arbeiten heute für die Galerie. Judy Lybke hält große Stücke auf sein Team. Er hat einen guten Blick für Leute, meint Kerstin Wahala. \"Judy ist ein unheimlich positiver Mensch und setzt nicht auf Zeitgeist. Er braucht das Zwiegespräch und den Austausch, dabei entwickelt er Ideen\", beschreibt Wahala den Galeriegründer. So wie den Einfall, für ein paar Monate nach London, Tokio oder New York zu gehen. Nach Jahren des Eingesperrtseins wollten sie alle raus in die Welt. Kaum zu glauben: Die Mieten in den Traumstädten waren günstig. Jeder Kunstschaffende hat seine Arbeiten selbst nach New York gebracht. Es gab kein Geld für Transportkosten oder gar Versicherung. \"Das ist diese Furchtlosigkeit von Judy. Wir hatten eine irre PR, über uns wurde sogar in den deutschen Abendnachrichten berichtet. Es war ein Erfolg, obwohl das gar nicht das Ziel gewesen war.\" Was wollten sie erreichen? Sie wollten etwas bewegen, der Kunst neue Fenster öffnen.", + "Den Grundstein dafür legte Judy Lybke in seiner Hinterhofwohnung am Körnerplatz in Leipzig. Er gründet im April 1983 Eigen + Art. Alle vier Wochen traf man sich zu Kunstaktionen, Performances und Gesprächen. Dabei soll Lybke die Tür auch mal nackt, mal mit drei Eiern auf dem Kopf, aufgemacht haben - Performance eben. Sehr oft aber war er im dreiteiligen braunen Nadelstreifenanzug unterwegs. Den hatte er von seinem Vater, einem Zimmermann, geliehen. Das verschaffte ihm gegenüber dem Staatssicherheitsdienst ein bisschen Respekt, die hatten ihn ständig im Visier. Die Mitarbeiter gingen bei ihm in der Wohnung ein und aus. Es gibt 18 Stasi-Akten über Judy Lybke inklusive Geruchsproben-Tüchern. Die Eigenart mit dem Dreiteiler ist bis heute geblieben und so was wie sein Markenzeichen. Seine älteste Tochter hat sich sogar schon mal einen für eine besondere Gelegenheit ausgeliehen. \"Da bin ich stolz wie Bolle gewesen. Meine Anzüge sind wie eine Wohnung für mich\", sagt er." ] }, { "headline": [ - "FIBA-Bogdanovic läuft heiß" + "Kunstkauf ohne Zinsen" ], "paragraphs": [ - "Im Halbfinale wartet dann der Sieger der Partie Serbien gegen Australien. Beide Gegner haben bereits gegen die USA gespielt: Australien beim Test in Abu Dhabi, Serbien sowohl dort, als auch am ersten Spieltag in Gruppe C. Diese Teams kennen sich also. Die \"Boomers\" gewannen zudem am 16. Juli gegen das Team von Svetislav Pesic, 84:73, und demonstrierten schon damals ihre präferierte Sorte Basketball: aggressiv in der Defensive und am Brett, ultraschnell im Umschalten von Abwehr auf Angriff, und viel Balance im Angriff.", - "Gleich fünf NBA-Spieler punkten zweistellig, angeführt von Big Man Jock Landale (17,7 Punkte und 9,7 Rebounds pro Partie), All-Rounder Josh Giddey (15,0 Punkte, 8,7 Rebounds und 6,7 Assists pro Spiel) und \"FIBA-Patty\" Mills. Der Veteran brillierte bereits beim Testspielsieg mit 28 Punkten und hat seine starke Form seither gehalten (13,3 Punkte, 41,2 Prozent Dreier). Um die dritte Halbfinalteilnahme in Folge zu klären, muss das Team von Coach Brian Goorjian den Vizeweltmeister ausschalten. Serbien holte zwei Arbeitssiege gegen Puerto Rico und Süd-Sudan, ohne bisher zu brillieren, erreichte aber dennoch mühelos das Viertelfinale - zum fünften Mal in Folge.", - "Im Gegensatz zum Duell in Abu Dhabi kann Pesic diesmal auf sein volles Spielerkontingent und seine besten Lineups zugreifen. Und das heißt nicht nur, dass der dreifache NBA-MVP Nikola Jokic mehr Minuten gehen und wie gewohnt im Interieur dominieren wird (18,7 Punkte, 11,0 Rebounds und 7,0 Assists im Schnitt bei 75,0 Prozent Zweiern), sondern dass auch einer der gefährlichsten Scorer und Schützen im internationalen Basketball wieder dabei ist.", - "Bogdan Bogdanovic zählt sowohl bei den Punkten (19,0 PPG) als auch bei den Dreiern (52,9 Prozent) zu den besten Spielern in diesem Turnier und avancierte zuletzt zum besten Scorer in der Geschichte des serbischen Basketballverbandes. Beim Sieg am letzten Spieltag nahmen \"Bogi\" (30 Punkte, 8 Assists, 2 Steals, 2 Blocks) und der \"Joker\" (22 Punkte, 13 Rebounds, 4 Assists) den Süd-Sudan in bester One-Two-Punch Manier auseinander.", - "Serbien verteilte als Team 31 Vorlagen - der höchste Wert bisher bei diesen Olympischen Spielen. Und obwohl sie zu Beginn des Turniers kein Scheunentor von Downtown trafen und eigentlich lieber über die Defensive kommen wollen, erzielen sie die zweitmeisten Punkte und stellen den dritteffizientesten Angriff aller Viertelfinalisten. Das gibt Pesics Team den theoretischen Vorteil gegenüber den Aussies - und dann am Donnerstag die Chance auf Wiedergutmachung gegen LeBron, Curry, Durant & Co ...." + "Momente des kritischen Hinterfragens gibt es immer wieder. So wie 1997 nach einer erfolgreichen Art Cologne. \"Auf der Heimfahrt nach Berlin sprachen wir darüber, dass eine zu homogene Sammlerschaft nie lange gut geht. Judy hatte Sorge, dass das Kaufinteresse nachlässt\", erinnert sich Kerstin Wahala. Eigen + Art brauchte ein frisches Label, so wie die \"Neue Leipziger Schule\". Der Chef hatte den Einfall mit den Jungsammlerinnen und -sammlern. So tituliert bekamen junge Käuferinnen und Käufer Rabatte eingeräumt und sogar die Möglichkeit, den Kunstkauf ohne Zinsen abzustottern. \"Heute haben wir Sammlerinnen und Sammler, die als solche angefangen haben.\"", + "Kreative Erleuchtungen müssen auch mal gebremst werden. Das ist die Aufgabe von Co-Chefin Kerstin Wahala. \"Wir pflegen eine gute Streitkultur. Das geht in Wellenbewegungen, mal ist man toleranter, mal weniger.\" Das Duo kennt sich gut und lange. Judy Lybke hat Kerstin Wahala vor 32 Jahren eingestellt, \"weil sie genauso viel gearbeitet hat wie ich. Das Gleiche gilt für Elke Hannemann, die die Galerie in Leipzig leitet.\" Der Chef arbeitet seit über drei Jahrzehnten mit zwei zusätzlichen Chefinnen.", + "Zurück in die Auguststraße in Berlin. Es war die erste Galerie in der Straße, in der es vor 31 Jahren nicht mal Straßenbeleuchtung gab. Inzwischen gibt es die und viele andere Kunstorte. Was macht für die beiden Eigen + Art aus? \"Begeisterung, Kraft, Zugewandtheit\", findet Kerstin Wahala. \"Die Künstlerinnen und Künstler, die wir vertreten und das Team, das die Galerie nach außen trägt\", ergänzt Judy Lybke. Dafür wird nicht nur in Leipzig und Berlin konstant gewerkelt. Sie wollen den Künstlerinnen und Künstlern den Freiraum schaffen, den sie brauchen, um ihre Kreativität auszuleben. Schließlich sind sie das Herz der Galerie. Lybke, Wahala, Hannemann und alle anderen sind viel auf internationalen Messen und an immer neuen Orten unterwegs, um sie zu promoten. Entspannung findet Judy Lybke auf Hiddensee, bei seiner Familie und \"ich freue mich total, wenn ich in die Galerie komme. Ich liebe, was ich mache.\"", + "Mehr Information zu den Standorten und aktuellen Ausstellungen von Titus Schade in Leipzig sowie Olaf Nicolai in Berlin: Galerie Eigen + Art" ] } ] @@ -199,91 +199,91 @@ { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/25136611-1722838146000/16-9/750/47887b6d5caf8b0cd0d966244e84878c.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077005-1682410865000/16-9/750/judyly.jpg", "query_width": null, "size": null, "type": "image/jpeg" } ], "is_cover": true, - "description": "Einer der emotionalen Leader im deutschen Team: Moritz Wagner.", - "caption": "Einer der emotionalen Leader im deutschen Team: Moritz Wagner.", + "description": "judyly.jpg", + "caption": "Gerd Harry Lybke, bekannt als Judy, in den 80er Jahren in seinen ersten Galerieräumen in Leipzig.", "authors": [ - "Pool via REUTERS" + "Galerie EIGEN + ART" ], - "position": 1463 + "position": 1414 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/25136619-1722838211000/16-9/320/fd0756ae1d5fcccecc6291d72cfb7875.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077028-1682411297000/16-9/320/dyyly.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/25136619-1722838211000/16-9/750/fd0756ae1d5fcccecc6291d72cfb7875.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077028-1682411297000/16-9/750/dyyly.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "\"Wenn wir so auftreten, können wir jeden schlagen\", sagt Daniel Theis.", + "description": "dyyly.jpg", "caption": null, "authors": [], - "position": 1520 + "position": 1450 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/25136620-1722838260000/16-9/320/637c53dc56b40ed18f2398aa1fb04240.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077009-1682410770000/16-9/320/judy.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/25136620-1722838260000/16-9/750/637c53dc56b40ed18f2398aa1fb04240.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077009-1682410770000/16-9/750/judy.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "Evan Fournier findet den französischen Spielstil nicht mehr zeitgemäß.", + "description": "judy.jpg", "caption": null, "authors": [], - "position": 1564 + "position": 1471 }, { "versions": [ { - "url": "https://apps-cloud.n-tv.de/img/25136621-1722838324000/16-9/320/499bb17c92dfbd2a0827cecfde4b64c7.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077020-1682411136000/3-4/320/judylyb.jpg", "query_width": "max-width:1279", "size": null, "type": "image/jpeg" }, { - "url": "https://apps-cloud.n-tv.de/img/25136621-1722838324000/16-9/750/499bb17c92dfbd2a0827cecfde4b64c7.jpg", + "url": "https://apps-cloud.n-tv.de/img/24077020-1682411136000/3-4/750/judylyb.jpg", "query_width": "max-width:767", "size": null, "type": "image/jpeg" } ], "is_cover": false, - "description": "Ein olympisches Phänomen: Kevin Durant.", + "description": "judylyb.jpg", "caption": null, "authors": [], - "position": 1583 + "position": 1488 } ], - "publishing_date": "2024-08-05 20:59:59+02:00", - "title": "Deutscher Aggressor beeindruckt, Frankreich hadert", + "publishing_date": "2023-04-28 18:11:01+02:00", + "title": "Judy Lybke, ganz und gar nicht eigenartig", "topics": [ - "Basketball", - "NBA", - "Olympische Spiele 2024 in Paris", - "Olympische Spiele" + "Leben", + "Kunst", + "Berlin", + "KunstKultur" ] } } diff --git a/tests/resources/parser/test_data/de/SZ.json b/tests/resources/parser/test_data/de/SZ.json index 3ef66623..1e82f866 100644 --- a/tests/resources/parser/test_data/de/SZ.json +++ b/tests/resources/parser/test_data/de/SZ.json @@ -1,98 +1,4 @@ { - "V1": { - "authors": [ - "Lars Brunckhorst" - ], - "body": { - "summary": [ - "Ob Radler oder Politiker - zwei Rankings lassen wieder tief blicken." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "Andere oder sich selbst mit anderen zu vergleichen, ist ein zutiefst menschliches Bedürfnis. Ob am Arbeitsplatz, in der Schule, im Sport oder bei Model-Casting-Shows - immer geht es darum: Wer ist schneller, größer, schöner, reicher oder geistreicher? Die Zahl der Rankings kennt keine Grenzen. Für alle, die von der Bundesligatabelle über die Forbes-Liste bis zu den Schlagern der Woche ein Faible für Hitlisten haben, waren die vergangenen Tage eine gute Zeit. Da verteilte zunächst der Allgemeine Deutsche Fahrradclub ADFC Noten an Deutschlands Städte und Gemeinden. Um es kurz machen: Das Münchner Umland - bei anderen Rankings wie Lebensqualität, Wirtschaftskraft und Immobilienpreisen sonst immer ganz vorne dabei - schneidet in puncto Fahrradfreundlichkeit eher nicht so gut ab. Allein Oberhaching schafft es mit einer 2,96 gerade noch aufs Treppchen. Grünwald dagegen: Mit einer 4,4 nahezu durchgefallen. Aber klar: Nirgendwo sonst ist die Sportwagen- und SUV-Dichte so groß.", - "An dieser Stelle soll aber die Rede sein von einer anderen Rangliste, wonach Marco Buschmann, der Bundesjustizminister von der FDP, der \"fleißigste deutsche Politiker\" ist, gefolgt von seiner weithin unbekannten Parteifreundin Bettina Stark-Watzinger (das ist die Bundesbildungsministerin) und - allerdings schon mit weitem Abstand - Außenministerin Annalena Baerbock von den Grünen. Bundeskanzler Olaf Scholz kommt dagegen, als erster SPDler, nur auf Platz 13 und Finanzminister Christian Lindner gar nur auf den 15. Platz. Ausgewertet wurden für die Erhebung sämtliche Aktivitäten aller Bundestagsabgeordneten, also Redezeiten, Anfragen, Anträge und dergleichen - Zwischenrufe und Handyzocken ausgenommen.", - "Das Ranking bricht nach Lindner ab, was rücksichtsvoll gegenüber den übrigen 721 Abgeordneten ist. Wer sich die Mühe machen will, kann aber selbst ausrechnen, auf welchen Plätzen etwa die Abgeordneten Florian Hahn, Anton Hofreiter und Gerold Otten gelandet sind, also jene drei, die in Berlin den Landkreis München vertreten. Investigativ, wie man uns kennt, haben wir nachgeschaut und siehe da: Grünen-Apologet Hofreiter ist, trotz oder gerade wegen seines Rauswurfs aus der ersten Reihe, mit gezählten 1922 Aktivitäten der unangefochtene Streber.", - "CSU-Mann Hahn kommt dagegen nur auf 257, aber der ist ja auch frisch verliebt. Damit ist Hahn aber immer noch weit fleißiger als drei andere Florians: etwa sein Parteifreund Florian Müller (52 Aktivitäten) und der Münchner Ex-Sozi Florian Post (74), vom rheinland-pfälzischen Florian Gerster (7!), dieser faulen Socke, ganz zu schweigen. Auf die 355 Aktivitäten von AfD-Mann Otten hätte man dagegen gerne verzichtet." - ] - } - ] - }, - "images": [ - { - "versions": [ - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/100x75?v=1626956922000", - "query_width": null, - "size": { - "width": 100, - "height": 0 - }, - "type": null - }, - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/100x75?v=1626956922000&format=webp", - "query_width": null, - "size": { - "width": 100, - "height": 0 - }, - "type": "image/webp" - }, - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/200x150?v=1626956922000", - "query_width": null, - "size": { - "width": 200, - "height": 0 - }, - "type": null - }, - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/200x150?v=1626956922000&format=webp", - "query_width": null, - "size": { - "width": 200, - "height": 0 - }, - "type": "image/webp" - }, - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/400x300?v=1626956922000", - "query_width": null, - "size": { - "width": 400, - "height": 0 - }, - "type": null - }, - { - "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/400x300?v=1626956922000&format=webp", - "query_width": null, - "size": { - "width": 400, - "height": 0 - }, - "type": "image/webp" - } - ], - "is_cover": false, - "description": "SZ Gerne draußen!", - "caption": null, - "authors": [], - "position": 362 - } - ], - "publishing_date": "2023-04-28 19:50:30+02:00", - "title": "Die Fleißigsten und Fahrradfreundlichsten im Landkreis München", - "topics": [ - "Landkreis München", - "Grünwald", - "Oberhaching", - "Süddeutsche Zeitung" - ] - }, "V1_1": { "authors": [ "Johannes Knuth" @@ -474,5 +380,99 @@ "Leserdiskussion", "Süddeutsche Zeitung" ] + }, + "V1": { + "authors": [ + "Lars Brunckhorst" + ], + "body": { + "summary": [ + "Ob Radler oder Politiker - zwei Rankings lassen wieder tief blicken." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "Andere oder sich selbst mit anderen zu vergleichen, ist ein zutiefst menschliches Bedürfnis. Ob am Arbeitsplatz, in der Schule, im Sport oder bei Model-Casting-Shows - immer geht es darum: Wer ist schneller, größer, schöner, reicher oder geistreicher? Die Zahl der Rankings kennt keine Grenzen. Für alle, die von der Bundesligatabelle über die Forbes-Liste bis zu den Schlagern der Woche ein Faible für Hitlisten haben, waren die vergangenen Tage eine gute Zeit. Da verteilte zunächst der Allgemeine Deutsche Fahrradclub ADFC Noten an Deutschlands Städte und Gemeinden. Um es kurz machen: Das Münchner Umland - bei anderen Rankings wie Lebensqualität, Wirtschaftskraft und Immobilienpreisen sonst immer ganz vorne dabei - schneidet in puncto Fahrradfreundlichkeit eher nicht so gut ab. Allein Oberhaching schafft es mit einer 2,96 gerade noch aufs Treppchen. Grünwald dagegen: Mit einer 4,4 nahezu durchgefallen. Aber klar: Nirgendwo sonst ist die Sportwagen- und SUV-Dichte so groß.", + "An dieser Stelle soll aber die Rede sein von einer anderen Rangliste, wonach Marco Buschmann, der Bundesjustizminister von der FDP, der \"fleißigste deutsche Politiker\" ist, gefolgt von seiner weithin unbekannten Parteifreundin Bettina Stark-Watzinger (das ist die Bundesbildungsministerin) und - allerdings schon mit weitem Abstand - Außenministerin Annalena Baerbock von den Grünen. Bundeskanzler Olaf Scholz kommt dagegen, als erster SPDler, nur auf Platz 13 und Finanzminister Christian Lindner gar nur auf den 15. Platz. Ausgewertet wurden für die Erhebung sämtliche Aktivitäten aller Bundestagsabgeordneten, also Redezeiten, Anfragen, Anträge und dergleichen - Zwischenrufe und Handyzocken ausgenommen.", + "Das Ranking bricht nach Lindner ab, was rücksichtsvoll gegenüber den übrigen 721 Abgeordneten ist. Wer sich die Mühe machen will, kann aber selbst ausrechnen, auf welchen Plätzen etwa die Abgeordneten Florian Hahn, Anton Hofreiter und Gerold Otten gelandet sind, also jene drei, die in Berlin den Landkreis München vertreten. Investigativ, wie man uns kennt, haben wir nachgeschaut und siehe da: Grünen-Apologet Hofreiter ist, trotz oder gerade wegen seines Rauswurfs aus der ersten Reihe, mit gezählten 1922 Aktivitäten der unangefochtene Streber.", + "CSU-Mann Hahn kommt dagegen nur auf 257, aber der ist ja auch frisch verliebt. Damit ist Hahn aber immer noch weit fleißiger als drei andere Florians: etwa sein Parteifreund Florian Müller (52 Aktivitäten) und der Münchner Ex-Sozi Florian Post (74), vom rheinland-pfälzischen Florian Gerster (7!), dieser faulen Socke, ganz zu schweigen. Auf die 355 Aktivitäten von AfD-Mann Otten hätte man dagegen gerne verzichtet." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/100x75?v=1626956922000", + "query_width": null, + "size": { + "width": 100, + "height": 0 + }, + "type": null + }, + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/100x75?v=1626956922000&format=webp", + "query_width": null, + "size": { + "width": 100, + "height": 0 + }, + "type": "image/webp" + }, + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/200x150?v=1626956922000", + "query_width": null, + "size": { + "width": 200, + "height": 0 + }, + "type": null + }, + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/200x150?v=1626956922000&format=webp", + "query_width": null, + "size": { + "width": 200, + "height": 0 + }, + "type": "image/webp" + }, + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/400x300?v=1626956922000", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": null + }, + { + "url": "https://media-cdn.sueddeutsche.de/image/sz.1.5360197/400x300?v=1626956922000&format=webp", + "query_width": null, + "size": { + "width": 400, + "height": 0 + }, + "type": "image/webp" + } + ], + "is_cover": false, + "description": "SZ Gerne draußen!", + "caption": null, + "authors": [], + "position": 362 + } + ], + "publishing_date": "2023-04-28 19:50:30+02:00", + "title": "Die Fleißigsten und Fahrradfreundlichsten im Landkreis München", + "topics": [ + "Landkreis München", + "Grünwald", + "Oberhaching", + "Süddeutsche Zeitung" + ] } } diff --git a/tests/resources/parser/test_data/de/Stern.json b/tests/resources/parser/test_data/de/Stern.json index b45a839a..b73364d0 100644 --- a/tests/resources/parser/test_data/de/Stern.json +++ b/tests/resources/parser/test_data/de/Stern.json @@ -1,108 +1,4 @@ { - "V1": { - "authors": [ - "Laura Eßlinger" - ], - "body": { - "summary": [ - "Europas Banken wollen beim Zahlungsverkehr unabhängiger von US-Firmen wie Paypal, Visa oder Apple werden. Mit EPI bringen sie bald ein neues Bezahlsystem an den Markt. Doch um mithalten zu können, muss es die Konkurrenz in drei Punkten schlagen." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "Nach Jahren des Hin und Hers hat sich Europa dazu durchgerungen, ein eigenes Zahlungssystem für Verbraucherinnen und Händler auf den Weg zu bringen. Europäische Banken hoffen, damit den US-Platzhirschen Visa, Mastercard und Apple Pay etwas entgegenzusetzen – und sich ein Stück vom ertragreichen Zahlungsmarkt sichern zu können.", - "Die European Payments Initiative (EPI) plant ab 2024 Echtzeitüberweisungen auf Basis von SEPA und Karten für den Massenzahlungsverkehr sowie für Zahlungen zwischen Privatpersonen. Verbraucherinnen und Verbraucher sollen sich dann zwischen einem weiteren Anbieter im weltweiten Markt entscheiden können. Die Kosten für Transaktionen dürften insgesamt günstiger werden." - ] - }, - { - "headline": [ - "Onlineshops sollen System 2024 bekommen" - ], - "paragraphs": [ - "Ende 2023 soll laut EPI die Pilotphase starten, wo zunächst in Deutschland und Frankreich Zahlungen zwischen Privatpersonen über eine Wallet möglich sein werden. Belgien soll kommendes Jahr mitmachen, außerdem will die Initiative weitere EU-Länder mit ins Boot holen. Ende 2024 soll das Zahlungssystems in Onlineshops eingeführt werden, 2025 auch in Ladengeschäften. \"Dann werden Kunden sowohl ihre Bankkarte – in Deutschland zum Beispiel die Girocard – als auch Debit- und Kreditkarten der internationalen Anbieter für EPI nutzen können\", zitiert das Handelsblatt EPI-Chefin Martina Weimert.", - "Doch der Markteintritt von EPI kommt für viele zu spät. \"Der Zug ist noch nicht komplett abgefahren, aber schon ordentlich in Bewegung\", sagt Christiane Neumüller, Executive Director und Expertin für Zahlungsverkehr bei der Unternehmensberatung Capco. Volker Brühl vom Center for Financial Studies der Universität Frankfurt hielt EPI schon Ende 2021 für die letzte Möglichkeit, ein Zahlungssystem zu etablieren, das im globalen Wettbewerb mithalten könne. \"Wir in Europa sind eh schon hinten dran\", sagte der Finanzprofessor.", - "Im Gegensatz zum US-amerikanischen Markt gibt es in Europa keinen Zahlungsdienstleister, der mit den US-Anbietern konkurrieren kann. Von einem europäischen Zahlungssystem könnte der Bankensektor in Europa profitieren. \"Rentieren würde sich das für die Banken frühestens nach zehn Jahren\", prognostizierte Brühl. Hinzu kommt, dass die Europäische Zentralbank an einer eigenen virtuellen Währung bastelt, dem digitalen Euro. Der müsste dann in das EU-Zahlungssystem integriert werden, befand er.", - "Zum zeitlichen Wettbewerbsnachteil gegenüber der US-Konkurrenz kommt, dass von dem Zahlungssystem längst nicht alle Banken überzeugt sind. Es droht ein Flickenteppich in Europa. „Einen gemeinsamen Nenner haben die EU-Länder noch nicht gefunden. Das kostet EPI einiges an Schlagkraft\", sagt Zahlungsverkehr-Spezialistin Neumüller.", - "Die Initiative EPI wurde 2020 von mehreren großen europäischen Banken aus Frankreich, Deutschland und Spanien gegründet, darunter BNP Paribas, Société Generale, die deutschen Sparkassen und ING. Doch von den insgesamt 32 Unterstützern sprang die Hälfte ab und wollte kein Geld in das Zahlungssystem investieren. Derzeit wird EPI noch von 16 Kreditinstituten getragen. Aus Deutschland dabei sind Deutsche Bank, DZ Bank und die Sparkassen.", - "Dass das Projekt überhaupt umgesetzt werden kann, liegt auch daran, dass EPI zwei Firmen übernehmen will und damit auf bestehende Systeme aufspringt: Die EPI Company plant, das niederländische Zahlungssystem iDEAL und den Zahlungslösungsanbieter Payconiq International (PQI) zu kaufen." - ] - }, - { - "headline": [ - "\"Zweites PayPal zu sein, wird nicht reichen\"" - ], - "paragraphs": [ - "Dass Banken nun mit dem neuen Zahlungssystem um die Ecke kämen, heiße noch nicht, dass Kunden es auch tatsächlich annehmen, sagt Neumüller. \"Verbraucher werden nur von PayPal oder Apple Pay wechseln, wenn ihnen das neue Zahlungssystem genügend Anreize bietet\", so die Expertin. \"Einfach nur ein zweites PayPal zu sein, wird nicht reichen.\"", - "Neumüller sieht drei Bedingungen, die erfüllt sein müssen, damit EPI von Kundinnen und Kunden tatsächlich angenommen wird: Erstens, müsse das System einfach sein. Langwierige Autorisierungs- und Verifikationsprozesse schrecken viele Privatkunden ab. Händlerinnen und Händler sollten das Zahlungssystem problemlos einrichten können und keine IT-Ausbildung brauchen, um es in ihr Kassensystem zu integrieren, so Neumüller. Außerdem müsse EPI flächendeckend in so vielen Geschäften und Shops wie möglich nutzbar sein.", - "Zweitens, brauche es attraktive Konditionen. Darunter versteht die Capco-Expertin die Nutzungsgebühren für Händler, die diejenigen von Paypal oder Apple Pay schlagen müssen. Bei Paypal zum Beispiel zahlen die Händler den Großteil der Gebühren, geben ihre Kosten teilweise aber über den Preis an die Endkunden weiter. Für Privatkunden sei zudem wichtig, dass es eine Geld-zurück-Garantie für Käufe gebe.", - "Die dritte Bedingung ist, dass EPI mehr Funktionen anbieten muss als die Konkurrenz: Dafür müsse das Zahlungssystem komplett ins Online- und Mobilebanking integriert werden. Eine Aussage von EPI lässt vermuten, dass die Initiative genau daran arbeitet: \"EPIs Produkt wird eine digitale 'all in one' Wallet-Lösung als Zahlungslösung basierend auf SEPA Echtzeitzahlungen und vorhandenen Girokonten unter einer einheitlichen Marke umfassen.\" Im Idealfall, so Capco-Expertin Neumüller, könne man dann über einen Button EPI als präferiertes Zahlungssystem auswählen.", - "Darüber hinaus müsse es auch Rabattaktionen und Treueprogramme geben. Denkbar sei zum Beispiel, dass Händler ein Prozent ihres Umsatzes erstattet bekommen oder Endverbraucher Punkte erhalten, wenn sie EPI nutzen.", - "Dieser Artikel ist zuerst bei \"Capital\" erschienen." - ] - } - ] - }, - "images": [ - { - "versions": [ - { - "url": "https://image.stern.de/33420090/t/NN/v4/w480/r1.7778/-/bezahlsystem.jpg", - "query_width": null, - "size": { - "width": 480, - "height": 0 - }, - "type": "image/jpeg" - }, - { - "url": "https://image.stern.de/33420090/t/EH/v4/w960/r1.7778/-/bezahlsystem.jpg", - "query_width": null, - "size": { - "width": 960, - "height": 0 - }, - "type": "image/jpeg" - }, - { - "url": "https://image.stern.de/33420090/t/jW/v4/w1440/r1.7778/-/bezahlsystem.jpg", - "query_width": null, - "size": { - "width": 1440, - "height": 0 - }, - "type": "image/jpeg" - } - ], - "is_cover": true, - "description": "Logos diverser Bezahlmethoden wie Mastercard und Apple Pay", - "caption": "Zu Bezahlmethoden wie Apple Pay, Mastercard, Paypal oder Sepa soll bald auch EPI hinzukommen", - "authors": [ - "Picture Alliance" - ], - "position": 674 - } - ], - "publishing_date": "2023-04-28 19:09:00+02:00", - "title": "Statt Paypal & Co.: So könnte Europas neues Bezahlsystem die US-Konkurrenz schlagen", - "topics": [ - "Europa", - "Apple", - "Zahlungssystem", - "PayPal", - "Bezahlsystem", - "Deutschland", - "EU", - "SEPA", - "Frankreich", - "Brühl", - "MasterCard Incorporated", - "Belgien", - "Handelsblatt", - "Unternehmensberatung", - "Universität Frankfurt" - ] - }, "V2": { "authors": [ "Jemima Kelly" @@ -303,5 +199,109 @@ "Kamala Harris", "Wahlkampf" ] + }, + "V1": { + "authors": [ + "Laura Eßlinger" + ], + "body": { + "summary": [ + "Europas Banken wollen beim Zahlungsverkehr unabhängiger von US-Firmen wie Paypal, Visa oder Apple werden. Mit EPI bringen sie bald ein neues Bezahlsystem an den Markt. Doch um mithalten zu können, muss es die Konkurrenz in drei Punkten schlagen." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "Nach Jahren des Hin und Hers hat sich Europa dazu durchgerungen, ein eigenes Zahlungssystem für Verbraucherinnen und Händler auf den Weg zu bringen. Europäische Banken hoffen, damit den US-Platzhirschen Visa, Mastercard und Apple Pay etwas entgegenzusetzen – und sich ein Stück vom ertragreichen Zahlungsmarkt sichern zu können.", + "Die European Payments Initiative (EPI) plant ab 2024 Echtzeitüberweisungen auf Basis von SEPA und Karten für den Massenzahlungsverkehr sowie für Zahlungen zwischen Privatpersonen. Verbraucherinnen und Verbraucher sollen sich dann zwischen einem weiteren Anbieter im weltweiten Markt entscheiden können. Die Kosten für Transaktionen dürften insgesamt günstiger werden." + ] + }, + { + "headline": [ + "Onlineshops sollen System 2024 bekommen" + ], + "paragraphs": [ + "Ende 2023 soll laut EPI die Pilotphase starten, wo zunächst in Deutschland und Frankreich Zahlungen zwischen Privatpersonen über eine Wallet möglich sein werden. Belgien soll kommendes Jahr mitmachen, außerdem will die Initiative weitere EU-Länder mit ins Boot holen. Ende 2024 soll das Zahlungssystems in Onlineshops eingeführt werden, 2025 auch in Ladengeschäften. \"Dann werden Kunden sowohl ihre Bankkarte – in Deutschland zum Beispiel die Girocard – als auch Debit- und Kreditkarten der internationalen Anbieter für EPI nutzen können\", zitiert das Handelsblatt EPI-Chefin Martina Weimert.", + "Doch der Markteintritt von EPI kommt für viele zu spät. \"Der Zug ist noch nicht komplett abgefahren, aber schon ordentlich in Bewegung\", sagt Christiane Neumüller, Executive Director und Expertin für Zahlungsverkehr bei der Unternehmensberatung Capco. Volker Brühl vom Center for Financial Studies der Universität Frankfurt hielt EPI schon Ende 2021 für die letzte Möglichkeit, ein Zahlungssystem zu etablieren, das im globalen Wettbewerb mithalten könne. \"Wir in Europa sind eh schon hinten dran\", sagte der Finanzprofessor.", + "Im Gegensatz zum US-amerikanischen Markt gibt es in Europa keinen Zahlungsdienstleister, der mit den US-Anbietern konkurrieren kann. Von einem europäischen Zahlungssystem könnte der Bankensektor in Europa profitieren. \"Rentieren würde sich das für die Banken frühestens nach zehn Jahren\", prognostizierte Brühl. Hinzu kommt, dass die Europäische Zentralbank an einer eigenen virtuellen Währung bastelt, dem digitalen Euro. Der müsste dann in das EU-Zahlungssystem integriert werden, befand er.", + "Zum zeitlichen Wettbewerbsnachteil gegenüber der US-Konkurrenz kommt, dass von dem Zahlungssystem längst nicht alle Banken überzeugt sind. Es droht ein Flickenteppich in Europa. „Einen gemeinsamen Nenner haben die EU-Länder noch nicht gefunden. Das kostet EPI einiges an Schlagkraft\", sagt Zahlungsverkehr-Spezialistin Neumüller.", + "Die Initiative EPI wurde 2020 von mehreren großen europäischen Banken aus Frankreich, Deutschland und Spanien gegründet, darunter BNP Paribas, Société Generale, die deutschen Sparkassen und ING. Doch von den insgesamt 32 Unterstützern sprang die Hälfte ab und wollte kein Geld in das Zahlungssystem investieren. Derzeit wird EPI noch von 16 Kreditinstituten getragen. Aus Deutschland dabei sind Deutsche Bank, DZ Bank und die Sparkassen.", + "Dass das Projekt überhaupt umgesetzt werden kann, liegt auch daran, dass EPI zwei Firmen übernehmen will und damit auf bestehende Systeme aufspringt: Die EPI Company plant, das niederländische Zahlungssystem iDEAL und den Zahlungslösungsanbieter Payconiq International (PQI) zu kaufen." + ] + }, + { + "headline": [ + "\"Zweites PayPal zu sein, wird nicht reichen\"" + ], + "paragraphs": [ + "Dass Banken nun mit dem neuen Zahlungssystem um die Ecke kämen, heiße noch nicht, dass Kunden es auch tatsächlich annehmen, sagt Neumüller. \"Verbraucher werden nur von PayPal oder Apple Pay wechseln, wenn ihnen das neue Zahlungssystem genügend Anreize bietet\", so die Expertin. \"Einfach nur ein zweites PayPal zu sein, wird nicht reichen.\"", + "Neumüller sieht drei Bedingungen, die erfüllt sein müssen, damit EPI von Kundinnen und Kunden tatsächlich angenommen wird: Erstens, müsse das System einfach sein. Langwierige Autorisierungs- und Verifikationsprozesse schrecken viele Privatkunden ab. Händlerinnen und Händler sollten das Zahlungssystem problemlos einrichten können und keine IT-Ausbildung brauchen, um es in ihr Kassensystem zu integrieren, so Neumüller. Außerdem müsse EPI flächendeckend in so vielen Geschäften und Shops wie möglich nutzbar sein.", + "Zweitens, brauche es attraktive Konditionen. Darunter versteht die Capco-Expertin die Nutzungsgebühren für Händler, die diejenigen von Paypal oder Apple Pay schlagen müssen. Bei Paypal zum Beispiel zahlen die Händler den Großteil der Gebühren, geben ihre Kosten teilweise aber über den Preis an die Endkunden weiter. Für Privatkunden sei zudem wichtig, dass es eine Geld-zurück-Garantie für Käufe gebe.", + "Die dritte Bedingung ist, dass EPI mehr Funktionen anbieten muss als die Konkurrenz: Dafür müsse das Zahlungssystem komplett ins Online- und Mobilebanking integriert werden. Eine Aussage von EPI lässt vermuten, dass die Initiative genau daran arbeitet: \"EPIs Produkt wird eine digitale 'all in one' Wallet-Lösung als Zahlungslösung basierend auf SEPA Echtzeitzahlungen und vorhandenen Girokonten unter einer einheitlichen Marke umfassen.\" Im Idealfall, so Capco-Expertin Neumüller, könne man dann über einen Button EPI als präferiertes Zahlungssystem auswählen.", + "Darüber hinaus müsse es auch Rabattaktionen und Treueprogramme geben. Denkbar sei zum Beispiel, dass Händler ein Prozent ihres Umsatzes erstattet bekommen oder Endverbraucher Punkte erhalten, wenn sie EPI nutzen.", + "Dieser Artikel ist zuerst bei \"Capital\" erschienen." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://image.stern.de/33420090/t/NN/v4/w480/r1.7778/-/bezahlsystem.jpg", + "query_width": null, + "size": { + "width": 480, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://image.stern.de/33420090/t/EH/v4/w960/r1.7778/-/bezahlsystem.jpg", + "query_width": null, + "size": { + "width": 960, + "height": 0 + }, + "type": "image/jpeg" + }, + { + "url": "https://image.stern.de/33420090/t/jW/v4/w1440/r1.7778/-/bezahlsystem.jpg", + "query_width": null, + "size": { + "width": 1440, + "height": 0 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "Logos diverser Bezahlmethoden wie Mastercard und Apple Pay", + "caption": "Zu Bezahlmethoden wie Apple Pay, Mastercard, Paypal oder Sepa soll bald auch EPI hinzukommen", + "authors": [ + "Picture Alliance" + ], + "position": 674 + } + ], + "publishing_date": "2023-04-28 19:09:00+02:00", + "title": "Statt Paypal & Co.: So könnte Europas neues Bezahlsystem die US-Konkurrenz schlagen", + "topics": [ + "Europa", + "Apple", + "Zahlungssystem", + "PayPal", + "Bezahlsystem", + "Deutschland", + "EU", + "SEPA", + "Frankreich", + "Brühl", + "MasterCard Incorporated", + "Belgien", + "Handelsblatt", + "Unternehmensberatung", + "Universität Frankfurt" + ] } } diff --git a/tests/resources/parser/test_data/de/meta.info b/tests/resources/parser/test_data/de/meta.info index 10a5f6ff..e6fe7ca4 100644 --- a/tests/resources/parser/test_data/de/meta.info +++ b/tests/resources/parser/test_data/de/meta.info @@ -79,6 +79,10 @@ "url": "https://www.freiepresse.de/chemnitz/chemnitzer-hutfestival-wann-das-fest-steigt-was-neu-ist-und-wer-fuer-eine-gute-show-sorgen-wird-artikel13351201", "crawl_date": "2024-04-30 15:23:59.090631" }, + "FreiePresse_2024_11_29.html.gz": { + "url": "https://www.freiepresse.de/nachrichten/panorama/niemand-glaubt-euch-totalschaden-netz-spott-ueber-fdp-generalsekretaer-tritt-zurueck-artikel13615373", + "crawl_date": "2024-11-29 12:34:30.620860" + }, "Gamestar_2024_04_28.html.gz": { "url": "https://www.gamestar.de/artikel/samsung-unpacked-2024-juli-leak,3412544.html", "crawl_date": "2024-04-28 10:07:11.728868" diff --git a/tests/resources/parser/test_data/es/ABC_2024_10_15.html.gz b/tests/resources/parser/test_data/es/ABC_2024_10_15.html.gz new file mode 100644 index 00000000..90ea326d Binary files /dev/null and b/tests/resources/parser/test_data/es/ABC_2024_10_15.html.gz differ diff --git a/tests/resources/parser/test_data/es/ElMundo_2024_10_15.html.gz b/tests/resources/parser/test_data/es/ElMundo_2024_10_15.html.gz new file mode 100644 index 00000000..16e4ed3a Binary files /dev/null and b/tests/resources/parser/test_data/es/ElMundo_2024_10_15.html.gz differ diff --git a/tests/resources/parser/test_data/es/ElPais.json b/tests/resources/parser/test_data/es/ElPais.json index ce3fc09b..9a229d51 100644 --- a/tests/resources/parser/test_data/es/ElPais.json +++ b/tests/resources/parser/test_data/es/ElPais.json @@ -34,6 +34,297 @@ } ] }, + "images": [ + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/PSKVEU3TZFHHTCBLL25HKORZD4?auth=3102c71c0a8b3e7a597d7458078e6a735cd258cb99f97aa64f152a6aa5d67da5&width=1200&height=675&smart=true", + "query_width": null, + "size": { + "width": 1200, + "height": 675 + }, + "type": null + } + ], + "is_cover": true, + "description": null, + "caption": "Foto: Florion Goga (REUTERS) | Vídeo: EPV", + "authors": [ + "Florion Goga (REUTERS)", + "Vídeo: EPV" + ], + "position": 185 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/UZSCTY23DVFKLMCOJ6NOYNHLG4.jpg?auth=9ac09369c2f1e8d1f8d1910484c6a8214240242b077010ac3d704d78f9fe8e0f&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/UZSCTY23DVFKLMCOJ6NOYNHLG4.jpg?auth=9ac09369c2f1e8d1f8d1910484c6a8214240242b077010ac3d704d78f9fe8e0f&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Campamento italiano para la recepción de migrantes en la ciudad portuaria de Shengjin, en el norte de Albania, el 1 de agosto de 2024.", + "caption": "Campamento italiano para la recepción de migrantes en la ciudad portuaria de Shengjin, en el norte de Albania, el 1 de agosto de 2024.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 256 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/GEHMBGXQZZH3BGF536XU5G5L44.jpg?auth=c4adcf1c161a8839c6297a1f5107a3dd4a83ecb88aebd96086ec8f3a685dec6f&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/GEHMBGXQZZH3BGF536XU5G5L44.jpg?auth=c4adcf1c161a8839c6297a1f5107a3dd4a83ecb88aebd96086ec8f3a685dec6f&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Agentes de policías italianos vigilan las cámaras de seguridad del campamento para migrantes situado en la ciudad albanesa de Shengjin, el 1 de agosto de 2024.", + "caption": "Agentes de policías italianos vigilan las cámaras de seguridad del campamento para migrantes situado en la ciudad albanesa de Shengjin, el 1 de agosto de 2024.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 262 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/GYPNQ4DDQVBMROWGCVGFLDIG3Q.jpg?auth=4d2ce17fbb82839ad5b8eb112a286c474fde40bbdf07c0d4da61db09e2e943ed&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/GYPNQ4DDQVBMROWGCVGFLDIG3Q.jpg?auth=4d2ce17fbb82839ad5b8eb112a286c474fde40bbdf07c0d4da61db09e2e943ed&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Cámaras de vigilancia en un patio del campamento italiano para migrantes en la ciudad portuaria de Shengjin, en el norte de Albania, el 1 de agosto de 2024.", + "caption": "Cámaras de vigilancia en un patio del campamento italiano para migrantes en la ciudad portuaria de Shengjin, en el norte de Albania, el 1 de agosto de 2024.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 268 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/XLP6LSEVX5ALXD7I7QVZBXZXMI.jpg?auth=98e482417d619035e228948f34f14729b7c8463106ec097ba9df1ea11ddc21fd&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/XLP6LSEVX5ALXD7I7QVZBXZXMI.jpg?auth=98e482417d619035e228948f34f14729b7c8463106ec097ba9df1ea11ddc21fd&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Una litera y sillas de plástico en el interior de un contenedor que se usará de habitación en el campamento italiano para migrantes en Gjadër (Albania), el 1 de agosto de 2024.", + "caption": "Una litera y sillas de plástico en el interior de un contenedor que se usará de habitación en el campamento italiano para migrantes en Gjadër (Albania), el 1 de agosto de 2024.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 274 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/Z42VUFMC2ZEUZNUVXUYLHGATBA.jpg?auth=f89e4f5b32ab97f8d4635c3801dff0c1aaac68d57f918f0a42739973c5d94781&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/Z42VUFMC2ZEUZNUVXUYLHGATBA.jpg?auth=f89e4f5b32ab97f8d4635c3801dff0c1aaac68d57f918f0a42739973c5d94781&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Zona de baño y aseo, en el campamento para migrantes en Gjadër (Albania), el 1 de agosto.", + "caption": "Zona de baño y aseo, en el campamento para migrantes en Gjadër (Albania), el 1 de agosto.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 280 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/3RHI4S25JFA2NNDVPYDKO2TBVE.jpg?auth=82f64b41aaa67eeb94d95cd7bd5151dad1134b91c77935a18aa8721dbe409987&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 276 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/3RHI4S25JFA2NNDVPYDKO2TBVE.jpg?auth=82f64b41aaa67eeb94d95cd7bd5151dad1134b91c77935a18aa8721dbe409987&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 552 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Contenedores que servirán de habitaciones en el campamento italiano para migrantes en Gjadër (Albania), el 1 de agosto.", + "caption": "Contenedores que servirán de habitaciones en el campamento italiano para migrantes en Gjadër (Albania), el 1 de agosto.", + "authors": [ + "Alketa Misja (dpa/picture alliance via Getty)" + ], + "position": 286 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/MTJ7JBI7KRH5JDS77CY6WCPCBE.jpg?auth=a5ad57f61cea752fcb2212cadb99536911f8e522ba7a422289601e99b727134d&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 243 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/MTJ7JBI7KRH5JDS77CY6WCPCBE.jpg?auth=a5ad57f61cea752fcb2212cadb99536911f8e522ba7a422289601e99b727134d&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 486 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/MTJ7JBI7KRH5JDS77CY6WCPCBE.jpg?auth=a5ad57f61cea752fcb2212cadb99536911f8e522ba7a422289601e99b727134d&width=980", + "query_width": null, + "size": { + "width": 980, + "height": 575 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/MTJ7JBI7KRH5JDS77CY6WCPCBE.jpg?auth=a5ad57f61cea752fcb2212cadb99536911f8e522ba7a422289601e99b727134d&width=1960", + "query_width": null, + "size": { + "width": 1960, + "height": 1150 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Agentes de la policía italiana en el campamento para migrantes de Gjadër (Albania), el 11 de octubre.", + "caption": "Agentes de la policía italiana en el campamento para migrantes de Gjadër (Albania), el 11 de octubre.", + "authors": [ + "Florion Goga (REUTERS)" + ], + "position": 329 + }, + { + "versions": [ + { + "url": "https://imagenes.elpais.com/resizer/v2/JLMWRXRKNBEB7JVP2QNQWVIFBM.jpg?auth=b064bab1dced02817466b6c47dfab58a4e6de3704f7f1ff825be47e618fa8856&width=414", + "query_width": null, + "size": { + "width": 414, + "height": 226 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/JLMWRXRKNBEB7JVP2QNQWVIFBM.jpg?auth=b064bab1dced02817466b6c47dfab58a4e6de3704f7f1ff825be47e618fa8856&width=828", + "query_width": null, + "size": { + "width": 828, + "height": 452 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/JLMWRXRKNBEB7JVP2QNQWVIFBM.jpg?auth=b064bab1dced02817466b6c47dfab58a4e6de3704f7f1ff825be47e618fa8856&width=980", + "query_width": null, + "size": { + "width": 980, + "height": 535 + }, + "type": "image/jpeg" + }, + { + "url": "https://imagenes.elpais.com/resizer/v2/JLMWRXRKNBEB7JVP2QNQWVIFBM.jpg?auth=b064bab1dced02817466b6c47dfab58a4e6de3704f7f1ff825be47e618fa8856&width=1960", + "query_width": null, + "size": { + "width": 1960, + "height": 1070 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Deportaciones Italia a Albania", + "caption": "Un miembro de la Armada italiana en el campamento para migrantes construido en Gjadër (Albania), el 11 de octubre.", + "authors": [ + "Florion Goga (REUTERS)" + ], + "position": 343 + } + ], "publishing_date": "2024-10-15 08:22:57+02:00", "title": "Bruselas sondea la apertura de centros de deportación fuera de la Unión Europea ", "topics": [ diff --git a/tests/resources/parser/test_data/es/LaVanguardia.json b/tests/resources/parser/test_data/es/LaVanguardia.json new file mode 100644 index 00000000..02111ba2 --- /dev/null +++ b/tests/resources/parser/test_data/es/LaVanguardia.json @@ -0,0 +1,116 @@ +{ + "V1": { + "authors": [ + "XavierMas de Xaxàs" + ], + "body": { + "summary": [ + "Fuertes bombardeos en el norte de Gaza dejan 43 muertos y más de cien heridos" + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "Israel llega al primer aniversario del 7 de octubre, el día más trágico de su historia, muy dividido y también muy atrapado en una guerra que se intensifica y que ayer regresó al punto de partida con los carros de combate entrando de nuevo en Gaza.", + "La división en la sociedad israelí sobre la masacre del 7 de octubre es tan fuerte que hoy habrá dos conmemoraciones, una oficial, resumida en un vídeo del Gobierno, y otra popular, en un parque de Tel Aviv, a cargo de las familias de las víctimas." + ] + }, + { + "headline": [ + "Un beduino mata a una mujer y deja diez heridos en la estación de autobuses de Beersheba" + ], + "paragraphs": [ + "El temor a que hoy haya un atentado es muy alto, sobre todo después de que ayer tarde un beduino asesinara a una mujer y dejara diez heridos en la estación de autobuses de Beersheba antes de ser abatido. El martes, siete personas murieron en un ataque parecido en una parada de tranvía en Tel Aviv.", + "La pugna por el control de la narrativa en torno al 7-O es muy intensa. El primer ministro Beniamin Netanyahu, por ejemplo, no asume ninguna responsabi­lidad por lo sucedido hace un año, cuando Hamas desbordó las defensas que rodean Gaza y ­asesinó a 1.200 personas que vivían en las inmediaciones o asistían a un festival de música electrónica.", + "Su interés político, por tanto, no está en recordar la tragedia, sino en apretar la maquinaria de ­guerra para desviar la atención sobre los fallos de seguridad.", + "Mientras el portavoz militar advierte de que se está preparando un ataque significativo contra Irán, las bombas siguieron ca­yendo sobre Líbano, especialmente en el sur de Beirut, una campaña aérea que ha forzado el desplazamiento de 1,2 millones de personas.", + "Asimismo, de madrugada, los carros de combate volvieron a entrar en el norte de Gaza. Abrieron fuego contra una mezquita y una escuela en Deir al Balah. Mataron a 45 personas e hirieron a 256, según el servicio de salud palestino. El ejército, sin embargo, explicó que habían sido “ataques precisos contra terroristas de Hamas”.", + "Yabaliya fue bombardeada desde el aire y quedó rodeada por las fuerzas israelíes. Al menos murieron 16 personas. Entre ellas había nueve niños.", + "El jefe del ejército, Herzi Halevi, anunció ayer que el brazo militar de Hamas ha sido “derrotado”, pero la realidad le desmentía. Gaza lleva una semana bajo el fuego intenso del ejército israelí, que vuelve sobre zonas que consideraba seguras, sobre todo en el norte, donde entró por primera vez el 27 de octubre.", + "Es como si la guerra volviera al punto de partida, como si toda la muerte y destrucción vertidas sobre Gaza aún fueran insuficientes para satisfacer a los generales y a los líderes políticos israelíes.", + "Hamas está muy debilitada, pero parece capaz de reagruparse bajo el liderazgo de Yahya Sinuar, agazapado en la red de túneles que son su refugio y puesto de mando. Un año después es el único gran enemigo de Israel que sigue vivo.", + "La masacre del 7 de octubre, en gran parte, fue un proyecto suyo. Llamó al plan Muro de Jericó. Fuentes citadas por The New York Times aseguran que la inteligencia israelí conoció los detalles un año antes, pero no creyó que ­Hamas pudiera penetrar el perímetro de seguridad alrededor de Gaza.", + "La noche del 6 de octubre, una centinela israelí advirtió a sus superiores de que los movimientos de varios operativos de Hamas indicaban que estaban preparán­dose para atacar, pero esta información tampoco fue tenida en cuenta.", + "Los diversos fallos de apreciación demuestran que las fuerzas de seguridad no conocían a Hamas a fondo y no estaban preparadas para responder. Los guerrilleros islamistas apenas encontraron resistencia. El vacío de poder militar y político fue extraordinario. La defensa corrió a cargo de guardias y militares de paisano. El ejército tardó muchas horas en organizar un contraataque.", + "“No había ejército, pero había soldados. No había Estado, pero había ciudadanos”, afirma uno de los supervivientes, Jonathan Shimriz, hoy al frente de la ceremonia de recuerdo en Tel Aviv. Más de 40.000 personas han querido asistir, pero el ejército ha limitado el aforo a dos mil. Las grandes aglomeraciones están prohibidas desde hace un año para no atraer el fuego enemigo.", + "Shimriz vivía en el kibutz Kfar Aza. Su hermano fue secuestrado y llevado a Gaza, pero el 16 de diciembre logró escapar con otros dos compañeros. Levantaron una bandera blanca y gritaron en hebreo al ver a las tropas israelíes, que, aun así, los mataron.", + "El homenaje a las víctimas recordará su heroísmo y también los errores militares y políticos. Será retransmitido en directo por televisión y, a continuación, el Gobierno emitirá su vídeo conmemorativo.", + "Muchas familias de los 1.200 asesinados y los 250 secuestrados se han negado a que Netanyahu utilice las imágenes de sus seres queridos para esta película.", + "Shirel Hogeg, otra de las supervivientes, implicada en la ceremonia de Tel Aviv, considera que “los políticos lo intentarán todo para que la narrativa cuadre con sus ­intereses, pero nosotros no necesitamos un vídeo sintético tipo TikTok”." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://www.lavanguardia.com/files/content_image_intermediate_filter/uploads/2024/10/07/6703cf3160479.jpeg", + "query_width": "min-width:480", + "size": null, + "type": "image/jpeg" + }, + { + "url": "https://www.lavanguardia.com/files/content_image_desktop_filter/uploads/2024/10/07/6703cf3160479.jpeg", + "query_width": "min-width:638", + "size": null, + "type": "image/jpeg" + }, + { + "url": "https://www.lavanguardia.com/files/content_image_mobile_filter/uploads/2024/10/07/6703cf3160479.jpeg", + "query_width": null, + "size": { + "width": 449, + "height": 220 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "La cúpula de la mezquita de Deir al Balah, en el norte de Gaza, donde se refugiaban varias familias, después de ser bombardeada ayer, (Muhammad Saber / EFE)", + "caption": "La cúpula de la mezquita de Deir al Balah, en el norte de Gaza, donde se refugiaban varias familias, después de ser bombardeada ayer, (Muhammad Saber / EFE)", + "authors": [], + "position": 531 + }, + { + "versions": [ + { + "url": "https://www.lavanguardia.com/files/content_image_intermediate_filter/uploads/2024/10/06/67036749c9fcd.jpeg", + "query_width": "min-width:480", + "size": null, + "type": "image/jpeg" + }, + { + "url": "https://www.lavanguardia.com/files/content_image_desktop_filter/uploads/2024/10/06/67036749c9fcd.jpeg", + "query_width": "min-width:638", + "size": null, + "type": "image/jpeg" + }, + { + "url": "https://www.lavanguardia.com/files/content_image_mobile_filter/uploads/2024/10/06/67036749c9fcd.jpeg", + "query_width": null, + "size": { + "width": 449, + "height": 299 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "El primer ministro israelí, Benjamin Netanyahu, durante su discurso ante la asamblea general de la ONU", + "caption": "El primer ministro israelí, Benjamin Netanyahu, durante su discurso ante la asamblea general de la ONU", + "authors": [ + "Naciones Unidas" + ], + "position": 610 + } + ], + "publishing_date": "2024-10-07 06:00:00+02:00", + "title": "Un Israel dividido acelera la guerra", + "topics": [ + "Benjamin Netanyahu", + "Hamas", + "Ejército israelí" + ] + } +} diff --git a/tests/resources/parser/test_data/es/LaVanguardia_2024_12_17.html.gz b/tests/resources/parser/test_data/es/LaVanguardia_2024_12_17.html.gz new file mode 100644 index 00000000..b6b7a466 Binary files /dev/null and b/tests/resources/parser/test_data/es/LaVanguardia_2024_12_17.html.gz differ diff --git a/tests/resources/parser/test_data/es/meta.info b/tests/resources/parser/test_data/es/meta.info index db9ca16a..15ccb04f 100644 --- a/tests/resources/parser/test_data/es/meta.info +++ b/tests/resources/parser/test_data/es/meta.info @@ -10,5 +10,9 @@ "ElPais_2024_10_15.html.gz": { "url": "https://elpais.com/internacional/2024-10-15/bruselas-sondea-la-apertura-de-centros-de-deportacion-fuera-de-la-union-europea.html", "crawl_date": "2024-10-15 17:43:35.457824" + }, + "LaVanguardia_2024_12_17.html.gz": { + "url": "https://www.lavanguardia.com/internacional/20241007/10000613/israel-dividido-acelera-guerra.html", + "crawl_date": "2024-12-17 14:56:29.629422" } } diff --git a/tests/resources/parser/test_data/ind/Bhaskar.json b/tests/resources/parser/test_data/ind/Bhaskar.json index b0ea58dd..fcb6d3b7 100644 --- a/tests/resources/parser/test_data/ind/Bhaskar.json +++ b/tests/resources/parser/test_data/ind/Bhaskar.json @@ -19,6 +19,116 @@ } ] }, + "images": [ + { + "versions": [ + { + "url": "https://images.bhaskarassets.com/webp/thumb/360x0/web2images/521/2024/09/04/img2024090415303135_1725444731.jpg", + "query_width": "max-width:768", + "size": { + "width": 360, + "height": 270 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/webp/thumb/512x0/web2images/521/2024/09/04/img2024090415303135_1725444731.jpg", + "query_width": "min-width:768", + "size": { + "width": 512, + "height": 384 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/web2images/521/2024/09/04/img2024090415303135_1725444731.jpg", + "query_width": null, + "size": { + "width": 720, + "height": 540 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "ASP संजय पांडे और थाना अध्यक्ष मनीषा कुमारी। - Dainik Bhaskar", + "caption": "ASP संजय पांडे और थाना अध्यक्ष मनीषा कुमारी।", + "authors": [], + "position": 351 + }, + { + "versions": [ + { + "url": "https://images.bhaskarassets.com/webp/thumb/360x0/web2images/521/2024/09/04/img2024090415302212_1725444676.jpg", + "query_width": "max-width:768", + "size": { + "width": 360, + "height": 203 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/webp/thumb/512x0/web2images/521/2024/09/04/img2024090415302212_1725444676.jpg", + "query_width": "min-width:768", + "size": { + "width": 512, + "height": 289 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/web2images/521/2024/09/04/img2024090415302212_1725444676.jpg", + "query_width": null, + "size": { + "width": 848, + "height": 478 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "जानकारी देते एएसपी", + "caption": "जानकारी देते एएसपी", + "authors": [], + "position": 371 + }, + { + "versions": [ + { + "url": "https://images.bhaskarassets.com/webp/thumb/360x0/web2images/521/2024/09/04/img2024090415302640_1725444705.jpg", + "query_width": "max-width:768", + "size": { + "width": 360, + "height": 203 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/webp/thumb/512x0/web2images/521/2024/09/04/img2024090415302640_1725444705.jpg", + "query_width": "min-width:768", + "size": { + "width": 512, + "height": 289 + }, + "type": "image/webp" + }, + { + "url": "https://images.bhaskarassets.com/web2images/521/2024/09/04/img2024090415302640_1725444705.jpg", + "query_width": null, + "size": { + "width": 848, + "height": 478 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "बरामद गहना", + "caption": "बरामद गहना", + "authors": [], + "position": 379 + } + ], "publishing_date": "2024-09-04 16:20:35+05:30", "title": "समस्तीपुर पुलिस ने 2 बदमाशों को पकड़ा: दो दिनों के अंदर चोरी कांड का किया खुलासा, गहना भी बरामद", "topics": [ diff --git a/tests/resources/parser/test_data/jp/TheJapanNews.json b/tests/resources/parser/test_data/jp/TheJapanNews.json index de908bb7..e92a50be 100644 --- a/tests/resources/parser/test_data/jp/TheJapanNews.json +++ b/tests/resources/parser/test_data/jp/TheJapanNews.json @@ -35,6 +35,25 @@ } ] }, + "images": [ + { + "versions": [ + { + "url": "https://japannews.yomiuri.co.jp/wp-content/uploads/2024/10/scanner-debate.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": null, + "caption": "The leaders of seven political parties, including Liberal Democratic Party President Shigeru Ishiba, center, participate in a debate hosted by the Japan National Press Club in Tokyo on Saturday.", + "authors": [ + "The Yomiuri Shimbun" + ], + "position": 593 + } + ], "publishing_date": "2024-10-13 17:41:00+09:00", "title": "Japan Prime Minister Dodges Criticism During Leaders Debate; Takes Cautious Stance on Revising Japan-U.S. Pact", "topics": [ diff --git a/tests/resources/parser/test_data/jp/YomiuriShimbun.json b/tests/resources/parser/test_data/jp/YomiuriShimbun.json index 283b4a33..0acf4d26 100644 --- a/tests/resources/parser/test_data/jp/YomiuriShimbun.json +++ b/tests/resources/parser/test_data/jp/YomiuriShimbun.json @@ -9,18 +9,40 @@ { "headline": [], "paragraphs": [ - "プロ野球・阪神タイガースの次期監督に球団OBの藤川球児氏(44)が就任することが分かった。藤川氏の内諾を得ているといい、球団幹部は「勝ち続けることと若手育成の観点から選んだ」と語った。近く発表される予定。阪神は13日、クライマックスシリーズで敗退。岡田 彰布 ( あきのぶ ) 監督(66)は今季で退任する。", - "藤川氏は1999年、高知商高(高知)からドラフト1位で阪神に入団。2005年、当時指揮を執った岡田監督のもと、救援投手として80試合に登板し、セ・リーグ優勝に貢献。ジェフ・ウィリアムス、久保田智之両投手と形成したリリーフ陣は、それぞれの頭文字から「JFK」と呼ばれた。", - "12年オフに米大リーグ挑戦を表明。独立リーグの四国アイランドリーグplus・高知ファイティングドッグスを経て、16年に阪神へ復帰した。20年の現役引退後、球団フロントに加わり、外国人選手の補強などに関わった。日本で最多セーブのタイトルを2度獲得し、日米通算成績は61勝39敗245セーブ。〈関連記事スポーツ面〉" + "【ソウル=小池和樹】韓国の 尹錫悦(ユンソンニョル) 大統領は3日夜、緊急談話を出し、野党が国政をまひさせているとして「非常戒厳」を宣言した。尹氏は「従北(北朝鮮に従う)勢力の清算と憲政秩序を守るためだ」とし、共産主義勢力から国を守る必要があるとの理由を挙げた。具体的な措置については明らかにされていない。", + "尹氏は野党が政府高官や検事らへの 弾劾(だんがい) 訴追案を提出している点などを挙げ、「内乱を企てる明白な反国家行為だ。自由民主主義体制の転覆を企てている」と指摘した。", + "◆韓国の戒厳令= 韓国憲法は第77条で、大統領は、戦時などの国家緊急事態や公共の安寧秩序を維持する必要がある場合に、戒厳令を宣布することができると定めている。非常戒厳が宣布された際は、法律が定めるところにより、言論・出版・集会・結社の自由などに関する特別な措置をとることができるとしている。" ] } ] }, - "publishing_date": "2024-10-13 22:43:00+09:00", - "title": "阪神新監督に藤川氏 ", + "images": [ + { + "versions": [ + { + "url": "https://www.yomiuri.co.jp/media/2024/12/20241203-OYT1I50202-1.jpg?type=large", + "query_width": null, + "size": { + "width": 1000, + "height": 666 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "尹大統領の発言をテレビで見る国民(ソウルで、3日)=AP", + "caption": "尹大統領の発言をテレビで見る国民(ソウルで、3日)", + "authors": [ + "AP" + ], + "position": 1451 + } + ], + "publishing_date": "2024-12-03 23:17:00+09:00", + "title": "韓国が戒厳令、尹大統領「野党が反国家行為」…「従北勢力を清算」「共産勢力から国守る」", "topics": [ - "#阪神", - "#日本" + "#北朝鮮", + "#韓国" ] } } diff --git a/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_10_13.html.gz b/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_10_13.html.gz deleted file mode 100644 index f101b8a4..00000000 Binary files a/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_10_13.html.gz and /dev/null differ diff --git a/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_12_03.html.gz b/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_12_03.html.gz new file mode 100644 index 00000000..34bcac24 Binary files /dev/null and b/tests/resources/parser/test_data/jp/YomiuriShimbun_2024_12_03.html.gz differ diff --git a/tests/resources/parser/test_data/jp/meta.info b/tests/resources/parser/test_data/jp/meta.info index f044b543..438a2da8 100644 --- a/tests/resources/parser/test_data/jp/meta.info +++ b/tests/resources/parser/test_data/jp/meta.info @@ -3,8 +3,8 @@ "url": "https://japannews.yomiuri.co.jp/politics/politics-government/20241013-216478/", "crawl_date": "2024-10-13 16:27:01.520980" }, - "YomiuriShimbun_2024_10_13.html.gz": { - "url": "https://www.yomiuri.co.jp/local/kansai/news/20241013-OYO1T50044/", - "crawl_date": "2024-10-13 16:52:57.081306" + "YomiuriShimbun_2024_12_03.html.gz": { + "url": "https://www.yomiuri.co.jp/world/20241203-OYT1T50218/", + "crawl_date": "2024-12-03 16:21:55.640474" } } diff --git a/tests/resources/parser/test_data/my/MalayMail.json b/tests/resources/parser/test_data/my/MalayMail.json index 572604b9..6e7087b6 100644 --- a/tests/resources/parser/test_data/my/MalayMail.json +++ b/tests/resources/parser/test_data/my/MalayMail.json @@ -39,7 +39,7 @@ "description": "A file photograph shows Communications Minister Fahmi Fadzil speaking at Menara KWSP in Shah Alam on November 19, 2024. — Picture by Yusof Mat Isa", "caption": "A file photograph shows Communications Minister Fahmi Fadzil speaking at Menara KWSP in Shah Alam on November 19, 2024.", "authors": [ - "Picture by Yusof Mat Isa" + "Yusof Mat Isa" ], "position": 467 } diff --git a/tests/resources/parser/test_data/na/TheNamibian.json b/tests/resources/parser/test_data/na/TheNamibian.json index c339cbfc..c704af0b 100644 --- a/tests/resources/parser/test_data/na/TheNamibian.json +++ b/tests/resources/parser/test_data/na/TheNamibian.json @@ -1,102 +1,4 @@ { - "V1": { - "authors": [ - "Timo Shihepo" - ], - "body": { - "summary": [ - "Environmentalists have strongly cautioned against a proposed plan that intends to construct a green hydrogen pipeline from Namibia’s Kunene region to Boegoebaai in South Africa’s Northern Cape province." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "They are concerned about the pipeline’s potential impact on indigenous communities, cherished national parks, animals and plants that inhabit the Namibian coast, which has been declared the eighth largest marine protected area in the world and the largest in Africa.", - "Despite these concerns, the two governments have given technocrats from both countries six months to amend agreements to include green hydrogen.", - "The pipeline will stretch from the Kunene region via Walvis Bay in the Erongo region, along the coast to Lüderitz and Boegoebaai, located 20km south of the border between Namibia and South Africa, in the Northern Cape.", - "Namibia has about six green hydrogen projects intended to be connected to South Africa through a corridor.", - "“You have different locations you need to connect with the infrastructure. It’s more efficient when you develop this corridor by sharing infrastructure,” minister of mines and energy Tom Alweendo told The Namibian last month at the green hydrogen summit in Cape Town.", - "“You can then connect that to South Africa. It could work independently, but why not make it bigger by having a corridor?” he suggested.", - "The scope of cooperation between the two countries since 2013 is anchored by 74 agreements, however, none makes provision for green hydrogen.", - "“While we are looking at amplifying our [agreement], there is nothing stopping us from carrying out the work,” he said.Alweendo said the necessary infrastructure is already being constructed.", - "STRATEGIC CORRIDORS", - "In 2021, the South African government laid out strategic gas pipeline corridors in nine phases.", - "Phase six includes a pipeline that connects Abraham Villiers Bay in the Northern Cape to Oranjemund in Namibia.", - "South Africa’s minister of electricity, Kgosientsho Ramokgopa, told The Namibian last month that the two countries would sign a new agreement to include green hydrogen opportunities.", - "“The principals [two presidents] gave us an instruction to expand the [agreement] to include those opportunities and come back in six months,” he said.", - "“We see it as an opportunity for us to benefit from scale and aggregation. The potential for shared infrastructure is a functional conversation we are having with Namibia,” Ramokgopa said.", - "The mooted green hydrogen pipeline project will be managed by the government-owned Transnet on the South African side.", - "‘MASSIVE RISKS’", - "However, Transnet pipelines executive Russell Bradbrooke has reservations about the project.", - "“It’s an option to transport green hydrogen in its initial form instead of ammonia. If we are going to do a long-distance hydrogen pipeline, I have a lot of concerns,” he said, referring to theft along Transnet’s pipelines.", - "Bradbrooke said warning people of the risk of green hydrogen would not deter them.", - "“We have a lot of challenges with people trying to steal fuel.", - "“It is a potential thing, but I think it will bring massive risks. If you try to steal from that green hydrogen pipeline and you get it wrong, then you have really destroyed massive infrastructure, and possibly [caused] deaths in the area.”", - "Green hydrogen can be transported in its initial form or in the form of ammonia.", - "The head of Transnet’s engineering centre of excellence, Tauqeer Ahmed, says the problem with liquefying hydrogen is that it involves extreme effort.", - "“Commercially, it doesn’t make sense. It is just too expensive. If you are transporting green hydrogen within the city, it makes sense to liquify it.", - "“In a perfect world without theft and other risks, transporting green hydrogen in a pipe from city to city or country to country, you won’t have to worry about ammonia and methanol to break it up and crack open again.", - "“However, for us to export our green hydrogen internationally, to be cost effective, our best bet would be ammonia and methanol, because of the long distance.”", - "Mlungisi Mvoko, the finance, economic development, environmental affairs and tourism member of the Eastern Cape’s executive council, wants to see the corridor stretching as far as Angola.", - "“Bringing in Angola and Namibia is important for the Southern African Development Community region and Africa, which means we will be facing the world together.", - "“The cooperation we would have with Namibia and Angola would actually create complementary competition in Africa.”", - "POTENTIAL DAMAGE", - "While the Namibian and South African governments say they have met with rural communities and assessed potential damage, environmentalists say nothing has been done to ensure the environment is not damaged.", - "Environmental justice activist Rinaani Musutua says the construction of a pipeline in a protected area would heavily impact or completely destroy the ecological functioning of the whole area or park.", - "“… including the unique and important coastal and marine habitats ..,” she says.", - "Musutua says such a large industrial project contradicts the tourism development plan adopted by the Ministry of Environment, Forestry and Tourism in 2020.", - "“This underlines that Namibia is no longer committed to conservation and sustainable development,” she says.", - "Musutua said the project should not have been envisaged before a comprehensive strategic environmental and social assessment, adding that the environmental clause in the Namibian Constitution should be respected.", - "Other environmentalists say a well-detailed environmental protection plan has not been drafted.", - "“In the absence of such a plan, marine and wildlife, migratory birds and the world’s only arid biodiversity hotspots would also be permanently and irreversibly damaged,” Environmental organisation Frack Free Namibia says.", - "Frack Free Namibia says green hydrogen seriously jeopardises the Tsau //Khaeb National Park if an integrated park management plan is not adopted.", - "Lauren Nel from Natural Justice in Cape Town says: “We demand full disclosure of the business deals entered into at the summit, including the [agreements] signed at the commencement.”", - "Samson Mokoena from South African-based Vaal Environmental Justice Alliance says: “In this hydrogen rush, we are seeing no clear policy direction.”" - ] - } - ] - }, - "images": [ - { - "versions": [ - { - "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3-300x180.jpg", - "query_width": null, - "size": { - "width": 300, - "height": 180 - }, - "type": "image/jpeg" - }, - { - "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3-696x418.jpg", - "query_width": null, - "size": { - "width": 696, - "height": 418 - }, - "type": "image/jpeg" - }, - { - "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3.jpg", - "query_width": null, - "size": { - "width": 751, - "height": 451 - }, - "type": "image/jpeg" - } - ], - "is_cover": true, - "description": null, - "caption": "Tom Alweendo", - "authors": [], - "position": 795 - } - ], - "publishing_date": "2023-11-15 17:00:00+00:00", - "title": "Nam, SA Green hydrogen pipeline flagged" - }, "V1_1": { "authors": [ "Eliaser Ndeyanale" @@ -299,5 +201,103 @@ ], "publishing_date": "2024-02-20 19:05:24+02:00", "title": "Mbumba recounts Geingob’s last days" + }, + "V1": { + "authors": [ + "Timo Shihepo" + ], + "body": { + "summary": [ + "Environmentalists have strongly cautioned against a proposed plan that intends to construct a green hydrogen pipeline from Namibia’s Kunene region to Boegoebaai in South Africa’s Northern Cape province." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "They are concerned about the pipeline’s potential impact on indigenous communities, cherished national parks, animals and plants that inhabit the Namibian coast, which has been declared the eighth largest marine protected area in the world and the largest in Africa.", + "Despite these concerns, the two governments have given technocrats from both countries six months to amend agreements to include green hydrogen.", + "The pipeline will stretch from the Kunene region via Walvis Bay in the Erongo region, along the coast to Lüderitz and Boegoebaai, located 20km south of the border between Namibia and South Africa, in the Northern Cape.", + "Namibia has about six green hydrogen projects intended to be connected to South Africa through a corridor.", + "“You have different locations you need to connect with the infrastructure. It’s more efficient when you develop this corridor by sharing infrastructure,” minister of mines and energy Tom Alweendo told The Namibian last month at the green hydrogen summit in Cape Town.", + "“You can then connect that to South Africa. It could work independently, but why not make it bigger by having a corridor?” he suggested.", + "The scope of cooperation between the two countries since 2013 is anchored by 74 agreements, however, none makes provision for green hydrogen.", + "“While we are looking at amplifying our [agreement], there is nothing stopping us from carrying out the work,” he said.Alweendo said the necessary infrastructure is already being constructed.", + "STRATEGIC CORRIDORS", + "In 2021, the South African government laid out strategic gas pipeline corridors in nine phases.", + "Phase six includes a pipeline that connects Abraham Villiers Bay in the Northern Cape to Oranjemund in Namibia.", + "South Africa’s minister of electricity, Kgosientsho Ramokgopa, told The Namibian last month that the two countries would sign a new agreement to include green hydrogen opportunities.", + "“The principals [two presidents] gave us an instruction to expand the [agreement] to include those opportunities and come back in six months,” he said.", + "“We see it as an opportunity for us to benefit from scale and aggregation. The potential for shared infrastructure is a functional conversation we are having with Namibia,” Ramokgopa said.", + "The mooted green hydrogen pipeline project will be managed by the government-owned Transnet on the South African side.", + "‘MASSIVE RISKS’", + "However, Transnet pipelines executive Russell Bradbrooke has reservations about the project.", + "“It’s an option to transport green hydrogen in its initial form instead of ammonia. If we are going to do a long-distance hydrogen pipeline, I have a lot of concerns,” he said, referring to theft along Transnet’s pipelines.", + "Bradbrooke said warning people of the risk of green hydrogen would not deter them.", + "“We have a lot of challenges with people trying to steal fuel.", + "“It is a potential thing, but I think it will bring massive risks. If you try to steal from that green hydrogen pipeline and you get it wrong, then you have really destroyed massive infrastructure, and possibly [caused] deaths in the area.”", + "Green hydrogen can be transported in its initial form or in the form of ammonia.", + "The head of Transnet’s engineering centre of excellence, Tauqeer Ahmed, says the problem with liquefying hydrogen is that it involves extreme effort.", + "“Commercially, it doesn’t make sense. It is just too expensive. If you are transporting green hydrogen within the city, it makes sense to liquify it.", + "“In a perfect world without theft and other risks, transporting green hydrogen in a pipe from city to city or country to country, you won’t have to worry about ammonia and methanol to break it up and crack open again.", + "“However, for us to export our green hydrogen internationally, to be cost effective, our best bet would be ammonia and methanol, because of the long distance.”", + "Mlungisi Mvoko, the finance, economic development, environmental affairs and tourism member of the Eastern Cape’s executive council, wants to see the corridor stretching as far as Angola.", + "“Bringing in Angola and Namibia is important for the Southern African Development Community region and Africa, which means we will be facing the world together.", + "“The cooperation we would have with Namibia and Angola would actually create complementary competition in Africa.”", + "POTENTIAL DAMAGE", + "While the Namibian and South African governments say they have met with rural communities and assessed potential damage, environmentalists say nothing has been done to ensure the environment is not damaged.", + "Environmental justice activist Rinaani Musutua says the construction of a pipeline in a protected area would heavily impact or completely destroy the ecological functioning of the whole area or park.", + "“… including the unique and important coastal and marine habitats ..,” she says.", + "Musutua says such a large industrial project contradicts the tourism development plan adopted by the Ministry of Environment, Forestry and Tourism in 2020.", + "“This underlines that Namibia is no longer committed to conservation and sustainable development,” she says.", + "Musutua said the project should not have been envisaged before a comprehensive strategic environmental and social assessment, adding that the environmental clause in the Namibian Constitution should be respected.", + "Other environmentalists say a well-detailed environmental protection plan has not been drafted.", + "“In the absence of such a plan, marine and wildlife, migratory birds and the world’s only arid biodiversity hotspots would also be permanently and irreversibly damaged,” Environmental organisation Frack Free Namibia says.", + "Frack Free Namibia says green hydrogen seriously jeopardises the Tsau //Khaeb National Park if an integrated park management plan is not adopted.", + "Lauren Nel from Natural Justice in Cape Town says: “We demand full disclosure of the business deals entered into at the summit, including the [agreements] signed at the commencement.”", + "Samson Mokoena from South African-based Vaal Environmental Justice Alliance says: “In this hydrogen rush, we are seeing no clear policy direction.”" + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3-300x180.jpg", + "query_width": null, + "size": { + "width": 300, + "height": 180 + }, + "type": "image/jpeg" + }, + { + "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3-696x418.jpg", + "query_width": null, + "size": { + "width": 696, + "height": 418 + }, + "type": "image/jpeg" + }, + { + "url": "https://namibian-website.s3.af-south-1.amazonaws.com/wp-content/uploads/2023/06/27115846/Tom-Alweendo-3.jpg", + "query_width": null, + "size": { + "width": 751, + "height": 451 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": null, + "caption": "Tom Alweendo", + "authors": [], + "position": 795 + } + ], + "publishing_date": "2023-11-15 17:00:00+00:00", + "title": "Nam, SA Green hydrogen pipeline flagged" } } diff --git a/tests/resources/parser/test_data/uk/DailyStar.json b/tests/resources/parser/test_data/uk/DailyStar.json index 0860ea38..10fc1043 100644 --- a/tests/resources/parser/test_data/uk/DailyStar.json +++ b/tests/resources/parser/test_data/uk/DailyStar.json @@ -57,7 +57,7 @@ "description": "A crowd of people at the Cinderella Castle in Walt Disney World in Florida", "caption": "A crowd of people at the Cinderella Castle in Walt Disney World in Florida", "authors": [ - "( LightRocket via Getty Images)" + "LightRocket via Getty Images" ], "position": 513 }, @@ -74,7 +74,7 @@ "description": "Tourists line Main Street and take photos of a parade going by at the Magic Kingdom Park at Walt Disney World", "caption": "Tourists line Main Street and take photos of a parade going by at the Magic Kingdom Park at Walt Disney World", "authors": [ - "( Anadolu Agency via Getty Images)" + "Anadolu Agency via Getty Images" ], "position": 541 }, @@ -91,7 +91,7 @@ "description": "Fireworks at Walt Disney World Florida's Sleeping Beauty castle", "caption": "Fireworks at Walt Disney World Florida's Sleeping Beauty castle", "authors": [ - "( Getty Images)" + "Getty Images" ], "position": 558 }, @@ -108,7 +108,7 @@ "description": "Guests stop to take a selfie at Magic Kingdom Park at Walt Disney World Resort", "caption": "You can save a fortune by booking at the right time of year", "authors": [ - "( Walt Disney World Resort via Getty Images)" + "Walt Disney World Resort via Getty Images" ], "position": 573 }, @@ -125,7 +125,7 @@ "description": "You'll get to see all the magical parades and characters at Disney World", "caption": "You'll get to see all the magical parades and characters at Disney World", "authors": [ - "( Walt Disney World Resort via Getty Images)" + "Walt Disney World Resort via Getty Images" ], "position": 588 } diff --git a/tests/resources/parser/test_data/uk/EveningStandard.json b/tests/resources/parser/test_data/uk/EveningStandard.json index 3ec1827c..bfe4f9cc 100644 --- a/tests/resources/parser/test_data/uk/EveningStandard.json +++ b/tests/resources/parser/test_data/uk/EveningStandard.json @@ -1,135 +1,4 @@ { - "V1": { - "authors": [ - "Nizaar Kinsella" - ], - "body": { - "summary": [ - "Blues show season is still alive and European qualification is on the cards" - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "Chelsea have delivered a message of intent and roared their season was not dead after beating Tottenham.", - "Much has been made about whether Mauricio Pochettino will continue as manager next season, but against Spurs, the club where he made his name, Chelsea team put in a performance packed with both character and quality.", - "This wasn’t the battle of Stamford Bridge eight years ago, but it was one of Chelsea's most impressive wins of the season as they dominated while handling a staggering 14-man injury list.", - "Yet, the Blues were superior to Ange Postecoglou’s Champions League chasers and deserved to take home three points after goals from Trevoh Chalobah and Nicolas Jackson.", - "Gallagher’s day in the spotlight", - "The Shed End held up a banner to send a simple message to Chelsea’s sporting directors, Paul Winstanley and Laurence Stewart: do not sell our homegrown star.", - "The crowd-surfing banner actually read: “Chelsea since birth”.", - "But the message was clear ahead of kick-off all while Spurs are tipped with making a summer move for Gallagher and Chelsea may need to balance the books by selling academy players.", - "On the pitch, Gallagher was exceptional. He dominated the midfield battle, outshining Moises Caicedo, as the pairing dominated Pape Matar Sarr and Yves Bissouma.", - "His curling free-kick was headed in by fellow academy graduate Trevoh Chalobah, who could also be sold.", - "Chalobah also flies the academy flag", - "Chalobah was the most decisive player at either end of the pitch, scoring a stunning header in the 24th minute.", - "He then made a goal-saving block from a Sarr shot later in the first half as Spurs took control.", - "It’s a real shame that football accounting and the concept of ‘pure profit’ might mean he leaves Chelsea, as he is so committed to the cause.", - "Alfie Gilchrist also dealt very well with Son Heung-min and Josh Acheamong, who turns 18 in three days, came on for his Chelsea debut.", - "It was a proud day for the academy at Cobham.", - "Chelsea’s propelled into Euro race", - "This match was always going to be key, the rescheduled game from February, which became Chelsea’s game in hand over Newcastle and Manchester United.", - "Now Chelsea know exactly what they need to do. They have four games left to claw back a three-point gap between Erik Ten Hag’s sixth-place team.", - "Newcastle, who are seventh, are two points above Chelsea but with a vastly superior goal difference.", - "The challenge feels achievable but the Blues this well when facing West Ham, Nottingham Forest and Bournemouth to reach the Europa League or Conference League." - ] - } - ] - }, - "images": [ - { - "versions": [ - { - "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=320", - "query_width": "max-width:1000", - "size": { - "width": 320, - "height": 213 - }, - "type": "image/jpeg" - }, - { - "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=640", - "query_width": "max-width:1000", - "size": { - "width": 640, - "height": 427 - }, - "type": "image/jpeg" - }, - { - "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=900", - "query_width": "max-width:1000", - "size": { - "width": 900, - "height": 600 - }, - "type": "image/jpeg" - }, - { - "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=1024", - "query_width": "max-width:1000", - "size": { - "width": 1024, - "height": 683 - }, - "type": "image/jpeg" - } - ], - "is_cover": true, - "description": null, - "caption": "Chelsea beat Tottenham on Thursday night", - "authors": [ - "Getty Images" - ], - "position": 170 - }, - { - "versions": [ - { - "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=320", - "query_width": "max-width:1000", - "size": { - "width": 320, - "height": 219 - }, - "type": "image/jpeg" - }, - { - "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=640", - "query_width": "max-width:1000", - "size": { - "width": 640, - "height": 438 - }, - "type": "image/jpeg" - }, - { - "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=960", - "query_width": "max-width:1000", - "size": { - "width": 960, - "height": 657 - }, - "type": "image/jpeg" - } - ], - "is_cover": false, - "description": null, - "caption": "Chelsea fans produced a banner backing Conor Gallagher", - "authors": [ - "REUTERS" - ], - "position": 238 - } - ], - "publishing_date": "2024-05-02 20:53:56+00:00", - "title": "Chelsea send clear message of intent on proud day at Cobham", - "topics": [ - "Tottenham", - "Mauricio Pochettino" - ] - }, "V1_1": { "authors": [ "Dylan Jones" @@ -355,5 +224,136 @@ "Keir Starmer", "Labour" ] + }, + "V1": { + "authors": [ + "Nizaar Kinsella" + ], + "body": { + "summary": [ + "Blues show season is still alive and European qualification is on the cards" + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "Chelsea have delivered a message of intent and roared their season was not dead after beating Tottenham.", + "Much has been made about whether Mauricio Pochettino will continue as manager next season, but against Spurs, the club where he made his name, Chelsea team put in a performance packed with both character and quality.", + "This wasn’t the battle of Stamford Bridge eight years ago, but it was one of Chelsea's most impressive wins of the season as they dominated while handling a staggering 14-man injury list.", + "Yet, the Blues were superior to Ange Postecoglou’s Champions League chasers and deserved to take home three points after goals from Trevoh Chalobah and Nicolas Jackson.", + "Gallagher’s day in the spotlight", + "The Shed End held up a banner to send a simple message to Chelsea’s sporting directors, Paul Winstanley and Laurence Stewart: do not sell our homegrown star.", + "The crowd-surfing banner actually read: “Chelsea since birth”.", + "But the message was clear ahead of kick-off all while Spurs are tipped with making a summer move for Gallagher and Chelsea may need to balance the books by selling academy players.", + "On the pitch, Gallagher was exceptional. He dominated the midfield battle, outshining Moises Caicedo, as the pairing dominated Pape Matar Sarr and Yves Bissouma.", + "His curling free-kick was headed in by fellow academy graduate Trevoh Chalobah, who could also be sold.", + "Chalobah also flies the academy flag", + "Chalobah was the most decisive player at either end of the pitch, scoring a stunning header in the 24th minute.", + "He then made a goal-saving block from a Sarr shot later in the first half as Spurs took control.", + "It’s a real shame that football accounting and the concept of ‘pure profit’ might mean he leaves Chelsea, as he is so committed to the cause.", + "Alfie Gilchrist also dealt very well with Son Heung-min and Josh Acheamong, who turns 18 in three days, came on for his Chelsea debut.", + "It was a proud day for the academy at Cobham.", + "Chelsea’s propelled into Euro race", + "This match was always going to be key, the rescheduled game from February, which became Chelsea’s game in hand over Newcastle and Manchester United.", + "Now Chelsea know exactly what they need to do. They have four games left to claw back a three-point gap between Erik Ten Hag’s sixth-place team.", + "Newcastle, who are seventh, are two points above Chelsea but with a vastly superior goal difference.", + "The challenge feels achievable but the Blues this well when facing West Ham, Nottingham Forest and Bournemouth to reach the Europa League or Conference League." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=320", + "query_width": "max-width:1000", + "size": { + "width": 320, + "height": 213 + }, + "type": "image/jpeg" + }, + { + "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=640", + "query_width": "max-width:1000", + "size": { + "width": 640, + "height": 427 + }, + "type": "image/jpeg" + }, + { + "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=900", + "query_width": "max-width:1000", + "size": { + "width": 900, + "height": 600 + }, + "type": "image/jpeg" + }, + { + "url": "https://static.standard.co.uk/2024/05/02/20/27/Chelsea0205A.jpg?trim=64,0,65,0&quality=75&auto=webp&width=1024", + "query_width": "max-width:1000", + "size": { + "width": 1024, + "height": 683 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": null, + "caption": "Chelsea beat Tottenham on Thursday night", + "authors": [ + "Getty Images" + ], + "position": 170 + }, + { + "versions": [ + { + "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=320", + "query_width": "max-width:1000", + "size": { + "width": 320, + "height": 219 + }, + "type": "image/jpeg" + }, + { + "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=640", + "query_width": "max-width:1000", + "size": { + "width": 640, + "height": 438 + }, + "type": "image/jpeg" + }, + { + "url": "https://static.standard.co.uk/2024/05/02/20/17/ConorGallagher0205A.jpg?quality=75&auto=webp&width=960", + "query_width": "max-width:1000", + "size": { + "width": 960, + "height": 657 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": null, + "caption": "Chelsea fans produced a banner backing Conor Gallagher", + "authors": [ + "REUTERS" + ], + "position": 238 + } + ], + "publishing_date": "2024-05-02 20:53:56+00:00", + "title": "Chelsea send clear message of intent on proud day at Cobham", + "topics": [ + "Tottenham", + "Mauricio Pochettino" + ] } } diff --git a/tests/resources/parser/test_data/uk/Express.json b/tests/resources/parser/test_data/uk/Express.json index fcce74e4..4821f734 100644 --- a/tests/resources/parser/test_data/uk/Express.json +++ b/tests/resources/parser/test_data/uk/Express.json @@ -219,7 +219,7 @@ "description": "Prince Harry and Meghan Markle at the ESPY awards", "caption": "A Spotify chief claimed Prince Harry and Meghan Markle were 'f****** grifters'", "authors": [ - "( Getty)" + "Getty" ], "position": 302 }, @@ -338,7 +338,7 @@ "description": "Prince Harry and Meghan Markle at the 2024 ESPY Awards", "caption": "Prince Harry and Meghan Markle being called 'grifters' is a 'terrible label to have', an expert says", "authors": [ - "( Getty)" + "Getty" ], "position": 362 }, @@ -457,7 +457,7 @@ "description": "doria ragland", "caption": "Meghan and Harry reportedly only trust Doria Ragland to look after their kids", "authors": [ - "( Getty)" + "Getty" ], "position": 394 }, @@ -576,7 +576,7 @@ "description": "meghan markle", "caption": "Meghan Markle reportedly hissed at a staff member while on a royal tour", "authors": [ - "( Getty)" + "Getty" ], "position": 424 }, @@ -695,7 +695,7 @@ "description": "princess kate", "caption": "A poll shows Princess Kate is more popular than Meghan Markle", "authors": [ - "( Getty)" + "Getty" ], "position": 458 }, @@ -814,7 +814,7 @@ "description": "meghan markle", "caption": "Meghan Markle had her sights set on UK fame, sources claim", "authors": [ - "( Getty)" + "Getty" ], "position": 491 }, @@ -933,7 +933,7 @@ "description": "meghan markle", "caption": "Meghan Markle has been criticised over comments about Britain", "authors": [ - "( Getty)" + "Getty" ], "position": 523 }, @@ -1052,7 +1052,7 @@ "description": "prince harry", "caption": "Prince Harry picked up an ESPY award", "authors": [ - "( Getty)" + "Getty" ], "position": 551 }, @@ -1171,7 +1171,7 @@ "description": "Prince Harry", "caption": "Prince Harry reportedly had a heart-breaking response to eviction from Frogmore", "authors": [ - "( Getty)" + "Getty" ], "position": 580 }, @@ -1290,7 +1290,7 @@ "description": "tyler perry", "caption": "Tyler Perry is lined up for an award", "authors": [ - "( Getty)" + "Getty" ], "position": 614 } diff --git a/tests/resources/parser/test_data/uk/Metro.json b/tests/resources/parser/test_data/uk/Metro.json index ffcfd4b8..d9d4ceca 100644 --- a/tests/resources/parser/test_data/uk/Metro.json +++ b/tests/resources/parser/test_data/uk/Metro.json @@ -1,4 +1,150 @@ { + "V1_1": { + "authors": [ + "Noora Mykkanen" + ], + "body": { + "summary": [ + "Sweden and Finland have told millions of citizens how to be prepared in the case of a war and crisis." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "The Nordic neighbours have published updated guidance today detailing what to do in the case of a conflict.", + "It comes just hours after US allowed Ukraine to use its long-range weapons to strike inside Russia.", + "The move was criticised by Russian politicians and Donald Trump Jr who wrote on X: ‘Military Industrial Complex seems to want to make sure they get World War 3 going.’", + "US analysts have said Russia appears to be preparing for a large-scale conflict with NATO – although no one can say for sure how likely an all-out World War III is.", + "Sweden’s Civil Contingencies Agency will mail an updated version of the ‘In case of crisis or war’ brochure to five million households in the country from today.", + "It details how to be prepared across different areas of life, including shelter, home preparedness, psychological defence, digital security, terror attacks, disease outbreaks and extreme weather across 32 pages – double the size of the previous pamphlet six years ago.", + "The Swedish government has released the new guidance after ‘the state of the world has worsened drastically in recent years’ – referring to the Russian invasion of Ukraine.", + "Sweden also joined NATO in March which means a shift in the perceived threat landscape after becoming a member of the military alliance despised by Russia.", + "In Finland, the government also issued fresh advice online today called ‘Preparing for incidents and crises.’", + "Finland, which shares a 833-mile border with Russia, joined NATO in April last year.", + "Its advice, only published online, details how a war or a crisis could disrupt everyday life and what to do about it.", + "The Swedish brochure says ‘If Sweden is attacked, we will never surrender. Any suggestion to the contrary is false.’" + ] + }, + { + "headline": [ + "What is in the war pamphlet?" + ], + "paragraphs": [ + "Surviving a conflict or crisis might be nothing new to doomsday preppers, but majority of modern city dwellers relying largely on digital services might not have thought about things like having a stock of cash if banking is down or storing drinking water.", + "Sweden’s brochure includes exactly that – details on how to store emergency drinking water during a shortage, heating if the electricity is cut during the winter and building up an emergency food supply.", + "It tells people to have enough cash for at least one week in different denominations. The Finnish guidance advises citizens to have cash for everyday supplies for a ‘few days.’", + "To get through a crisis situation, the Finnish online brochure suggests playing games, reading books or doing crafts to kill time.", + "It instructs people how to keep warm at home in the country where winter temperatures remain on average below 0C and can erach below -30C in northern Finland.", + "The brochure says: ‘In cold temperatures of around 20 degrees Celsius in winter, the indoor temperature of the dwelling will drop below 10 degrees Celsius from just over one day to four days depending on the building.’", + "It also explains about civilian shelters which are dotted across both Sweden and Finland.", + "Metro visited one of Finland’s many bomb shelters in March, including a huge shelter with room for 6,000 people in Helsinki boasting a sport courts, children’s play park and a food court.", + "Daniel Backström, a volunteer lead with the Finnish Civil Defence, told Metro previously: ‘We have never forgotten these things, due to our history – we have always found preparation to be very important.’", + "Despite being neighbours and sharing hundreds of years of history, Finland and Sweden have had very different experiences with Russia and have their own geopolitical issues – although both are located around the Baltic Sea.", + "While neither were ever part of the Soviet Union, tiny Finland successfully fought USSR’s enormous military power during various wars between 1939 and 1945.", + "Sweden was officially neutral during World War II and it avoided having any direct fighting on its territory.", + "Although Sweden was officially non-aligned during the war, the country made concessions to Nazi Germany, including allowing German soldiers to transit through on their way to the Finnish-Russian border from occupied Norway.", + "Finland was allied with the Nazis and Germany launched its operations agains the USSR from north Finland and Lapland – a dark time in Finland’s history.", + "Because of this recent experience of war only a couple of generations ago, Finland has always maintained a relatively high level of preparedness, including armed forces based on mandatory conscription for men.", + "In the early 2010s, Sweden swapped a mandatory military service for men for a professional model more akin to the UK system.", + "But just seven years later, it made a U-turn and brought back military draft, but this time for both men and women.", + "Norway and Denmark have recently also published new war pamphlets." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://metro.co.uk/wp-content/uploads/2024/11/SEI_230033353-f7f0.jpg?quality=90&strip=all&w=646", + "query_width": null, + "size": { + "width": 646, + "height": 431 + }, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "Sweden's Minister for Civil Defence Carl-Oskar Bohlin presents Sweden's war pamphlet.", + "caption": "Sweden’s Minister for Civil Defence Carl-Oskar Bohlin revealed the new war survival brochure in October", + "authors": [ + "Claudio Bresciani/AP" + ], + "position": 738 + }, + { + "versions": [ + { + "url": "https://metro.co.uk/wp-content/uploads/2024/11/SEI_230063122-e635.jpg?quality=90&strip=all&w=646", + "query_width": null, + "size": { + "width": 646, + "height": 431 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "A box full of non perishable food items.", + "caption": "The Swedish and Finnish guides advise to stock up on non-perishable food in case people can’t leave their homes", + "authors": [ + "Getty Images" + ], + "position": 752 + }, + { + "versions": [ + { + "url": "https://metro.co.uk/wp-content/uploads/2024/11/SEI_230063713-0be6.jpg?quality=90&strip=all&w=646", + "query_width": null, + "size": { + "width": 646, + "height": 919 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Sweden's updated war pamphlet.", + "caption": "The English version of Sweden’s new war pamphlet", + "authors": [ + "MSB" + ], + "position": 853 + }, + { + "versions": [ + { + "url": "https://metro.co.uk/wp-content/uploads/2024/11/SEI_230063710-26ec.jpg?quality=90&strip=all&w=556", + "query_width": null, + "size": { + "width": 556, + "height": 795 + }, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "Sweden's updated war survival pamphlet in case of crisis or war in English.", + "caption": "The updated brochure include practical advise in the face of a war or crisis affecting Sweden", + "authors": [ + "MSB" + ], + "position": 867 + } + ], + "publishing_date": "2024-11-18 21:26:36+00:00", + "title": "Sweden tells 5,000,000 households 'how to survive WWIII' in war pamphlet", + "topics": [ + "Finland", + "NATO", + "Russia", + "Russia-Ukraine war", + "Sweden", + "World War 3" + ] + }, "V1": { "authors": [ "Jen Mills" @@ -102,7 +248,7 @@ "description": "The King and Queen arrive in the Norman Porch for the State Opening of Parliament", "caption": "The King and Queen arrive in the Norman Porch for the State Opening of Parliament", "authors": [ - "(Picture: Getty)" + "Getty" ], "position": 475 }, @@ -122,7 +268,7 @@ "description": "Anti-royalists hold placards as Britain's King Charles and Queen Camilla travel by carriage", "caption": "Anti-royalists hold placards as Britain’s King Charles and Queen Camilla travel by carriage", "authors": [ - "(Picture: Reuters)" + "Reuters" ], "position": 487 }, @@ -142,7 +288,7 @@ "description": "Black Rod Sarah Clarke walks through the Royal Gallery", "caption": "Black Rod Sarah Clarke walks through the Royal Gallery", "authors": [ - "(Picture: PA)" + "PA" ], "position": 499 }, @@ -162,7 +308,7 @@ "description": "The Imperial State Crown is carried through the Norman Porch", "caption": "The Imperial State Crown is carried through the Norman Porch", "authors": [ - "(Picture: Getty)" + "Getty" ], "position": 511 }, @@ -182,7 +328,7 @@ "description": "Members of the House of Lords and guests take their seats in the Lords Chamber", "caption": "Members of the House of Lords and guests take their seats in the Lords Chamber", "authors": [ - "(Picture: PA)" + "PA" ], "position": 523 }, @@ -202,7 +348,7 @@ "description": "Crowds wait near Buckingham Palace to view the procession", "caption": "Crowds wait near Buckingham Palace to view the procession", "authors": [ - "(Picture: PA)" + "PA" ], "position": 535 }, @@ -222,7 +368,7 @@ "description": "Guards arriving at the Palace of Westminste", "caption": "Guards arriving at the Palace of Westminster", "authors": [ - "(Picture: PA)" + "PA" ], "position": 547 }, @@ -242,7 +388,7 @@ "description": "House of Commons of Speaker Sir Lindsay Hoyle being prepared for the State Opening", "caption": "House of Commons of Speaker Sir Lindsay Hoyle being prepared for the State Opening", "authors": [ - "(Picture: PA)" + "PA" ], "position": 559 }, @@ -262,7 +408,7 @@ "description": "Monarchists demonstrate outside the Houses of Parliament", "caption": "Monarchists demonstrate outside the Houses of Parliament", "authors": [ - "(Picture: AP)" + "AP" ], "position": 571 }, @@ -282,7 +428,7 @@ "description": "Anti-monarchy Not My King protesters were also demonstrating outside the Houses of Parliament", "caption": "Anti-monarchy Not My King protesters were also demonstrating outside the Houses of Parliament", "authors": [ - "(Picture: AP)" + "AP" ], "position": 583 }, @@ -302,7 +448,7 @@ "description": "The King's Bodyguard, the Yeomen of the Guard, carry out the ceremonial search of the Palace of Westminster", "caption": "The King’s Bodyguard, the Yeomen of the Guard, carry out the ceremonial search of the Palace of Westminster", "authors": [ - "(Picture: PA)" + "PA" ], "position": 595 }, @@ -322,7 +468,7 @@ "description": "King Charles III and Queen Camilla travelling in the Diamond Jubilee State Coach", "caption": "King Charles III and Queen Camilla travelling in the Diamond Jubilee State Coach", "authors": [ - "(Picture: PA)" + "PA" ], "position": 607 }, @@ -342,7 +488,7 @@ "description": "Members of the Life Guards, a unit of the Household Cavalry, line the stairs of the Norman Porch", "caption": "Members of the Life Guards, a unit of the Household Cavalry, line the stairs of the Norman Porch", "authors": [ - "(Picture: Reuters)" + "Reuters" ], "position": 619 } diff --git a/tests/resources/parser/test_data/uk/Metro_2024_11_29.html.gz b/tests/resources/parser/test_data/uk/Metro_2024_11_29.html.gz new file mode 100644 index 00000000..c359c4d3 Binary files /dev/null and b/tests/resources/parser/test_data/uk/Metro_2024_11_29.html.gz differ diff --git a/tests/resources/parser/test_data/uk/TheGuardian.json b/tests/resources/parser/test_data/uk/TheGuardian.json index dd84d40f..56351cfe 100644 --- a/tests/resources/parser/test_data/uk/TheGuardian.json +++ b/tests/resources/parser/test_data/uk/TheGuardian.json @@ -102,7 +102,7 @@ "description": "The gutted remains of the two buildings, which had about 140 apartments", "caption": "The gutted remains of the two buildings, which had about 140 apartments.", "authors": [ - "Photograph: Eva Manez/Reuters" + "Eva Manez/Reuters" ], "position": 508 }, diff --git a/tests/resources/parser/test_data/uk/TheIndependent.json b/tests/resources/parser/test_data/uk/TheIndependent.json index 0e5374aa..d8b3e8d0 100644 --- a/tests/resources/parser/test_data/uk/TheIndependent.json +++ b/tests/resources/parser/test_data/uk/TheIndependent.json @@ -63,7 +63,7 @@ "description": null, "caption": null, "authors": [ - "(The Independent)" + "The Independent" ], "position": 751 } diff --git a/tests/resources/parser/test_data/uk/TheMirror.json b/tests/resources/parser/test_data/uk/TheMirror.json index 13565fe1..82603dd2 100644 --- a/tests/resources/parser/test_data/uk/TheMirror.json +++ b/tests/resources/parser/test_data/uk/TheMirror.json @@ -60,7 +60,7 @@ "description": "Young man in apron watering houseplants", "caption": "Here are some of the best houseplants to eliminate odours in your home (stock image)", "authors": [ - "( Getty Images/Cultura RF)" + "Getty Images/Cultura RF" ], "position": 459 }, @@ -98,7 +98,7 @@ "description": "english ivy", "caption": "English Ivy is easy to grow", "authors": [ - "( Getty Images/iStockphoto)" + "Getty Images/iStockphoto" ], "position": 540 }, @@ -136,7 +136,7 @@ "description": "Pilea cadierei", "caption": "The stunning silvery leaves of the aluminum plant are a great addition to any kitchen", "authors": [ - "( Getty Images/iStockphoto)" + "Getty Images/iStockphoto" ], "position": 557 }, @@ -174,7 +174,7 @@ "description": "Aloe Vera and other house plants", "caption": "Aloe Vera is a natural remedy for burns as well as an air-purifying plant", "authors": [ - "( Getty Images/iStockphoto)" + "Getty Images/iStockphoto" ], "position": 573 }, @@ -212,7 +212,7 @@ "description": "fresh green leaves of Aspidistra elatior Variegata plant In the garden", "caption": "The Cast Iron plant makes a statement and brings a sense of peace to your home", "authors": [ - "( Getty Images)" + "Getty Images" ], "position": 589 } @@ -579,7 +579,7 @@ "description": null, "caption": "Anti-racism activists in Plymouth tonight", "authors": [ - "(Anadolu via Getty Images)" + "Anadolu via Getty Images" ], "position": 653 }, @@ -626,7 +626,7 @@ "description": null, "caption": "Clashes between anti-migrant activists and counter-protesters in Guildhall Square, Plymouth", "authors": [ - "(Anadolu via Getty Images)" + "Anadolu via Getty Images" ], "position": 706 }, @@ -643,7 +643,7 @@ "description": null, "caption": "Southport locals mourn the victims at a pink-themed vigil", "authors": [ - "(Getty Images)" + "Getty Images" ], "position": 730 }, @@ -660,7 +660,7 @@ "description": null, "caption": "A crowd gathers outside McDonald's in Bordesley Green near Heartlands Hospital", "authors": [ - "(Nick Wilkinson/Birmingham Live)" + "Nick Wilkinson/Birmingham Live" ], "position": 758 }, @@ -692,7 +692,7 @@ "description": null, "caption": "Andy Burnham, who is Mayor of Greater Manchester, has shared his thoughts", "authors": [ - "(PA)" + "PA" ], "position": 829 }, @@ -709,7 +709,7 @@ "description": null, "caption": "Riot police clash with anti-migration protesters outside of the Holiday Inn Express", "authors": [ - "(Getty Images)" + "Getty Images" ], "position": 870 }, @@ -726,7 +726,7 @@ "description": null, "caption": "Doors have been put in and arrests made following the violent disorder in Sunderland", "authors": [ - "(Northumbria Police / SWNS)" + "Northumbria Police / SWNS" ], "position": 919 }, diff --git a/tests/resources/parser/test_data/uk/TheSun.json b/tests/resources/parser/test_data/uk/TheSun.json index 9b0c6de2..7c2646f1 100644 --- a/tests/resources/parser/test_data/uk/TheSun.json +++ b/tests/resources/parser/test_data/uk/TheSun.json @@ -284,7 +284,7 @@ "description": "Rebecca Cooke supporting Phil Foden at the Qatar World Cup", "caption": "Rebecca Cooke supporting Phil Foden at the Qatar World Cup", "authors": [ - "Credit: PA" + "PA" ], "position": 314 } diff --git a/tests/resources/parser/test_data/uk/TheTelegraph.json b/tests/resources/parser/test_data/uk/TheTelegraph.json index ad122f44..ea5d42d6 100644 --- a/tests/resources/parser/test_data/uk/TheTelegraph.json +++ b/tests/resources/parser/test_data/uk/TheTelegraph.json @@ -433,7 +433,7 @@ "description": "The Minky winged 12m heated clothes airer, tried and tested at home", "caption": "Credit: Minky", "authors": [ - "Credit: Minky" + "Minky" ], "position": 1335 } diff --git a/tests/resources/parser/test_data/uk/iNews.json b/tests/resources/parser/test_data/uk/iNews.json index fb2a4ec1..f7950b8e 100644 --- a/tests/resources/parser/test_data/uk/iNews.json +++ b/tests/resources/parser/test_data/uk/iNews.json @@ -58,7 +58,7 @@ "description": null, "caption": "All six British players won their matches on Tuesday at the US Open", "authors": [ - "Photos: Getty/AP" + "Getty/AP" ], "position": 451 }, diff --git a/tests/resources/parser/test_data/uk/meta.info b/tests/resources/parser/test_data/uk/meta.info index 7ae8e91c..01402455 100644 --- a/tests/resources/parser/test_data/uk/meta.info +++ b/tests/resources/parser/test_data/uk/meta.info @@ -31,6 +31,10 @@ "url": "https://metro.co.uk/2024/07/17/king-charles-arrives-parliament-first-kings-speech-new-labour-government-21244172/?ico=mosaic_politics", "crawl_date": "2024-07-17 20:00:15.017735" }, + "Metro_2024_11_29.html.gz": { + "url": "https://metro.co.uk/2024/11/18/sweden-tells-5-000-000-households-how-survive-wwiii-new-war-pamphlet-22018356/", + "crawl_date": "2024-11-29 22:59:41.366944" + }, "TheGuardian_2024_02_24.html.gz": { "url": "https://www.theguardian.com/world/2024/feb/24/death-toll-in-valencia-fire-rises-to-10-as-remains-of-last-missing-person-found", "crawl_date": "2024-02-24 12:51:15.854319" diff --git a/tests/resources/parser/test_data/us/FreeBeacon.json b/tests/resources/parser/test_data/us/FreeBeacon.json index 65bb7f39..f551847e 100644 --- a/tests/resources/parser/test_data/us/FreeBeacon.json +++ b/tests/resources/parser/test_data/us/FreeBeacon.json @@ -58,11 +58,7 @@ "is_cover": true, "description": null, "caption": "Democratic megadonor George Soros, Sen. Jon Tester (D., Mont.), and Democratic donor Alexander Soros", - "authors": [ - "D.", - "Mont.", - "Democratic donor Alexander Soros" - ], + "authors": [], "position": 339 } ], diff --git a/tests/resources/parser/test_data/us/LATimes.json b/tests/resources/parser/test_data/us/LATimes.json index d51aef12..2cf718ee 100644 --- a/tests/resources/parser/test_data/us/LATimes.json +++ b/tests/resources/parser/test_data/us/LATimes.json @@ -215,7 +215,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 520 }, @@ -317,7 +317,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 630 }, @@ -621,7 +621,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 692 }, @@ -824,7 +824,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 732 }, @@ -926,7 +926,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 763 }, @@ -1028,7 +1028,7 @@ "caption": null, "authors": [ "Associated Press", - "Tim Hubbard / Los Angeles Times" + "photo illustration by Tim Hubbard / Los Angeles Times" ], "position": 798 } diff --git a/tests/resources/parser/test_data/us/Reuters.json b/tests/resources/parser/test_data/us/Reuters.json index 5bf58266..8642a88e 100644 --- a/tests/resources/parser/test_data/us/Reuters.json +++ b/tests/resources/parser/test_data/us/Reuters.json @@ -1,36 +1,4 @@ { - "V1": { - "authors": [ - "Gopal Sharma" - ], - "body": { - "summary": [ - "KATHMANDU, April 25 (Reuters) - Nepal's civil aviation authority disputed on Tuesday whether a flydubai plane had been hit by a bird strike in Nepali airspace, calling the United Arab Emirates carrier's account of the incident \"misleading\"." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "The airline had said a flight carrying 167 passengers from the Nepali capital Kathmandu to Dubai experienced a bird strike during take-off late on Monday.", - "The plane continued on its journey after determining that the engine was within normal operation parameters, a spokesperson for flydubai said, and the aircraft landed normally in Dubai just after midnight local time.", - "But the Civil Aviation Authority of Nepal (CAAN) said on Twitter on Tuesday that the airline's country manager and airport manager had been barred from entering Kathmandu airport for spreading \"misleading\" news about a bird strike.", - "Flydubai said it would respond shortly to a request for comment on the tweet. The UAE's General Civil Aviation Authority did not immediately respond to a request for comment.", - "\"How did the company say it was a case of bird strike. The pilot has not reported that and there is no evidence of it so far. There is no proof or basis for this,\" Jagannath Niroula, a CAAN spokesperson, said.", - "Niroula said that one of the plane's engines had caught fire shortly after take-off from Kathmandu, and the CAAN had set up a technical committee to investigate.", - "Mountainous Nepal has a history of deadly air crashes and suffered its worst plane crash in 30 years in January this year, killing all 72 people aboard an ATR 72 aircraft operated by Yeti Airlines." - ] - } - ] - }, - "publishing_date": "2023-04-25 12:26:15+00:00", - "title": "Nepal says 'no proof' flydubai plane suffered bird strike", - "topics": [ - "Aerospace & Defense", - "Business", - "Asia Pacific", - "World" - ] - }, "V1_1": { "authors": [ "Maya Gebeily", @@ -100,5 +68,37 @@ "Aerospace & Defense", "Europe" ] + }, + "V1": { + "authors": [ + "Gopal Sharma" + ], + "body": { + "summary": [ + "KATHMANDU, April 25 (Reuters) - Nepal's civil aviation authority disputed on Tuesday whether a flydubai plane had been hit by a bird strike in Nepali airspace, calling the United Arab Emirates carrier's account of the incident \"misleading\"." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "The airline had said a flight carrying 167 passengers from the Nepali capital Kathmandu to Dubai experienced a bird strike during take-off late on Monday.", + "The plane continued on its journey after determining that the engine was within normal operation parameters, a spokesperson for flydubai said, and the aircraft landed normally in Dubai just after midnight local time.", + "But the Civil Aviation Authority of Nepal (CAAN) said on Twitter on Tuesday that the airline's country manager and airport manager had been barred from entering Kathmandu airport for spreading \"misleading\" news about a bird strike.", + "Flydubai said it would respond shortly to a request for comment on the tweet. The UAE's General Civil Aviation Authority did not immediately respond to a request for comment.", + "\"How did the company say it was a case of bird strike. The pilot has not reported that and there is no evidence of it so far. There is no proof or basis for this,\" Jagannath Niroula, a CAAN spokesperson, said.", + "Niroula said that one of the plane's engines had caught fire shortly after take-off from Kathmandu, and the CAAN had set up a technical committee to investigate.", + "Mountainous Nepal has a history of deadly air crashes and suffered its worst plane crash in 30 years in January this year, killing all 72 people aboard an ATR 72 aircraft operated by Yeti Airlines." + ] + } + ] + }, + "publishing_date": "2023-04-25 12:26:15+00:00", + "title": "Nepal says 'no proof' flydubai plane suffered bird strike", + "topics": [ + "Aerospace & Defense", + "Business", + "Asia Pacific", + "World" + ] } } diff --git a/tests/resources/parser/test_data/us/TechCrunch.json b/tests/resources/parser/test_data/us/TechCrunch.json index b7e23ea9..a618cc8c 100644 --- a/tests/resources/parser/test_data/us/TechCrunch.json +++ b/tests/resources/parser/test_data/us/TechCrunch.json @@ -1,78 +1,4 @@ { - "V1": { - "authors": [ - "Kyle Wiggers" - ], - "body": { - "summary": [ - "What’s the next big thing in enterprise automation? If you ask the tech giants, it’s agents — driven by generative AI." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "There’s no universally accepted definition of agent, but these days the term is used to describe generative AI-powered tools that can perform complex tasks through human-like interactions across software and web platforms.", - "For example, an agent could create an itinerary by filling in a customer’s info on airlines’ and hotel chains’ websites. Or an agent could order the least expensive ride-hailing service to a location by automatically comparing prices across apps.", - "Vendors sense opportunity. ChatGPT maker OpenAI is reportedly deep into developing AI agent systems. And Google demoed a slew of agent-like products at its annual Cloud Next conference in early April.", - "“Companies should start preparing for wide-scale adoption of autonomous agents today,” analysts at Boston Consulting Group wrote recently in a report — citing experts who estimate that autonomous agents will go mainstream in three to five years." - ] - }, - { - "headline": [ - "Old-school automation" - ], - "paragraphs": [ - "So where does that leave RPA?", - "Robotic process automation (RPA) came into vogue over a decade ago as enterprises turned to the tech to bolster their digital transformation efforts while reducing costs. Like an agent, RPA drives workflow automation. But it’s a much more rigid form, based on “if-then” preset rules for processes that can be broken down into strictly defined, discretized steps.", - "“RPA can mimic human actions, such as clicking, typing or copying and pasting, to perform tasks faster and more accurately than humans,” Saikat Ray, VP analyst at Gartner, explained to TechCrunch in an interview. “However, RPA bots have limitations when it comes to handling complex, creative or dynamic tasks that require natural language processing or reasoning skills.”", - "This rigidity makes RPA expensive to build — and considerably limits its applicability.", - "A 2022 survey from Robocorp, an RPA vendor, finds that of the organizations that say they’ve adopted RPA, 69% experience broken automation workflows at least once a week — many of which take hours to fix. Entire businesses have been made out of helping enterprises manage their RPA installations and prevent them from breaking.", - "RPA vendors aren’t naive. They’re well aware of the challenges — and believe that generative AI could solve many of them without hastening their platforms’ demise. In RPA vendors’ minds, RPA and generative AI-powered agents can peacefully co-exist — and perhaps one day even grow to complement each other." - ] - }, - { - "headline": [ - "Generative AI automation" - ], - "paragraphs": [ - "UiPath, one of the larger players in the RPA market with an estimated 10,000+ customers, including Uber, Xerox and CrowdStrike, recently announced new generative AI features focused on document and message processing, as well as taking automated actions to deliver what UiPath CEO Bob Enslin calls “one-click digital transformation.”", - "“These features provide customers generative AI models that are trained for their specific tasks,” Enslin told TechCrunch. “Our generative AI powers workloads such as text completion for emails, categorization, image detection, language translation, the ability to filter out personally identifiable information [and] quickly answering any people-topic-related questions based off of knowledge from internal data.”", - "One of UiPath’s more recent explorations in the generative AI domain is Clipboard AI, which combines UiPath’s platform with third-party models from OpenAI, Google and others to — as Enslin puts it — “bring the power of automation to anyone that has to copy/paste.” Clipboard AI lets users highlight data from a form, and — leveraging generative AI to figure out the right places for the copied data to go — point it to another form, app, spreadsheet or database.", - "“UiPath sees the need to bring action and AI together; this is where value is created,” Enslin said. “We believe the best performance will come from those that combine generative AI and human judgment — what we call human-in-the-loop — across end-to-end processes.”", - "Automation Anywhere, UiPath’s main rival, is also attempting to fold generative AI into its RPA technologies.", - "Last year, Automation Anywhere launched generative AI-powered tools to create workflows from natural language, summarize content, extract data from documents and — perhaps most significantly — adapt to changes in apps that would normally cause an RPA automation to fail.", - "“[Our generative AI models are] developed on top of [open] large language models and trained with anonymized metadata from more than 150 million automation processes across thousands of enterprise applications,” Peter White, SVP of enterprise AI and automation at Automation Anywhere, told TechCrunch. “We continue to build custom machine learning models for specific tasks within our platform and are also now building customized models on top of foundational generative AI models using our automation datasets.”" - ] - }, - { - "headline": [ - "Next-gen RPA" - ], - "paragraphs": [ - "Ray notes it’s important to be cognizant of generative AI’s limitations — namely biases and hallucinations — as it powers a growing number of RPA capabilities. But, risks aside, he believes generative AI stands to add value to RPA by transforming the way these platforms work and “creating new possibilities for automation.”", - "“Generative AI is a powerful technology that can enhance the capabilities of RPA platforms enabling them to understand and generate natural language, automate content creation, improve decision-making and even generate code,” Ray said. “By integrating generative AI models, RPA platforms can offer more value to their customers, increase their productivity and efficiency and expand their use cases and applications.”", - "Craig Le Clair, principal analyst at Forrester, sees RPA platforms as being ripe for expansion to support autonomous agents and generative AI as their use cases grow. In fact, he anticipates RPA platforms morphing into all-around toolsets for automation — toolsets that help deploy RPA in addition to related generative AI technologies.", - "“RPA platforms have the architecture to manage thousands of task automations and this bodes well for central management of AI agents,” he said. “Thousands of companies are well established with RPA platforms and will be open to using them for generative AI-infused agents. RPA has grown in part thanks to its ability to integrate easily with existing work patterns, through UI integration, and this will remain valuable for more intelligent agents going forward.”", - "UiPath is already beginning to take steps in this direction with a new capability, Context Grounding, that entered preview earlier in the month. As Enslin explained it to me, Context Grounding is designed to improve the accuracy of generative AI models — both first- and third-party — by converting business data those models might draw on into an “optimized” format that’s easier to index and search.", - "“Context Grounding extracts information from company-specific datasets, like a knowledge base or internal policies and procedures, to create more accurate and insightful responses,” Enslin said.", - "If there’s anything holding RPA vendors back, it’s the ever-present temptation to lock customers in, Le Clair said. He stressed the need for platforms to “remain agnostic” and offer tools that can be configured to work with a range of current — and future — enterprise systems and workflows.", - "To that, Enslin pledged that UiPath will remain “open, flexible and responsible.”", - "“The future of AI will require a combination of specialized AI with generative AI,” he continued. “We want customers to be able to confidently use all kinds of AI.”", - "White didn’t commit to neutrality exactly. But he emphasized that Automation Anywhere’s roadmap is being heavily shaped by customer feedback.", - "“What we hear from every customer, across every industry, is that their ability to incorporate automation in many more use cases has increased exponentially with generative AI,” he said. “With generative AI infused into intelligent automation technologies like RPA, we see the potential for organizations to reduce operating costs and increase productivity. Companies who fail to adopt these technologies will struggle to compete against others who embrace generative AI and automation.”" - ] - } - ] - }, - "publishing_date": "2024-04-28 13:30:00+00:00", - "title": "How RPA vendors aim to remain relevant in a world of AI agents", - "topics": [ - "AI", - "Generative AI", - "robotic process automation", - "RPA" - ] - }, "V1_1": { "authors": [ "Paul Sawers" @@ -148,7 +74,7 @@ ], "is_cover": true, "description": "Strava dark mode and AI summaries", - "caption": "Image Credits: Strava", + "caption": null, "authors": [ "Strava" ], @@ -168,7 +94,7 @@ ], "is_cover": false, "description": "Strava: Leaderboard integrity powered by AI", - "caption": "Strava: Leaderboard integrity powered by AI Image Credits: Strava", + "caption": "Strava: Leaderboard integrity powered by AI", "authors": [ "Strava" ], @@ -188,7 +114,7 @@ ], "is_cover": false, "description": "Strava's \"athlete intelligence\"", - "caption": "Strava’s “athlete intelligence.” Image Credits: Strava", + "caption": "Strava’s “athlete intelligence.”", "authors": [ "Strava" ], @@ -208,7 +134,7 @@ ], "is_cover": false, "description": "Strava's new dark mode", - "caption": "Strava’s new dark mode. Image Credits: Strava", + "caption": "Strava’s new dark mode.", "authors": [ "Strava" ], @@ -264,7 +190,7 @@ ], "is_cover": false, "description": "Strava family plan", - "caption": "Strava family plan. Image Credits: Strava", + "caption": "Strava family plan.", "authors": [ "Strava" ], @@ -278,5 +204,79 @@ "leaderboards", "Strava" ] + }, + "V1": { + "authors": [ + "Kyle Wiggers" + ], + "body": { + "summary": [ + "What’s the next big thing in enterprise automation? If you ask the tech giants, it’s agents — driven by generative AI." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "There’s no universally accepted definition of agent, but these days the term is used to describe generative AI-powered tools that can perform complex tasks through human-like interactions across software and web platforms.", + "For example, an agent could create an itinerary by filling in a customer’s info on airlines’ and hotel chains’ websites. Or an agent could order the least expensive ride-hailing service to a location by automatically comparing prices across apps.", + "Vendors sense opportunity. ChatGPT maker OpenAI is reportedly deep into developing AI agent systems. And Google demoed a slew of agent-like products at its annual Cloud Next conference in early April.", + "“Companies should start preparing for wide-scale adoption of autonomous agents today,” analysts at Boston Consulting Group wrote recently in a report — citing experts who estimate that autonomous agents will go mainstream in three to five years." + ] + }, + { + "headline": [ + "Old-school automation" + ], + "paragraphs": [ + "So where does that leave RPA?", + "Robotic process automation (RPA) came into vogue over a decade ago as enterprises turned to the tech to bolster their digital transformation efforts while reducing costs. Like an agent, RPA drives workflow automation. But it’s a much more rigid form, based on “if-then” preset rules for processes that can be broken down into strictly defined, discretized steps.", + "“RPA can mimic human actions, such as clicking, typing or copying and pasting, to perform tasks faster and more accurately than humans,” Saikat Ray, VP analyst at Gartner, explained to TechCrunch in an interview. “However, RPA bots have limitations when it comes to handling complex, creative or dynamic tasks that require natural language processing or reasoning skills.”", + "This rigidity makes RPA expensive to build — and considerably limits its applicability.", + "A 2022 survey from Robocorp, an RPA vendor, finds that of the organizations that say they’ve adopted RPA, 69% experience broken automation workflows at least once a week — many of which take hours to fix. Entire businesses have been made out of helping enterprises manage their RPA installations and prevent them from breaking.", + "RPA vendors aren’t naive. They’re well aware of the challenges — and believe that generative AI could solve many of them without hastening their platforms’ demise. In RPA vendors’ minds, RPA and generative AI-powered agents can peacefully co-exist — and perhaps one day even grow to complement each other." + ] + }, + { + "headline": [ + "Generative AI automation" + ], + "paragraphs": [ + "UiPath, one of the larger players in the RPA market with an estimated 10,000+ customers, including Uber, Xerox and CrowdStrike, recently announced new generative AI features focused on document and message processing, as well as taking automated actions to deliver what UiPath CEO Bob Enslin calls “one-click digital transformation.”", + "“These features provide customers generative AI models that are trained for their specific tasks,” Enslin told TechCrunch. “Our generative AI powers workloads such as text completion for emails, categorization, image detection, language translation, the ability to filter out personally identifiable information [and] quickly answering any people-topic-related questions based off of knowledge from internal data.”", + "One of UiPath’s more recent explorations in the generative AI domain is Clipboard AI, which combines UiPath’s platform with third-party models from OpenAI, Google and others to — as Enslin puts it — “bring the power of automation to anyone that has to copy/paste.” Clipboard AI lets users highlight data from a form, and — leveraging generative AI to figure out the right places for the copied data to go — point it to another form, app, spreadsheet or database.", + "“UiPath sees the need to bring action and AI together; this is where value is created,” Enslin said. “We believe the best performance will come from those that combine generative AI and human judgment — what we call human-in-the-loop — across end-to-end processes.”", + "Automation Anywhere, UiPath’s main rival, is also attempting to fold generative AI into its RPA technologies.", + "Last year, Automation Anywhere launched generative AI-powered tools to create workflows from natural language, summarize content, extract data from documents and — perhaps most significantly — adapt to changes in apps that would normally cause an RPA automation to fail.", + "“[Our generative AI models are] developed on top of [open] large language models and trained with anonymized metadata from more than 150 million automation processes across thousands of enterprise applications,” Peter White, SVP of enterprise AI and automation at Automation Anywhere, told TechCrunch. “We continue to build custom machine learning models for specific tasks within our platform and are also now building customized models on top of foundational generative AI models using our automation datasets.”" + ] + }, + { + "headline": [ + "Next-gen RPA" + ], + "paragraphs": [ + "Ray notes it’s important to be cognizant of generative AI’s limitations — namely biases and hallucinations — as it powers a growing number of RPA capabilities. But, risks aside, he believes generative AI stands to add value to RPA by transforming the way these platforms work and “creating new possibilities for automation.”", + "“Generative AI is a powerful technology that can enhance the capabilities of RPA platforms enabling them to understand and generate natural language, automate content creation, improve decision-making and even generate code,” Ray said. “By integrating generative AI models, RPA platforms can offer more value to their customers, increase their productivity and efficiency and expand their use cases and applications.”", + "Craig Le Clair, principal analyst at Forrester, sees RPA platforms as being ripe for expansion to support autonomous agents and generative AI as their use cases grow. In fact, he anticipates RPA platforms morphing into all-around toolsets for automation — toolsets that help deploy RPA in addition to related generative AI technologies.", + "“RPA platforms have the architecture to manage thousands of task automations and this bodes well for central management of AI agents,” he said. “Thousands of companies are well established with RPA platforms and will be open to using them for generative AI-infused agents. RPA has grown in part thanks to its ability to integrate easily with existing work patterns, through UI integration, and this will remain valuable for more intelligent agents going forward.”", + "UiPath is already beginning to take steps in this direction with a new capability, Context Grounding, that entered preview earlier in the month. As Enslin explained it to me, Context Grounding is designed to improve the accuracy of generative AI models — both first- and third-party — by converting business data those models might draw on into an “optimized” format that’s easier to index and search.", + "“Context Grounding extracts information from company-specific datasets, like a knowledge base or internal policies and procedures, to create more accurate and insightful responses,” Enslin said.", + "If there’s anything holding RPA vendors back, it’s the ever-present temptation to lock customers in, Le Clair said. He stressed the need for platforms to “remain agnostic” and offer tools that can be configured to work with a range of current — and future — enterprise systems and workflows.", + "To that, Enslin pledged that UiPath will remain “open, flexible and responsible.”", + "“The future of AI will require a combination of specialized AI with generative AI,” he continued. “We want customers to be able to confidently use all kinds of AI.”", + "White didn’t commit to neutrality exactly. But he emphasized that Automation Anywhere’s roadmap is being heavily shaped by customer feedback.", + "“What we hear from every customer, across every industry, is that their ability to incorporate automation in many more use cases has increased exponentially with generative AI,” he said. “With generative AI infused into intelligent automation technologies like RPA, we see the potential for organizations to reduce operating costs and increase productivity. Companies who fail to adopt these technologies will struggle to compete against others who embrace generative AI and automation.”" + ] + } + ] + }, + "publishing_date": "2024-04-28 13:30:00+00:00", + "title": "How RPA vendors aim to remain relevant in a world of AI agents", + "topics": [ + "AI", + "Generative AI", + "robotic process automation", + "RPA" + ] } } diff --git a/tests/resources/parser/test_data/us/TheIntercept.json b/tests/resources/parser/test_data/us/TheIntercept.json index 34fdee08..83147bc2 100644 --- a/tests/resources/parser/test_data/us/TheIntercept.json +++ b/tests/resources/parser/test_data/us/TheIntercept.json @@ -1,50 +1,4 @@ { - "V1": { - "authors": [ - "Ryan Devereaux" - ], - "body": { - "summary": [ - "The ACLU’s Keegan Medrano, a queer, Native advocate in Helena, said Zephyr’s expulsion was the culmination of months of attacks from Montana’s far right." - ], - "sections": [ - { - "headline": [], - "paragraphs": [ - "The tenor of Montana’s legislative session was evident from the start. In January, less than a week into the biannual, monthslong lawmaking process, Republican state Sen. Keith Regier proposed a study to determine whether the federal government’s system of Native American reservations should be dismantled, suggesting rights to lands given to tribes after generations of dispossession should perhaps cease to exist.", - "Peppered with racist stereotypes, the proposal ultimately crumbled in the face of local and national backlash, but the tone was set.", - "In the months since, the Montana GOP’s willingness to push the envelope against perceived cultural enemies has only intensified, culminating this week in the expulsion of Democratic Rep. Zooey Zephyr, the first transgender lawmaker in the state’s history.", - "As policy director for the American Civil Liberties Union’s Montana office, Keegan Medrano has been in the Capitol in Helena day after day for the past four months, meeting with lawmakers and advocate on bills impacting Native American and LGBTQ+ communities. For Medrano, a queer descendant of the Muscogee Creek nation, the work is both professional and personal.", - "“What we’ve been seeing over this session is that there is such distain, such animus, such disgust with queer people, Indigenous people, people that don’t fit in within their vision of what a Montana is,” Medrano told The Intercept. “They have such anger and disdain and disgust that they can’t control it,” he said. “And they’re now weaponizing the institutions to exclude us and police us.”", - "In a vote that broke along party lines Wednesday, Montana Republicans banned Zephyr from speaking or voting from the floor or the gallery of the Capitol for the remainder of this year’s session, which ends next week.", - "The move against Zephyr followed a pitched battle in recent weeks over a bill that would bar gender-affirming medical care for Montana youth; similar proposals have been introduced and passed by Republican-controlled state legislatures across the country. On April 17, Montana’s Republican Gov. Greg Gianforte indicated he would sign the bill, despite the pleas of his own son.", - "“He talks about compassion toward children, the youth of Montana, while simultaneously taking away health care from the youth in Montana,” Brian Gianforte, a 32-year-old member of Montana’s LGBTQ+ community said of his father’s support for the legislation in an interview with the Montana Free Press.", - "Powered by an influx of ultra-wealthy conservatives and the ever-expanding regional influence of Christian nationalism, Montana’s reputation as a live-and-let-live state has increasingly given way to the hard-right politics of its Republican Freedom Caucus in recent years.", - "Greg Gianforte, the governor presiding over the shift, rose to national prominence in 2017, when he choke-slammed a journalist on the eve of his election to Congress. Drawing on millions of dollars in donations to himself — Gianforte was then the richest man in Congress — the evangelical tech entrepreneur was elected governor in 2020, breaking the hold Democrats had on the office for a decade and a half.", - "The GOP’s grip on the levers of state power further tightened with a series of wins in last year’s midterm elections, giving the party a supermajority heading into this year’s legislative session.", - "Zephyr, a 34-year-old representing the liberal college town of Missoula, found herself in the crosshairs of Montana’s Republican hard-liners after speaking out against the bill to ban medical for transgender youth.", - "“If you vote yes on this bill and yes on these amendments, I hope the next time there’s an invocation, when you bow your heads in prayer, you see the blood on your hands,” Zephyr told her colleagues earlier this month.", - "That night, in a letter and tweet that deliberately misgendered the Democratic lawmaker, all 21 Montana Freedom Caucus members demanded Zephyr’s censure for “using inappropriate and uncalled-for language during a floor debate.”", - "Zephyr’s efforts to speak from the gallery in the state capital were repeatedly rebuffed in the days that followed. On Monday, hundreds of protesters converged on Helena. “Let her speak,” they chanted. Capitol police in riot gear were deployed. Seven people were arrested on trespassing charges, including two of Medrano’s staffers.", - "Among Zephyr’s constituents, a combination of frustration, fear, and outrage had been building from the moment the legislative session began, Medrano said; the protest was a form of release.", - "“I think that all sort of came out,” he said. “After over 80 days of not only the jokes, not only the questions, but also the policy, and then now, where we’re actually targeting, harassing, being retaliatory toward individuals from those communities.”", - "For Medrano, there is a throughline that binds Indigenous rights, trans rights, and reproductive rights: three areas where the Republican Party has directed much of its attention this session.", - "“Every single one of those individuals practices their own sort of body sovereignty and autonomy,” he said. “The Montana Republicans, the Freedom Caucus, they’re all afraid of these people, and so they legislate to extinguish their existence and/or to make their existences not palatable and not a part of what Montana is.”", - "Silenced by her Republican colleagues, Zephyr now sits on a bench outside the Capitol gallery, voting on bills and staying connected with her constituents on her laptop.", - "“It casts a pall over that building,” Medrano said. “There are lots of awful things that happened there, but there are truly new lows being explored by the supermajority.” At the same time, he added, “I think it speaks to her perseverance, her courage, and bravery.”", - "Medrano believes the Republican Party’s actions in Montana may, in the end, expand the movement it has sought to control.", - "“I think this is the moment. I’ve never seen such a groundswell and such camaraderie amongst people,” he said. “We’re seeing — across age, across race, and even really, across political belief — a real movement being started here to push back and to respond.”" - ] - } - ] - }, - "publishing_date": "2023-04-28 15:54:24+00:00", - "title": "An Insider’s View of the Montana Legislature’s Attacks on Trans Rep. Zooey Zephyr", - "topics": [ - "Justice", - "Politics" - ] - }, "V1_1": { "authors": [ "Nikita Mazurov" @@ -113,5 +67,51 @@ "National Security", "World" ] + }, + "V1": { + "authors": [ + "Ryan Devereaux" + ], + "body": { + "summary": [ + "The ACLU’s Keegan Medrano, a queer, Native advocate in Helena, said Zephyr’s expulsion was the culmination of months of attacks from Montana’s far right." + ], + "sections": [ + { + "headline": [], + "paragraphs": [ + "The tenor of Montana’s legislative session was evident from the start. In January, less than a week into the biannual, monthslong lawmaking process, Republican state Sen. Keith Regier proposed a study to determine whether the federal government’s system of Native American reservations should be dismantled, suggesting rights to lands given to tribes after generations of dispossession should perhaps cease to exist.", + "Peppered with racist stereotypes, the proposal ultimately crumbled in the face of local and national backlash, but the tone was set.", + "In the months since, the Montana GOP’s willingness to push the envelope against perceived cultural enemies has only intensified, culminating this week in the expulsion of Democratic Rep. Zooey Zephyr, the first transgender lawmaker in the state’s history.", + "As policy director for the American Civil Liberties Union’s Montana office, Keegan Medrano has been in the Capitol in Helena day after day for the past four months, meeting with lawmakers and advocate on bills impacting Native American and LGBTQ+ communities. For Medrano, a queer descendant of the Muscogee Creek nation, the work is both professional and personal.", + "“What we’ve been seeing over this session is that there is such distain, such animus, such disgust with queer people, Indigenous people, people that don’t fit in within their vision of what a Montana is,” Medrano told The Intercept. “They have such anger and disdain and disgust that they can’t control it,” he said. “And they’re now weaponizing the institutions to exclude us and police us.”", + "In a vote that broke along party lines Wednesday, Montana Republicans banned Zephyr from speaking or voting from the floor or the gallery of the Capitol for the remainder of this year’s session, which ends next week.", + "The move against Zephyr followed a pitched battle in recent weeks over a bill that would bar gender-affirming medical care for Montana youth; similar proposals have been introduced and passed by Republican-controlled state legislatures across the country. On April 17, Montana’s Republican Gov. Greg Gianforte indicated he would sign the bill, despite the pleas of his own son.", + "“He talks about compassion toward children, the youth of Montana, while simultaneously taking away health care from the youth in Montana,” Brian Gianforte, a 32-year-old member of Montana’s LGBTQ+ community said of his father’s support for the legislation in an interview with the Montana Free Press.", + "Powered by an influx of ultra-wealthy conservatives and the ever-expanding regional influence of Christian nationalism, Montana’s reputation as a live-and-let-live state has increasingly given way to the hard-right politics of its Republican Freedom Caucus in recent years.", + "Greg Gianforte, the governor presiding over the shift, rose to national prominence in 2017, when he choke-slammed a journalist on the eve of his election to Congress. Drawing on millions of dollars in donations to himself — Gianforte was then the richest man in Congress — the evangelical tech entrepreneur was elected governor in 2020, breaking the hold Democrats had on the office for a decade and a half.", + "The GOP’s grip on the levers of state power further tightened with a series of wins in last year’s midterm elections, giving the party a supermajority heading into this year’s legislative session.", + "Zephyr, a 34-year-old representing the liberal college town of Missoula, found herself in the crosshairs of Montana’s Republican hard-liners after speaking out against the bill to ban medical for transgender youth.", + "“If you vote yes on this bill and yes on these amendments, I hope the next time there’s an invocation, when you bow your heads in prayer, you see the blood on your hands,” Zephyr told her colleagues earlier this month.", + "That night, in a letter and tweet that deliberately misgendered the Democratic lawmaker, all 21 Montana Freedom Caucus members demanded Zephyr’s censure for “using inappropriate and uncalled-for language during a floor debate.”", + "Zephyr’s efforts to speak from the gallery in the state capital were repeatedly rebuffed in the days that followed. On Monday, hundreds of protesters converged on Helena. “Let her speak,” they chanted. Capitol police in riot gear were deployed. Seven people were arrested on trespassing charges, including two of Medrano’s staffers.", + "Among Zephyr’s constituents, a combination of frustration, fear, and outrage had been building from the moment the legislative session began, Medrano said; the protest was a form of release.", + "“I think that all sort of came out,” he said. “After over 80 days of not only the jokes, not only the questions, but also the policy, and then now, where we’re actually targeting, harassing, being retaliatory toward individuals from those communities.”", + "For Medrano, there is a throughline that binds Indigenous rights, trans rights, and reproductive rights: three areas where the Republican Party has directed much of its attention this session.", + "“Every single one of those individuals practices their own sort of body sovereignty and autonomy,” he said. “The Montana Republicans, the Freedom Caucus, they’re all afraid of these people, and so they legislate to extinguish their existence and/or to make their existences not palatable and not a part of what Montana is.”", + "Silenced by her Republican colleagues, Zephyr now sits on a bench outside the Capitol gallery, voting on bills and staying connected with her constituents on her laptop.", + "“It casts a pall over that building,” Medrano said. “There are lots of awful things that happened there, but there are truly new lows being explored by the supermajority.” At the same time, he added, “I think it speaks to her perseverance, her courage, and bravery.”", + "Medrano believes the Republican Party’s actions in Montana may, in the end, expand the movement it has sought to control.", + "“I think this is the moment. I’ve never seen such a groundswell and such camaraderie amongst people,” he said. “We’re seeing — across age, across race, and even really, across political belief — a real movement being started here to push back and to respond.”" + ] + } + ] + }, + "publishing_date": "2023-04-28 15:54:24+00:00", + "title": "An Insider’s View of the Montana Legislature’s Attacks on Trans Rep. Zooey Zephyr", + "topics": [ + "Justice", + "Politics" + ] } } diff --git a/tests/resources/parser/test_data/us/TheNation.json b/tests/resources/parser/test_data/us/TheNation.json index 4519f1cf..67d78d3e 100644 --- a/tests/resources/parser/test_data/us/TheNation.json +++ b/tests/resources/parser/test_data/us/TheNation.json @@ -74,7 +74,7 @@ "description": "Tanner Fischer speaks in front of UPS workers in Iowa.", "caption": "Tanner Fischer leads a rally of UPS workers in Des Moines, Iowa.", "authors": [ - "(Courtesy of Tanner Fischer)" + "Tanner Fischer" ], "position": 366 }, @@ -91,7 +91,7 @@ "description": null, "caption": "Tanner Fischer.", "authors": [ - "( Sarah Lazare)" + "Sarah Lazare" ], "position": 452 }