<jupyter_start><jupyter_text>62273183Solution to Stackoverflow question [62273183][Q]: [ *How to split a text file based on certain headers in Python and download audio files* ][Q]Problem description: The objective is to extract some headlines (text) and download the corresponding audio files (`.mp3`), when available, from an input-file (`.txt`). [Q]: https://stackoverflow.com/questions/62273183/how-to-split-a-text-file-based-on-certain-headers-in-python-and-download-audio-f[![Open In Colab][colab-badge]][colab-notebook][colab-badge]: https://colab.research.google.com/assets/colab-badge.svg[colab-notebook]: https://colab.research.google.com/github/sugatoray/stackoverflow/blob/master/src/answers/Q_62273183/Q_62273183.ipynb  Dummy DataSaved in variable `s` as text.<jupyter_code>use_dummy_data_chinese = True
use_dummy_data_english = False
s = ""<jupyter_output><empty_output><jupyter_text>Dummy Data - With _English + Chinese_ TextSee the [regex][regex-headline-text-chinese] for extracting headline-text.[regex-headline-text-chinese]: https://regex101.com/r/P4cnOd/1/<jupyter_code>s_ch = """
[headline - https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html]
過去五日，中美外交角力一日一戲碼。上周四（5月28日）中共強推「港版國安法」，翌日（5月29日），美國總統特朗普隨即宣布，將會取消對香港的特殊貿易待遇。到了周日（5月31日），美國國務卿蓬佩奧表示，中共將香港等同大陸的其他城市，美國已沒有理由給予香港優惠待遇。本周一（6月1日），中國外交部發言人趙立堅再回應，美方的措施嚴重干涉中國內政，破壞中美關係，必將損人害己。（方德豪/胡凱文 報道）
蓬佩奧周日在接受霍士新聞訪問時，被問及對特朗普回應中共強行實施「港版國安法」的措施時，蓬佩奧表示，中國已違反其給予香港高度自治權的承諾，並認為若香港與中國其他城市沒有分別，那麼美國也沒有理由給予香港優惠待遇。
蓬佩奧說：執行上，總統提出了我們要做的幾件事。他已要求我們檢視所有香港享受的優惠，並致力取消，因為這些不再有意義。如果中國對待香港，與對待大陸的方式一樣，那麼美國也沒有理由用不同的方式對待香港。
蓬佩奧又稱，當今的中國共產黨已與十年前不同，現在的中共有意破壞西方思想、民主與價值觀，讓美國民眾置身於險境之中。蓬佩奧指，美國將會對中共的種種行為作出回應，例如審查並取消對香港的優惠待遇，另外也將開始調查在美的中國學生與中國軍方的潛在聯繫，以及其他行動。
在北京，中國外交部發言人趙立堅在周一（1日）的記者會上回應指，美方領導人對中方的種種指責完全罔顧事實，所宣布的措施嚴重幹涉中國內政、破壞中美關係，必將損人害己，中方對此堅決反對。他又重申，香港是中國的香港，香港事務純屬中國內政。「港版國安法」目的是彌補香港特別行政區在國家安全立法方面的缺失，以便更好地貫徹「一國兩制」。
另外，趙立堅又表示，美方威脅調查在美上市的中國企業，並出台措施限制中國留學人員赴美簽證，做法嚴重違背市場競爭原則，完全違背中美兩國人民開展友好交流的願望，必將進一步損害中美經貿關係和兩國關係的社會基礎。
香港時事評論員陶傑接受本台專訪時分析指，香港被捲入中美角力的旋渦，正處於準戰爭狀態，意味著有可能觸發「第三次世界大戰」，而港人恐難逃脫變難民命運；香港知名作家李怡亦指香港年輕人的捨身抗爭價值，經已響徹世界，呼籲港人要堅持到底。
Last line.

[date - https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html]
https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html/US-Pompeo.mp3

