From acba7b33eca83ac68bd82f465e4711192625d698 Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Mon, 13 Jan 2025 14:12:49 +0100 Subject: [PATCH 1/4] add `AsahiShimbun` --- docs/supported_publishers.md | 15 +++++ src/fundus/publishers/jp/__init__.py | 8 +++ src/fundus/publishers/jp/asahi_shimbun.py | 53 +++++++++++++++++ .../parser/test_data/jp/AsahiShimbun.json | 56 ++++++++++++++++++ .../jp/AsahiShimbun_2025_01_13.html.gz | Bin 0 -> 41767 bytes tests/resources/parser/test_data/jp/meta.info | 4 ++ 6 files changed, 136 insertions(+) create mode 100644 src/fundus/publishers/jp/asahi_shimbun.py create mode 100644 tests/resources/parser/test_data/jp/AsahiShimbun.json create mode 100644 tests/resources/parser/test_data/jp/AsahiShimbun_2025_01_13.html.gz diff --git a/docs/supported_publishers.md b/docs/supported_publishers.md index 20289581..14f7de01 100644 --- a/docs/supported_publishers.md +++ b/docs/supported_publishers.md @@ -1205,6 +1205,21 @@ + + + AsahiShimbun + + +
Asahi Shimbun
+ + + + www.asahi.com + + +   +   + TheJapanNews diff --git a/src/fundus/publishers/jp/__init__.py b/src/fundus/publishers/jp/__init__.py index 4b61586a..071d645d 100644 --- a/src/fundus/publishers/jp/__init__.py +++ b/src/fundus/publishers/jp/__init__.py @@ -1,4 +1,5 @@ from fundus.publishers.base_objects import Publisher, PublisherGroup +from fundus.publishers.jp.asahi_shimbun import AsahiShimbunParser from fundus.publishers.jp.the_japan_news import TheJapanNewsParser from fundus.publishers.jp.yomiuri_shimbun import YomiuriShimbunParser from fundus.scraping.filter import regex_filter @@ -28,3 +29,10 @@ class JP(metaclass=PublisherGroup): NewsMap("https://www.yomiuri.co.jp/sitemap-news-latest.xml"), ], ) + + AsahiShimbun = Publisher( + name="Asahi Shimbun", + domain="https://www.asahi.com/", + parser=AsahiShimbunParser, + sources=[NewsMap("https://www.asahi.com/sitemap.xml")], + ) diff --git a/src/fundus/publishers/jp/asahi_shimbun.py b/src/fundus/publishers/jp/asahi_shimbun.py new file mode 100644 index 00000000..32d66057 --- /dev/null +++ b/src/fundus/publishers/jp/asahi_shimbun.py @@ -0,0 +1,53 @@ +import datetime +import re +from typing import List, Optional + +from lxml.cssselect import CSSSelector +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_topic_parsing, + image_extraction, +) + + +class AsahiShimbunParser(ParserProxy): + class V1(BaseParser): + _summary_selector = CSSSelector("div.nfyQp > div.bv2Sj > p") + _paragraph_selector = CSSSelector("div.nfyQp > p") + _subtitle_selector = CSSSelector("div.nfyQp > h2") + + @attribute + def body(self) -> Optional[ArticleBody]: + return extract_article_body_with_selector( + self.precomputed.doc, + paragraph_selector=self._paragraph_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 generic_topic_parsing(self.precomputed.meta.get("keywords")) + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + relative_urls=True, + ) diff --git a/tests/resources/parser/test_data/jp/AsahiShimbun.json b/tests/resources/parser/test_data/jp/AsahiShimbun.json new file mode 100644 index 00000000..6ddc6672 --- /dev/null +++ b/tests/resources/parser/test_data/jp/AsahiShimbun.json @@ -0,0 +1,56 @@ +{ + "V1": { + "authors": [ + "朝日新聞デジタル" + ], + "body": { + "summary": [], + "sections": [ + { + "headline": [], + "paragraphs": [ + "気象庁は13日、午後9時19分ごろ、日向灘(北緯31.8度、東経131.6度)で震度5弱の地震があったと発表した。震源の深さは約30キロ、地震の規模(マグニチュード)は6.9と推定される。この地震で、気象庁は高知県と宮崎県に1メートルの津波注意報を出した。", + "各地の震度は次のとおり。", + "<震度5弱>", + "宮崎県:高鍋町、新富町、宮崎市", + "<震度4>", + "宮崎県:延岡市、西都市、木城町、川南町、都農町、門川町、日南市*、串間市、国富町、綾町、美郷町、高千穂町、都城市、小林市、えびの市、三股町、高原町", + "福岡県:久留米市", + "佐賀県:神埼市、白石町", + "熊本県:阿蘇市、産山村、高森町、南阿蘇村、熊本市南区、熊本市北区、八代市、菊池市、宇土市、宇城市、合志市、美里町、西原村、氷川町、人吉市、多良木町、あさぎり町、芦北町", + "大分県:大分市、臼杵市、佐伯市、竹田市", + "鹿児島県:鹿児島市、霧島市、いちき串木野市、南さつま市、伊佐市、姶良市、鹿屋市、垂水市、曽於市、大崎町、東串良町、肝付町" + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://www.asahicom.jp/imgopt/img/4ff96428f2/comm_L/AS20250113003419.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "写真・図版", + "caption": null, + "authors": [], + "position": 737 + } + ], + "publishing_date": "2025-01-13 21:37:00+09:00", + "title": "宮崎県で震度5弱、高知と宮崎に1メートルの津波注意報 気象庁:朝日新聞デジタル", + "topics": [ + "朝日新聞デジタル", + "社会", + "災害・気象", + "宮崎県", + "朝日新聞", + "ニュース", + "新聞" + ] + } +} diff --git a/tests/resources/parser/test_data/jp/AsahiShimbun_2025_01_13.html.gz b/tests/resources/parser/test_data/jp/AsahiShimbun_2025_01_13.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..a9b1198e77d9aa8a585c34c7d4f0c2b502b47205 GIT binary patch literal 41767 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 Q<~#cT0W{yKdtVp>0Nf-@{r~^~ literal 0 HcmV?d00001 diff --git a/tests/resources/parser/test_data/jp/meta.info b/tests/resources/parser/test_data/jp/meta.info index 438a2da8..a62926b9 100644 --- a/tests/resources/parser/test_data/jp/meta.info +++ b/tests/resources/parser/test_data/jp/meta.info @@ -1,4 +1,8 @@ { + "AsahiShimbun_2025_01_13.html.gz": { + "url": "https://www.asahi.com/articles/AST1F4445T1FUTIL02SM.html", + "crawl_date": "2025-01-13 14:12:17.527262" + }, "TheJapanNews_2024_10_13.html.gz": { "url": "https://japannews.yomiuri.co.jp/politics/politics-government/20241013-216478/", "crawl_date": "2024-10-13 16:27:01.520980" From b9d7dcd4488f2e258bd95e24f54a387bbbd55bcb Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Mon, 13 Jan 2025 14:34:20 +0100 Subject: [PATCH 2/4] add missing selectors to `body` --- src/fundus/publishers/jp/asahi_shimbun.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fundus/publishers/jp/asahi_shimbun.py b/src/fundus/publishers/jp/asahi_shimbun.py index 32d66057..96e91066 100644 --- a/src/fundus/publishers/jp/asahi_shimbun.py +++ b/src/fundus/publishers/jp/asahi_shimbun.py @@ -1,9 +1,7 @@ import datetime -import re from typing import List, Optional from lxml.cssselect import CSSSelector -from lxml.etree import XPath from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( @@ -26,6 +24,8 @@ def body(self) -> Optional[ArticleBody]: return extract_article_body_with_selector( self.precomputed.doc, paragraph_selector=self._paragraph_selector, + summary_selector=self._summary_selector, + subheadline_selector=self._subtitle_selector, ) @attribute From d1bd0088d79fa8edcd51d2da095f69f9238af47b Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Tue, 14 Jan 2025 15:28:00 +0100 Subject: [PATCH 3/4] Update src/fundus/publishers/jp/asahi_shimbun.py Co-authored-by: Adrian Breiding --- src/fundus/publishers/jp/asahi_shimbun.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fundus/publishers/jp/asahi_shimbun.py b/src/fundus/publishers/jp/asahi_shimbun.py index 96e91066..755e5c8d 100644 --- a/src/fundus/publishers/jp/asahi_shimbun.py +++ b/src/fundus/publishers/jp/asahi_shimbun.py @@ -30,7 +30,7 @@ def body(self) -> Optional[ArticleBody]: @attribute def title(self) -> Optional[str]: - return self.precomputed.meta.get("og:title") + return self.precomputed.meta.get("TITLE") @attribute def publishing_date(self) -> Optional[datetime.datetime]: From c40854468812b3edf1b68d419775ab8ddca46872 Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Tue, 14 Jan 2025 15:38:24 +0100 Subject: [PATCH 4/4] filter topics and apply author regex for image extraction --- src/fundus/publishers/jp/asahi_shimbun.py | 9 ++++++++- tests/resources/parser/test_data/jp/AsahiShimbun.json | 8 ++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/fundus/publishers/jp/asahi_shimbun.py b/src/fundus/publishers/jp/asahi_shimbun.py index 755e5c8d..96f33937 100644 --- a/src/fundus/publishers/jp/asahi_shimbun.py +++ b/src/fundus/publishers/jp/asahi_shimbun.py @@ -1,10 +1,12 @@ import datetime +import re from typing import List, Optional from lxml.cssselect import CSSSelector from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute from fundus.parser.utility import ( + apply_substitution_pattern_over_list, extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, @@ -19,6 +21,8 @@ class V1(BaseParser): _paragraph_selector = CSSSelector("div.nfyQp > p") _subtitle_selector = CSSSelector("div.nfyQp > h2") + topic_bloat_pattern = re.compile(r"朝日新聞デジタル|朝日新聞|ニュース|新聞|その他・話題") + @attribute def body(self) -> Optional[ArticleBody]: return extract_article_body_with_selector( @@ -42,12 +46,15 @@ def authors(self) -> List[str]: @attribute def topics(self) -> List[str]: - return generic_topic_parsing(self.precomputed.meta.get("keywords")) + return apply_substitution_pattern_over_list( + generic_topic_parsing(self.precomputed.meta.get("keywords")), self.topic_bloat_pattern + ) @attribute def images(self) -> List[Image]: return image_extraction( doc=self.precomputed.doc, paragraph_selector=self._paragraph_selector, + author_selector=re.compile(r"、(?P[^、]*?)撮影"), relative_urls=True, ) diff --git a/tests/resources/parser/test_data/jp/AsahiShimbun.json b/tests/resources/parser/test_data/jp/AsahiShimbun.json index 6ddc6672..7e70a92e 100644 --- a/tests/resources/parser/test_data/jp/AsahiShimbun.json +++ b/tests/resources/parser/test_data/jp/AsahiShimbun.json @@ -42,15 +42,11 @@ } ], "publishing_date": "2025-01-13 21:37:00+09:00", - "title": "宮崎県で震度5弱、高知と宮崎に1メートルの津波注意報 気象庁:朝日新聞デジタル", + "title": "宮崎県で震度5弱、高知と宮崎に1メートルの津波注意報 気象庁", "topics": [ - "朝日新聞デジタル", "社会", "災害・気象", - "宮崎県", - "朝日新聞", - "ニュース", - "新聞" + "宮崎県" ] } }