diff --git a/docs/supported_publishers.md b/docs/supported_publishers.md index fdd1bc92..2f9daf60 100644 --- a/docs/supported_publishers.md +++ b/docs/supported_publishers.md @@ -1269,6 +1269,21 @@     + + + ChunichiShimbun + + +
Chunichi Shimbun
+ + + + www.chunichi.co.jp + + +   +   + TheJapanNews @@ -1284,6 +1299,21 @@     + + + TokyoShimbun + + +
Tokyo Shimbun
+ + + + www.tokyo-np.co.jp + + +   +   + YomiuriShimbun diff --git a/src/fundus/publishers/jp/__init__.py b/src/fundus/publishers/jp/__init__.py index 071d645d..13a28c01 100644 --- a/src/fundus/publishers/jp/__init__.py +++ b/src/fundus/publishers/jp/__init__.py @@ -1,6 +1,7 @@ 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.tokyo_chunichi_shimbun import TokyoChunichiShimbunParser from fundus.publishers.jp.yomiuri_shimbun import YomiuriShimbunParser from fundus.scraping.filter import regex_filter from fundus.scraping.url import NewsMap, Sitemap @@ -36,3 +37,17 @@ class JP(metaclass=PublisherGroup): parser=AsahiShimbunParser, sources=[NewsMap("https://www.asahi.com/sitemap.xml")], ) + + TokyoShimbun = Publisher( + name="Tokyo Shimbun", + domain="https://www.tokyo-np.co.jp/", + parser=TokyoChunichiShimbunParser, + sources=[NewsMap("https://www.tokyo-np.co.jp/sitemap.xml")], + ) + + ChunichiShimbun = Publisher( + name="Chunichi Shimbun", + domain="https://www.chunichi.co.jp/", + parser=TokyoChunichiShimbunParser, + sources=[NewsMap("https://www.chunichi.co.jp/sitemap.xml")], + ) diff --git a/src/fundus/publishers/jp/tokyo_chunichi_shimbun.py b/src/fundus/publishers/jp/tokyo_chunichi_shimbun.py new file mode 100644 index 00000000..e5f04f2b --- /dev/null +++ b/src/fundus/publishers/jp/tokyo_chunichi_shimbun.py @@ -0,0 +1,69 @@ +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 ( + apply_substitution_pattern_over_list, + extract_article_body_with_selector, + generic_author_parsing, + generic_date_parsing, + generic_topic_parsing, + image_extraction, +) + + +class TokyoChunichiShimbunParser(ParserProxy): + class V1(BaseParser): + _paragraph_selector = XPath("//main//div[@class='block' and not(descendant::div or descendant::h2)]") + _subheadline_selector = XPath("//main//div[@class='block']//h2") + + _author_bloat_pattern = re.compile(r"記者") + _topic_bloat_pattern = re.compile(r"話題・|話題") + + @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.ld.bf_search("headline") + + @attribute + def publishing_date(self) -> Optional[datetime.datetime]: + return generic_date_parsing(self.precomputed.ld.bf_search("datePublished")) + + @attribute + def authors(self) -> List[str]: + return apply_substitution_pattern_over_list( + generic_author_parsing(self.precomputed.ld.bf_search("author")), self._author_bloat_pattern + ) + + @attribute + def topics(self) -> List[str]: + if topics := apply_substitution_pattern_over_list( + generic_topic_parsing(self.precomputed.ld.bf_search("articleSection")), self._topic_bloat_pattern + ): + return [topic for topic in topics if "ニュース" not in topic] + return [] + + @attribute + def images(self) -> List[Image]: + return image_extraction( + doc=self.precomputed.doc, + paragraph_selector=self._paragraph_selector, + image_selector=CSSSelector("main div.image img, main div.thumb img"), + caption_selector=XPath( + "./ancestor::div[@class='wrap']//p[@class='caption'] | " + "./ancestor::div[@class='thumb']//p[@class='thumb-caption']" + ), + author_selector=re.compile(r"((?P[^)]*?)(撮影)?)\s*$"), + relative_urls=True, + ) diff --git a/src/fundus/publishers/jp/yomiuri_shimbun.py b/src/fundus/publishers/jp/yomiuri_shimbun.py index b3fa4797..22d1e66b 100644 --- a/src/fundus/publishers/jp/yomiuri_shimbun.py +++ b/src/fundus/publishers/jp/yomiuri_shimbun.py @@ -9,7 +9,6 @@ extract_article_body_with_selector, generic_author_parsing, generic_date_parsing, - generic_topic_parsing, image_extraction, ) diff --git a/tests/resources/parser/test_data/jp/ChunichiShimbun.json b/tests/resources/parser/test_data/jp/ChunichiShimbun.json new file mode 100644 index 00000000..f07ae3af --- /dev/null +++ b/tests/resources/parser/test_data/jp/ChunichiShimbun.json @@ -0,0 +1,43 @@ +{ + "V1": { + "authors": [ + "中日新聞Web" + ], + "body": { + "summary": [], + "sections": [ + { + "headline": [], + "paragraphs": [ + "13日午後9時19分ごろ、宮崎県で震度5弱の地震があった。気象庁によると、震源地は日向灘で、震源の深さは約36キロ。地震の規模はマグニチュード(M)6・6と推定される。高知県、宮崎県で津波を観測した。昨年8月に続いて2度目となる臨時情報を発表。評価検討会を開いて南海トラフ巨大地震との関連について調査し「発生可能性が平常時と比べて相対的に高まったと考えられる現象ではない」として終了すると明らかにした。", + "気象庁は調査終了を受けた記者会見で「地震はいつ起きてもおかしくない。日頃からの備えを確実に実施しておくようお願いしたい」と呼びかけた。気象庁によると、日向灘の地震は南海トラフ巨大地震の想定震源域..." + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://static.chunichi.co.jp/image/article/size1/c/f/9/8/cf987ccfaa6a53cdafbf62304b029848_1.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": true, + "description": "宮崎県で最大震度5弱を観測した地震と南海トラフ地震との関連を調べるため、気象庁で開かれた評価検討会=13日午後10時31分(代表撮影)", + "caption": "宮崎県で最大震度5弱を観測した地震と南海トラフ地震との関連を調べるため、気象庁で開かれた評価検討会=13日午後10時31分", + "authors": [ + "代表" + ], + "position": 343 + } + ], + "publishing_date": "2025-01-14 01:28:54+09:00", + "title": "南海トラフ、一時調査 巨大地震、基準達せず", + "topics": [ + "社会" + ] + } +} diff --git a/tests/resources/parser/test_data/jp/ChunichiShimbun_2025_01_13.html.gz b/tests/resources/parser/test_data/jp/ChunichiShimbun_2025_01_13.html.gz new file mode 100644 index 00000000..710f7585 Binary files /dev/null and b/tests/resources/parser/test_data/jp/ChunichiShimbun_2025_01_13.html.gz differ diff --git a/tests/resources/parser/test_data/jp/TokyoShimbun.json b/tests/resources/parser/test_data/jp/TokyoShimbun.json new file mode 100644 index 00000000..ed931470 --- /dev/null +++ b/tests/resources/parser/test_data/jp/TokyoShimbun.json @@ -0,0 +1,92 @@ +{ + "V1": { + "authors": [ + "東京新聞デジタル" + ], + "body": { + "summary": [], + "sections": [ + { + "headline": [], + "paragraphs": [ + "東京女子医大(東京都新宿区)の新校舎建設工事を巡って、業務報酬名目で不正に約1億2000万円を支払わせて大学に損害を与えたとして、警視庁捜査2課は13日、背任の疑いで、元理事長の岩本絹子容疑者(78)=東京都江戸川区=を逮捕した。同課は、岩本容疑者が金を自身や側近に還流して私的に流用していたとみて、不透明な資金の流れの全容解明を進める。", + "逮捕容疑では、2018年7月~2020年2月、同大の新校舎「弥生記念教育棟」「巴研究教育棟」2棟の建設工事を巡り、同大経営統括部幹部だった元職員の女性(52)と、東京都台東区の建設会社社長で1級建築士の男性(68)と共謀し、男性が実際にはアドバイザー業務をしていないのに、報酬名目などで計約1億1700万円を大学から不正に支払わせ、同大に損害を与えたとされる。捜査2課は認否を明らかにしていない。", + "岩本容疑者は2014年に副理事長、2019年に理事長に就任した。捜査関係者によると、元職員の女性は同容疑者の側近で、大学から男性の口座に振り込まれた金は、元職員の女性を通じ容疑者に全て現金で手渡され、還流されていた。捜査2課は2人についても、任意で捜査を進める。", + "女子医大を巡っては、2023年3月に「不透明な資金の流れがある」として卒業生らが警視庁に告発状を提出。捜査2課は2024年3月、元職員の女性が同窓会組織「至誠会」から約2000万円の給与を不正に受け取ったとして、一般社団法人法違反(特別背任)の疑いで、大学本部や岩本容疑者の自宅などを家宅捜索していた。", + "さらに推薦入試での寄付金受領疑惑なども浮上したため、女子医大は実態調査のため第三者委員会を設置。第三者委は2024年8月、大学の資金が岩本容疑者に還流していたとする調査報告書を公表し、「(同容疑者は)金銭に対する強い執着心があった」と指弾した。同容疑者は同月、女子医大の全役職から解任された。", + "東京女子医大 1900年、前身の「東京女医学校」として創立され、1952年に大学開校。国内で唯一、女性のみを対象に医学教育を行う私立大で、医学部、看護学部、大学院、大学病院のほか、全国各地で医療センターや研修施設を運営している。大学などによると2024年5月時点の学生数は1353人で、2023年5月時点の教職員・研修生は5735人。2014年に2歳男児が鎮静剤プロポフォールを長時間投与されて死亡する事件があり、2015年には高度な医療を提供する「特定機能病院」の承認が取り消されている。本部は東京都新宿区。", + "◇" + ] + }, + { + "headline": [ + "◆学内に不安の声「学生にもしっかり説明して」" + ], + "paragraphs": [ + "「ようやく逮捕に至った。長かった」", + "東京女子医大の元理事の男性は13日、ほっとした口ぶりで語った。「理事会もずっと紛糾していた。岩本容疑者を解任してから、再生への道筋をつけるのも一苦労だった」と語る。「今後の捜査でうみを全て出し切り、新たな女子医大としてクリーンな学校になってほしい」と願う。", + "報道で知って大学まで様子を見に来たという同大の女子学生(21)は「一区切りついたと思うけど、これからも学び続けられるのか不安は残る。学生にもしっかり説明して」と心配そうに話した。", + "一方、同医大病院の40代の女性看護師は「逮捕されても、不正に流出した金が戻ってくるわけではない。私腹を肥やしていたのは事実だし、それによって職員や現場が圧迫された。謝罪してほしい」と憤る。", + "逮捕を受けて同医大は13日、記者会見を開いた。清水治理事長が「厳粛に受け止めている。全てのステークホルダーのみなさまに深くおわび申し上げます」と謝罪。「当時のガバナンス(組織統治)が十分機能しなかった。体制を見直し、再構築に着手している」と説明した。" + ] + } + ] + }, + "images": [ + { + "versions": [ + { + "url": "https://static.tokyo-np.co.jp/image/article/size1/0/7/3/1/07316f9de35fc7b5f8edb619f265957f_1.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "移送のため警視庁を出る岩本絹子容疑者=13日、東京・霞ケ関で(潟沼義樹撮影)", + "caption": "移送のため警視庁を出る岩本絹子容疑者=13日、東京・霞ケ関で", + "authors": [ + "潟沼義樹" + ], + "position": 314 + }, + { + "versions": [ + { + "url": "https://static.tokyo-np.co.jp/image/article/size1/d/b/a/9/dba91b61133042c65d8375750776165b_2.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": null, + "caption": null, + "authors": [], + "position": 322 + }, + { + "versions": [ + { + "url": "https://static.tokyo-np.co.jp/image/article/size1/9/4/e/1/94e1db4a7024d3bea8a61c8e9cd5dfe4_2.jpg", + "query_width": null, + "size": null, + "type": "image/jpeg" + } + ], + "is_cover": false, + "description": "岩本絹子元理事長の逮捕を受け、記者会見を開いた清水治理事長(中)ら大学幹部", + "caption": "岩本絹子元理事長の逮捕を受け、記者会見を開いた清水治理事長(中)ら大学幹部", + "authors": [], + "position": 339 + } + ], + "publishing_date": "2025-01-13 20:01:37+09:00", + "title": "「金に執着」と指弾された東京女子医大元理事長、大学に不正に1.2億円支払わせ私的流用か 警視庁逮捕", + "topics": [ + "社会", + "東京・首都圏", + "新宿区" + ] + } +} diff --git a/tests/resources/parser/test_data/jp/TokyoShimbun_2025_01_13.html.gz b/tests/resources/parser/test_data/jp/TokyoShimbun_2025_01_13.html.gz new file mode 100644 index 00000000..44c7fb72 Binary files /dev/null and b/tests/resources/parser/test_data/jp/TokyoShimbun_2025_01_13.html.gz differ diff --git a/tests/resources/parser/test_data/jp/meta.info b/tests/resources/parser/test_data/jp/meta.info index a62926b9..7ce6b780 100644 --- a/tests/resources/parser/test_data/jp/meta.info +++ b/tests/resources/parser/test_data/jp/meta.info @@ -3,10 +3,18 @@ "url": "https://www.asahi.com/articles/AST1F4445T1FUTIL02SM.html", "crawl_date": "2025-01-13 14:12:17.527262" }, + "ChunichiShimbun_2025_01_13.html.gz": { + "url": "https://www.chunichi.co.jp/article/1011185", + "crawl_date": "2025-01-13 18:10:25.145717" + }, "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" }, + "TokyoShimbun_2025_01_13.html.gz": { + "url": "https://www.tokyo-np.co.jp/article/379018", + "crawl_date": "2025-01-13 14:50:19.966300" + }, "YomiuriShimbun_2024_12_03.html.gz": { "url": "https://www.yomiuri.co.jp/world/20241203-OYT1T50218/", "crawl_date": "2024-12-03 16:21:55.640474"