[headline - https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html]
中國人大通過制訂「港版國安法」，被國際社會批評破壞《中英聯合聲明》的承諾。英國傳媒報道，政府已討論擴大對台灣支持，並可能在五年內承認台灣的主權。台灣的外交部對報道不作評論，但強調會進一步發展和英國關係。學者認為英國如承認台灣主權，在經濟上將付出慘痛代價，相信英國只是放風而不會付諸行動。（鍾廣政 台北報道）
英國《周日快報》（Sunday Express）周日（5月31日）以獨家方式報道，中國破壞對英國承諾，侵蝕香港自治，以及對台灣的武力威脅不斷增加，英國內閣已就此進行討論，將增加對台灣的支持，甚至有可能在五年之內，承認台灣的主權。
台灣的外交部發言人歐江安不對報道進行評論。但指出將繼續發展和英國的實質關係。
歐江安說：關於英國媒體報導，據傳英國政府內部討論加強與我關係，外交部已注意到相關報導。外交部強調，近年來台英關係不斷增長，在各項領域都有實質進展，未來我們將持續強化與包括英國在內的理念相近國家的廣泛合作。外交部不會就這則報導本身作出評論。
民進黨立委陳亭妃表示，相信英國要幫助台灣的方式很多，她很感謝英國釋出這個善意，台灣會更積極向英方尋求更多的幫忙。
陳亭妃說：今天這個訊息真的給了台灣一個強心針，因為英國要協助台灣有太多的方式跟手段。
陳亭妃認為，如果在這五年當中，慢慢地循序漸進，先在駐英代表的安排上，能夠先讓台灣有一個完整的地位，這個部份也是一個協助，甚至能夠利用英國在南太平洋的一些邦交國，來協助台灣抗中護台，這也是很關鍵。
陳亭妃指，更希望英國協助台灣，在一些國際參與的空間當中，有更多的發言權，以及對台出售潛艦零件協助台灣發展自製潛艇。
國民黨立委林為洲則認為，如果英國真敢這樣做，台灣應該更積極爭取和美國建交。
林為洲說：包括美國我們也希望可以爭取，現在跟美國這麼好，美國是不是要率先承認台灣、恢復邦交？這樣才是實質的幫助，不是打嘴砲。
但文化大學政治系講座教授陳一新認為，這只是英國故意洩露出來刺激北京的手段，不會真的有所行動。
陳一新說：我不認為英國有膽量，因為他跟中國有還算密切的貿易關係，所以我認為他不會這樣做。因為這樣做的話，中國可以切斷英國的經貿關係，英國就可能得不償失。從台灣這方面當然可以得到一些經貿的利益，但是不會很多，因為台灣沒有中國大陸大。你忘了？當初法國出售幻象戰鬥機給台灣，中共就取消了法國投資廣東核電廠的資格，荷蘭賣給台灣潛艇更慘，雙方降為代辦關係，後來才恢復。我想，英國要付出這麼高的代價嗎？
陳一新指，立法院長游錫堃年初提出和美國建交後，美國立即表態澄清，他覺得連美國都不敢做的事，向來跟從美國的英國政府，不可能作出這樣的決定。
陳一新相信，中國已判斷英國政府只敢說不敢做，否則中國外交部早就出來嚴正警告英國的做法。
Last line.

[date - https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html]
https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html/tw-su.mp3

[headline - https://www.rfa.org/cantonese/news/wang-06012020103828.html]
關注香港民主發展的北京詩人王藏，兩日前突被警方以「煽動顛覆國家政權罪」帶走，至今沒有消息。王藏的朋友表示，王藏一向敢於批評時政，估計當局抓他一定是與言論有關，認為當局在六四事件31周年前抓他，或想阻止他發聲。（黃樂濤 報道）
王藏上周六（5月30日）於家鄉雲南省楚雄市家中被警方以「煽動顛覆國家政權罪」拘捕。本台周一（1日）多次致電王藏妻子的手機，但電話一直顯示停機狀態。王藏的朋友、北京宋莊藝術家嚴正學對本台表示，王藏被抓走期間，他收到由王藏妻子王麗發出的訊息，表示他們兩夫婦被多名公安帶走，王麗被扣留12小時後獲釋，而王藏卻不知道身在何處，亦不知道王藏為何被指控這個罪名。嚴正學表示，王麗獲釋後仍被當局控制。
嚴正學說︰王麗微信就說當地警方給他（王藏）定了這個罪，王麗說來了這麼多人，她說樓上來了20個（公安），樓下還有20個，這種架勢就是抓人的，王麗發的短訊，可能是這個樣子（她獲釋後被控制），因為她現在電話也打不通，而且她昨天（周日）說關到晚上（凌晨）三、四點鐘出來了，然後家裡面也有有關部門的人。
據王麗於網上發出的消息指，在她獲釋回到家後，發現家裡一些重要的文件，包括銀行卡、王藏的護照及身份證等，還有他們兩夫婦的手機都被警方檢走，又指現時家裡有4名警察看守着，而在小區門口有一輛警車，王麗呼籲各界關注丈夫的情況。
本台致電抓捕王藏兩夫婦的楚雄市開發區派出所了解，但電話顯示忙線。
王藏另一名朋友、北京維權人士胡佳對本台表示，王藏一向都關心香港的情況及國內的時政，雖然多次受到當局的打壓，但從沒有間斷發表言論，由於六四31周年的日子臨近，當局抓他或許與此有關。
胡佳說︰就是這個階段，如果說是被抓的話，通常情況下是因為譬如說兩會的言論或者是六四即將到來的某些事情這些，我沒有看到他的微信朋友圈裡面，有過所謂沉默期，對於香港問題關注的話，王藏是一貫的，那麼在這裡面的話，時政類型的東西，也就是和當局可能會形成罪名言論東西的話，我覺得（王藏發表）並不少。
有北京詩人之稱的王藏，是國際筆會獨立中文筆會會員。他原於北京宋莊藝術村生活及工作，自2014年宋莊藝術家聲援香港佔領運動時就開始被打壓，曾被當局拘留超過80天，其後一直遭官方嚴控。期間先後9次遭逼遷。在2017年春節期間，官方為了將王藏一家逼遷，不顧三名幼童的安全，強行切斷水電和暖氣供應。王藏一家於2018年被迫從北京遷回其家鄉雲南。
Last line.

[date - https://www.rfa.org/cantonese/news/wang-06012020103828.html]
https://www.rfa.org/cantonese/news/wang-06012020103828.html/wang.mp3

[headline - https://www.rfa.org/cantonese/news/us-wang-06012020135251.html]
中國獨立民間思想家王康，上周三（5 月27日）在美國維珍尼亞州，因癌症醫治無效病逝，享年70歲。
王康生前要求喪事從簡，加上美國疫情限制10人以上聚會，遺體告別儀式周一（6月1日）舉行，之後火化。骨灰將安葬在王康生前安排好的美國墓地，與父母一起安葬。
王康生於重慶，曾下鄉做知青。1978年考入重慶北碚西南師範學院中文系，在校期間成立文學小組。1989年民運後遭當局通緝，開始流亡隱匿生涯，其後成立文化公司，製作大批人文影視及書畫作品。王康2013年應邀訪美，其後創立劉賓雁良知獎，以表彰弘揚良知的原創寫作。2019年，王康將父母的骨灰帶來了美國。
北京獨立專欄作家莫之許與王康相識超過30年，莫之許告訴本台，當時年輕的他從王康身上看到了中國知識分子的理想人格，為民主奔走呼號獻身的精神。他自己的人生理想追求和選擇，基本上是受到王康的激勵和思想啟蒙。
莫之許：那是在94年的時候，他（王康）在北京亞運村那邊在籌拍《大統一》電視片，那個時候也有一些公司贊助。而且那個時候其實北京還是很壓抑的，所以他那個地方就相當於成了一個北京的自由化知識分子一個小圈子來往的地方，主要是大家抱團取暖。那個時候陳小雅、鄭也夫、周孝正、梁平……反正當時在北京自由化知識分子好多都往這個地方在躥。大家就是經常拿著大鍋飯過來吃，還有就是打麻將，主要就是侃大山了。所謂說就是聚氣。認識好多人，對我來說是很大的一個提升，開了眼界。
王康生前先後拍攝了五集電視政論片《大道》、《抗戰陪都》、《盧作孚》、《中美西部開發啓示錄》、《重慶大轟炸》等，在國內外引起廣泛的關注與回響。2009年，王康邀請數十名著名畫家，畫了一千多個人物。其中抗日陣亡，少將軍銜以上的將領242人。2013年9月，王康表示，中國抗日戰爭勝利的主要功勞在中國國民黨，這在中國大陸已是大家默認的事實。
告別儀式由王康生前好友，給王康施洗的王志勇牧師主持，國內朋友發來了唁電。
------
莫之許並為本台撰寫了緬懷王康的文章，來共同紀念這位因追求民主，追求自由思想，追求真理而客死異鄉的中國民間思想家。（由何山讀出）
理想主義者王康
認識王康，已經是1990年的事情了，這一年我大學畢業，因為參與八九學運，沒有拿到畢業證，只是被派遣回原籍，在一個小公司上班，對于前途一片茫然，但認識了本地的毛喻原先生和一幫自由化的朋友，王康的名字在那時就經常聽到。
原來，王康一直為中國的民主化奔走，除了和劉賓雁先生交往甚密之外，還有許多宏大的思考，1989年4月，王康執筆，溫元凱領銜，在《世界經濟導報》發布「未來十年中國改革的基本構想」一文，這篇堪稱政綱的文章中，還提出了「黨容黨派、黨籌黨費之類激進的多黨民主主張，因此，在六四之後，被認為是「動亂」的綱領性文件，重慶市警方因此發布了對王康的內部通緝令，王康被迫轉入地下隱身狀態，需要隨時轉移地方。樂山老毛這個地方，就是他的藏身之處之一，此前已經來過幾次了。
在老毛等人的口中，對王康的描繪有兩個，一是職業革命家，一是「最後一名理想主義者」，年少不經事的我對此自然充滿了神往。一天，老毛突然出現在我公司，對我說：「王康來了，你下班後過來嘛。」
等我到老毛家中，發現還有另外一人，原來，重慶廖亦武等人因為籌拍紀念六四事件的電視片《安魂曲》，被公安抓了一大堆人，其中一人的女友是樂山人，此時回到了家鄉。我們幾個或多或少與六四有關的人，有的還是內部通緝中，有的是親人正在裡面，躲在老毛家中的閣樓上，談論和六四相關的詩案，這對于懵懂的我來說，有一種突然撞進來一個此前從未見識過的世界中的新鮮感和興奮感，在當時尚很壓抑的氣氛下，這樣的遇合也充滿了刺激感，王康的談吐和見識，更是我從未領略過的。
後來，幾個朋友又一路散心，在樂山周邊轉了轉，一個秋雨潇潇的夜晚，我和王康還有另一個朋友聚在招待所的房間擺龍門陣，當然主要是王康在講，那是我第一次比較完整地傾聽他的講論，那時距離六四剛剛一年多一點，大家的心境無疑是悲憤的，但是，蘇東巨變正在進行時，海灣戰爭又剛剛展現了美國強大的科技和軍事勢力，因此，王康的話語中並不是想象中那麼悲觀。對于自由民主在中國的前景依然充滿信心。
當然，也不可能有多麼樂觀，對于未來的艱險，王康也有充分的心理準備，我至今還清晰記得老康（朋友們皆以老康稱呼王康，至今亦然）說：「我相信，20年內中國必然發生巨大的變化，我希望自己能在這當中起到一點作用，最好是關鍵性的作用」，典型的王康式語言，宏大但又帶著某種謙遜，可以想象，這話對于苦悶彷徨的我會是多麼的震撼，又會怎樣地影響到我，但在當時，一切都是那麼的自然。王康的「職業革命家」和理想主義者的形象，連同這樣的記憶，就此深深地紮根在了我的腦海中。
在那次小遊中，王康的一個生活細節尤其讓我感興趣，四川的深秋已然很冷，但王康仍然堅持每天早上洗冷水澡，或許這只是他的某種生活的習慣，但看在我的眼裡，卻像極了職業革命家的派頭，晚年的王康逐漸以其深邃的思想為人所知，被譽為「民間思想家」，但我在心目中，印象最深刻的，始終是那個風塵仆仆，四處奔走的職業革命家王康。
正是在這一段時間裡，通過毛喻原和王康這樣的八九六四後孑遺在民間的火種，啓發了我的思想，推動我走上了後來的人生之路。很多年之後讀到趙越勝的《燃燈者》，我內心想，老毛和王康不就是這樣的燃燈者嗎？作為孤獨的理想主義者，從八九六四後的黑暗中一路走來，他們不會有甚麼世俗的成就，更多只是在小圈子內為人所知，但他們通過與世俗的距離，保持了某種思想的純粹，也維持了作為一名理想主義者的尊嚴，更啓發和照亮了其他人的人生。
隨著時局的變化，王康後來更多地轉向了文化運動：倡導陪都文化，組織浩氣長流畫作，也經常登上電視屏縱論文化，一生述而不作，但一路走來，保持了獨立的知識分子人格，王康無愧于我初識他時，老毛對他的「中國最後一名理想主義者」的評價，作為他的朋友，我永遠記得他對我的影響和對我的幫助，此時此刻，我既為他的去世感到悲痛，也為他的始終如初感到驕傲。老康，不必遺憾，你的人生已經足夠的完滿！
- 莫之許
Last line.

[headline - https://www.rfa.org/cantonese/news/htm/hk-chan-06012020073718.html]
在香港，財政司長陳茂波周一（6月1日）會見傳媒，談到美國制裁，陳聲稱對香港經濟「影響不大」，又指「未見顯著資金外流」，不過他發言時雙眼通紅，更全程眼泛淚光。
陳茂波重申，「港版國安法」「有助維護香港治安」，但他一邊說一邊「眼濕濕」，惹來網民議論。有網民聲稱，陳的說法是「未見顯著資金外流」而不是「未見資金外流」，這表明已有資金外流。
陳茂波在個人社交專頁解釋，事緣會議後接受記者訪問，可能講得比較「長氣」，加上面對攝影機頭的燈光，所以看似有「淚光」，他說只是一場誤會。
陳茂波說，對於要經常翻閱文件及睡眠不足的人士，眼睛保護確實十分重要，不要掉以輕心。他說，事後收到很多人問候，感謝大家關心，希望大家工作之餘多加注重休息。
Last line.

[headline - https://www.rfa.org/cantonese/news/ear/ear-state-06012020035108.html]
強國強推「香江國安法」，一石激起千重浪，此事非同小可。為了保障紅色資本在香江的利益，「國家隊」近月積極入市維穩，金股匯三路皆有異動。
數據顯示，今年以來「北水」已累計在香江股票市場掃貨2,700億港元。彭博社統計亦指，「北水」今年迄今掃貨規模為2017年有記錄以來的同期最多，現時持股總市值達到港股通股份名單總市值約2.9%，同樣是新高。
有
分析
認為，不排除是「國家隊」資金南下掃貨，務求在「港版國安法」立法及多隻中概股來港上市之際，穩定港股市場。
另一方面，港匯上周起亦應聲貶值。截至6月1日下午2時30分，港匯現貨於7.7517水平徘徊，不少港人紛紛將港幣兌換美元為將來作準備。有找換店45分鐘內已換走百萬美金，其它外幣如英鎊、日圓也是一紙不留，大多需先到分行預約才能提取現鈔。
此外，黃金市場一樣有異動。香江政府統計處4月份的黃金貿易數據顯示，4月罕有出現由強國淨流出黃金至香江，這是八年來首次出現。北京當局運送黃金到香江，或因為預防強推「港版國安法」導致金融動盪，同時不想動用外匯儲備，而是用拋售上萬黃金來「維穩」金融市場。有分析直指，北京當局可用的外匯儲備不多。
有分析指出，雖然強國持有的外匯儲備目前仍達3萬億美元，號稱世界第一，但中國外債至去年9月底已經突破2萬億美元，其捉襟見肘的困窘可見一斑。
Last line.

[date - https://www.rfa.org/cantonese/news/ear/ear-state-06012020035108.html]
https://www.rfa.org/cantonese/news/ear/ear-state-06012020035108.html/EarState.mp3

[headline - https://www.rfa.org/cantonese/news/htm/hk-innocent-06012020114634.html]
去年8月3日晚至翌日凌晨，黃大仙發生警民衝突。一名 24 歲男青年被指於警車內以頭撞傷警員。裁判官鍾明新周一方面（6月1日）裁定被告罪名不成立。法官認為，報稱受襲的警員並非誠實可靠證人。
鍾官宣判時指出，如案發經過是如警員所指，被告解開安全帶後用頭撞他，他再聯同其他警員將被告壓制在他大腿上，期間被告頭部「周圍 fing」的話，被告的頭部不可能受到如此嚴重的瘀傷及流大量鼻血，故認為警員並非誠實可靠證人。考慮到控方案情依賴警員單方面證供，認為控方舉證未能達致毫無合理疑點，裁定被告襲警罪名不成立。
Last line.

"""

if use_dummy_data_chinese:
    s = s_ch
    # Create input text file as dummy data
    with open("input.txt", "w") as f:
        f.write(s)<jupyter_output><empty_output><jupyter_text>Dummy Data - With _English_ TextSee the [regex][regex-headline-text-chinese] for extracting headline-text.[regex-headline-text-chinese]: https://regex101.com/r/HPmzia/1<jupyter_code>s_en = """
[headline - https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html]
Headline for (us-pompeo-06012020072305)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

[date - https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html]
https://www.rfa.org/cantonese/news/us-pompeo-06012020072305.html/US-Pompeo.mp3

[headline - https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html]
Headline for (tw-uk-06012020113435)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

[date - https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html]
https://www.rfa.org/cantonese/news/htm/tw-uk-06012020113435.html/tw-su.mp3

[headline - https://www.rfa.org/cantonese/news/wang-06012020103828.html]
Headline for (wang-06012020103828)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

[date - https://www.rfa.org/cantonese/news/wang-06012020103828.html]
https://www.rfa.org/cantonese/news/wang-06012020103828.html/wang.mp3

[headline - https://www.rfa.org/cantonese/news/us-wang-06012020135251.html]
Headline for (us-wang-06012020135251)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

[headline - https://www.rfa.org/cantonese/news/htm/hk-chan-06012020073718.html]
Headline for (hk-chan-06012020073718)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

[date - https://www.rfa.org/cantonese/news/ear/ear-state-06012020035108.html]
https://www.rfa.org/cantonese/news/ear/ear-state-06012020035108.html/EarState.mp3

[headline - https://www.rfa.org/cantonese/news/htm/hk-innocent-06012020114634.html]
Headline for (hk-innocent-06012020114634)
A final goodbye to <NAME> in Houston, where he will be buried.
After more than two weeks of demonstrations and anguished calls for racial justice, the man whose death gave rise to an international movement, 
and whose words — “I can’t breathe” — have become a rallying cry,  is being laid to rest on Tuesday at a private funeral in Houston.
<NAME>, 46, will be buried in a grave next to his mother.
Hundreds of mourners filled the Fountain of Praise church as the service got underway on  Tuesday, capping five days of public memorials in 
Minneapolis, North Carolina and Houston more than two weeks after his death powered sprawling protests across America.
Last line.

"""

if use_dummy_data_english:
    s = s_en
    # Create input text file as dummy data
    with open("input.txt", "w") as f:
        f.write(s)<jupyter_output><empty_output><jupyter_text>Imports<jupyter_code>import pandas as pd
import os
import re
import requests<jupyter_output><empty_output><jupyter_text>CodeThe following cells provide some custom functions to tabulate the headlines' urls, texts, urls to audio files and the names of the headlines (`source_id`).<jupyter_code>def tabulate_headlines(text="", filename="", verbose=0):
    """Tabulates the information from either a text string (text) or from the 
    text read from a file (filename) and returns a dataframe.

    Note: It was assumed that the paragraphs (headline text) will not 
    have any empty lines.

    Example:
        # Case: from text
        df = tabulate_headlines(text=s, filename="", verbose=1) 
        # Case: from a file
        df = tabulate_headlines(text="", filename="input.txt", verbose=1)
        # Case: no text and no file (should return None)
        df = tabulate_headlines(text="", filename="", verbose=1)
    """
    msg = f"No input provided. Returning {None}."
    if (not text) and (not filename):
        print(msg)
        return None # df = None
    ## Read text from input file
    if (not text) and (filename):
        # condition (not text) is equivalent to (text=="")
        with open(filename, "r") as f:
            text = f.read()  
    if text is not None:
        ## Define regex patterns for 
        #  - headline-text and corresponding source-id
        #  - headline_url
        #  - date_url
        #  - mp3_url
        #  - source_id from (headline, date and mp3)
        headline_text_pat = r"\n?\[headline - https://.*/(.*?)\.html\]\n((.*\n)+?)\n"
        headline_pat = r".*\[headline - (https://.*?\.html?)[,\]]"
        date_pat = r".*\[date - (https://.*?\.html?)[,\]]"
        mp3_pat = r".*\n(https://.*?\.html/.*?\.mp3)\s*\n"
        source_id_pat = r"https://.*/(.*?)\.html" # headline, date
        source_id_pat_mp3 = r"https://.*/(.*?).html/.*?\.mp3" # mp3

        ## Compile regex-patterns for speed
        headline_text_pat = re.compile(headline_text_pat)
        headline_pat = re.compile(headline_pat)
        date_pat = re.compile(date_pat)
        mp3_pat = re.compile(mp3_pat)
        source_id_pat = re.compile(source_id_pat)
        source_id_pat_mp3 = re.compile(source_id_pat_mp3)

        ## Extract headlines (texts)  
        #  and store in a pandas.Series object: headlines
        headline_data = headline_text_pat.findall(text + '\n[')
        headline_texts = []
        source_ids = []
        for headline in headline_data:
            source_id, headline_text = headline[0], ''.join(headline[1:-1]).strip()
            headline_texts.append(headline_text)
            source_ids.append(source_id)
        # Save as a pandas.Series object: headlines
        headlines = pd.Series(data=headline_texts, index=source_ids)

        ## Extract the urls (for headline, date, mp3)
        headline_urls = headline_pat.findall(text)
        date_urls = date_pat.findall(text)
        mp3_urls = mp3_pat.findall(text)

        ## Make temporary dataframes
        df_headline = pd.DataFrame({'headline_url': headline_urls})
        df_date = pd.DataFrame({'date_url': date_urls})
        df_mp3 = pd.DataFrame({'mp3_url': mp3_urls})

        ## Process temporary dataframes to 
        df_headline['source_id'] = (df_headline['headline_url']
                                    .str.replace(source_id_pat, r"\1", regex=True))
        df_date['source_id'] = (df_date['date_url']
                                .str.replace(source_id_pat, r"\1", regex=True))
        df_mp3['source_id'] = (df_mp3['mp3_url']
                            .str.replace(source_id_pat_mp3, r"\1", regex=True))
        df_headline.set_index('source_id', inplace=True)
        df_date.set_index('source_id', inplace=True)
        df_mp3.set_index('source_id', inplace=True)

        ## Combine headlines, dates and mp3s together
        df = pd.concat([df_headline, df_date, df_mp3], axis=1)
        df['source_id'] = df.index
        df['headline_text'] = headlines
        df.reset_index(drop=True, inplace=True)
    else:
        df = None
        print(msg)
    if verbose>0:
        print(df)
    return df<jupyter_output><empty_output><jupyter_text>Write headlines to `.txt` file and download audio files as `.mp3` files.<jupyter_code>def download_mp3(url, filename='out.mp3', output_dir=''):
    if not filename.endswith('.mp3'):
        filename += '.mp3'
    r = requests.get(url, allow_redirects=True)
    # update filename (add path if applicable)
    filename = update_filename(filename=filename, 
                               output_dir=output_dir)
    # write to mp3 file
    with open(filename, 'wb') as f:
        f.write(r.content)

def write_headline(text, filename='out.txt', output_dir=''):
    if not filename.endswith('.txt'):
        filename += '.txt'
    # update filename (add path if applicable)
    filename = update_filename(filename=filename, 
                               output_dir=output_dir)
    # write to txt file
    with open(filename, 'w') as f:
        f.write(text)

def update_filename(filename, output_dir=''):
    if output_dir:
        output_dir = makedir(path=output_dir)
        filename = os.path.join(output_dir, filename)    
    return filename

def makedir(path):
    path = os.path.abspath(path)
    if not os.path.exists(path):
        os.makedirs(path)
    return path<jupyter_output><empty_output><jupyter_text>Testing Status: PASSEDThere was a duplication issue with each headline-text, last-line. It has been fixed now as can be seen below. I had inserted a known english last line (`"Last line."`) at the end of each headline. As you can see that only one `"Last line."` gets printed.<jupyter_code>if s: df = tabulate_headlines(text=s, filename="", verbose=1)<jupyter_output>headline_url  ...                                      headline_text
0  https://www.rfa.org/cantonese/news/us-pompeo-0...  ...  過去五日，中美外交角力一日一戲碼。上周四（5月28日）中共強推「港版國安法」，翌日（5月29...
1  https://www.rfa.org/cantonese/news/htm/tw-uk-0...  ...  中國人大通過制訂「港版國安法」，被國際社會批評破壞《中英聯合聲明》的承諾。英國傳媒報道，政府...
2  https://www.rfa.org/cantonese/news/wang-060120...  ...  關注香港民主發展的北京詩人王藏，兩日前突被警方以「煽動顛覆國家政權罪」帶走，至今沒有消息。王...
3  https://www.rfa.org/cantonese/news/us-wang-060...  ...  中國獨立民間思想家王康，上周三（5 月27日）在美國維珍尼亞州，因癌症醫治無效病逝，享年70...
4  https://www.rfa.org/cantonese/news/htm/hk-chan...  ...  在香港，財政司長陳茂波周一（6月1日）會見傳媒，談到美國制裁，陳聲稱對香港經濟「影響不大」，...
5  https://www.rfa.org/cantonese/news/ear/ear-sta...  ...  強國強推「香江國安法」，一石激起千重浪，此事非同小可。為了保障紅色資本在香江的利益，「國家隊...
6  https://www.rfa.org/cantonese/news/htm/hk-inno...  ...  去年8月3日晚至翌日凌晨，黃大仙發生警民衝突。一名 24 歲男青年被指於警車內以頭撞傷警員。...

[7 rows x 5 columns]<jupyter_text>Here we print out theheadline-text blocks for each `source_id`.<jupyter_code>for i, (source_id, headline_text) in enumerate(zip(df.source_id, df.headline_text)):
    print('{}. {}:\n{}\n'.format(i, source_id, headline_text))<jupyter_output>0. us-pompeo-06012020072305:
過去五日，中美外交角力一日一戲碼。上周四（5月28日）中共強推「港版國安法」，翌日（5月29日），美國總統特朗普隨即宣布，將會取消對香港的特殊貿易待遇。到了周日（5月31日），美國國務卿蓬佩奧表示，中共將香港等同大陸的其他城市，美國已沒有理由給予香港優惠待遇。本周一（6月1日），中國外交部發言人趙立堅再回應，美方的措施嚴重干涉中國內政，破壞中美關係，必將損人害己。（方德豪/胡凱文 報道）
蓬佩奧周日在接受霍士新聞訪問時，被問及對特朗普回應中共強行實施「港版國安法」的措施時，蓬佩奧表示，中國已違反其給予香港高度自治權的承諾，並認為若香港與中國其他城市沒有分別，那麼美國也沒有理由給予香港優惠待遇。
蓬佩奧說：執行上，總統提出了我們要做的幾件事。他已要求我們檢視所有香港享受的優惠，並致力取消，因為這些不再有意義。如果中國對待香港，與對待大陸的方式一樣，那麼美國也沒有理由用不同的方式對待香港。
蓬佩奧又稱，當今的中國共產黨已與十年前不同，現在的中共有意破壞西方思想、民主與價值觀，讓美國民眾置身於險境之中。蓬佩奧指，美國將會對中共的種種行為作出回應，例如審查並取消對香港的優惠待遇，另外也將開始調查在美的中國學生與中國軍方的潛在聯繫，以及其他行動。
在北京，中國外交部發言人趙立堅在周一（1日）的記者會上回應指，美方領導人對中方的種種指責完全罔顧事實，所宣布的措施嚴重幹涉中國內政、破壞中美關係，必將損人害己，中方對此堅決反對。他又重申，香港是中國的香港，香港事務純屬中國內政。「港版國安法」目的是彌補香港特別行政區在國家安全立法方面的缺失，以便更好地貫徹「一國兩制」。
另外，趙立堅又表示，美方威脅調查在美上市的中國企業，並出台措施限制中國留學人員赴美簽證，做法嚴重違背市場競爭原則，完全違背中美兩國人民開展友好交流的願望，必將進一步損害中美經貿關係和兩國關係的社會基礎。
香港時事評論員陶傑接受本台專訪時分析指，香港被捲入中美角力的旋渦，正處於準戰爭狀態，意味著有可能觸發「第三次世界大戰」，而港人恐難逃脫變難民命運；香港知名作家李怡亦指香港年輕人的捨身抗爭價值，經已響徹世界，呼籲港人要堅持到底。
Last line.

1. tw-uk-06012020113435:
中國人大通過制訂「港版國安法」，被國際社會批評破壞《中英聯合[...]<jupyter_text>Example<jupyter_code>## Define output directory
OUTPUT_DIR_HEADLINES = 'output/headlines'
OUTPUT_DIR_AUDIO = 'output/audio'

## Extract data and tabulate as a pandas dataframe
# Case: from text
#df = tabulate_headlines(text=s, filename="", verbose=1) 
# Case: from a file
df = tabulate_headlines(text="", filename="input.txt", verbose=1)
# Case: no text and no file (should return None)
#df = tabulate_headlines(text="", filename="", verbose=1)

if df is not None:
    ## Determine target rows
    target_rows_headlines = ~df.headline_text.isna()
    target_rows_mp3 = ~df.mp3_url.isna()

    ## Write headlines to .txt files
    print('Total headlines: {}'.format(target_rows_headlines.sum()))
    _ = (df
            .loc[target_rows_headlines, ["source_id", "headline_text"]]
            .apply(lambda row: write_headline(text = row['headline_text'], 
                                            filename = row['source_id'], 
                                            output_dir=OUTPUT_DIR_HEADLINES), 
                axis=1))
    print('Writing headlines to .txt files: COMPLETE')

    ## Save audio to .mp3 files
    print('Total audio files: {}'.format(target_rows_mp3.sum()))
    _ = (df
            .loc[target_rows_mp3, ["source_id", "mp3_url"]]
            .apply(lambda row: download_mp3(url = row['mp3_url'], 
                                            filename = row['source_id'], 
                                            output_dir=OUTPUT_DIR_AUDIO), 
                axis=1))
    print('Downloading audio to .mp3 files: COMPLETE')
else:
    print(f'df = {df} ... Cannot be processed any further.')
if df is not None: display(df)<jupyter_output><empty_output><jupyter_text>Install `tree` command and view `output` directory contents<jupyter_code>!sudo apt install tree<jupyter_output>Reading package lists... Done
Building dependency tree       
Reading state information... Done
tree is already the newest version (1.7.0-5).
0 upgraded, 0 newly installed, 0 to remove and 32 not upgraded.<jupyter_text>Contents inside `output` directory<jupyter_code>!tree output -a<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11194958455424879, 'fraction_numerical': 0.03359691727210693, 'mean_word_length': 5.264520995725421, 'pattern_counts': {'":': 0, '<': 54, '<?xml version=': 0, '>': 55, 'https://': 47, 'lorem ipsum': 0, 'www.': 36, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 66, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '361086', 'license': 'MIT', 'n_tokens_mistral': 16072, 'n_tokens_neox': 17223, 'n_words': 1639, 'path': 'src/answers/Q_62273183/Q_62273183.ipynb', 'repo_name': 'sugatoray/stackoverflow', 'size': '24985'}