{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import library\n",
    "import urllib\n",
    "import requests\n",
    "import bs4\n",
    "import pandas as pd\n",
    "import re"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# request a link\n",
    "def request_url(link):\n",
    "    response = requests.get(link)\n",
    "    html = response.text\n",
    "    return html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to parse html\n",
    "def parse_html(to_parse):\n",
    "    soup = bs4.BeautifulSoup(to_parse, 'html.parser')\n",
    "    return soup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#take sub menu news form kompas.com\n",
    "def all_section(main_url):\n",
    "    section_list = []\n",
    "    for i in main_url:\n",
    "        soup = parse_html(request_url(i))\n",
    "        for h3 in soup.find_all(class_=\"article__title article__title--medium\"):\n",
    "            section_list.append(h3.a.get('href'))\n",
    "    return section_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#get only link about corona or covid\n",
    "def find_corona(main_url):\n",
    "    url_list = []\n",
    "    not_news=[]\n",
    "    for i in main_url:\n",
    "        if i.find('corona')!=-1 or i.find('covid')!=-1 or i.find('pandemi')!=-1 or i.find('psbb')!=-1:\n",
    "            url_list.append(i)\n",
    "    url_list = list(dict.fromkeys(url_list))\n",
    "    for i in url_list:\n",
    "        if (i.find('read') == -1):\n",
    "            not_news.append(i)       \n",
    "    for j in not_news:\n",
    "        url_list.remove(j)\n",
    "    return url_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#take all article pages from urls\n",
    "def all_pages(main_url):\n",
    "    all_pages_articles = []\n",
    "    for page in main_url:\n",
    "        soup = parse_html(request_url(page))\n",
    "        div_class =  soup.find_all(\"div\", class_=\"col-bs12-8 col-offset-0\")\n",
    "        #print(page, div_class)\n",
    "        if (div_class == []):\n",
    "            all_pages_articles.append(page)\n",
    "        else :\n",
    "            for i in div_class:\n",
    "                url_class =  i.find_all(\"div\", class_=\"paging__item\")\n",
    "                for j in url_class:\n",
    "                    a_class =  j.find_all(\"a\", class_=\"paging__link\")\n",
    "                    for k in a_class:\n",
    "                        #print(k.get('href'))\n",
    "                        all_pages_articles.append(k.get('href'))\n",
    "    return all_pages_articles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def writer(main_url):\n",
    "    author = []\n",
    "    for i in main_url:\n",
    "        a = parse_html(request_url(i)) \n",
    "        b = a.find(\"div\", class_ = \"read__credit__item\", id = \"penulis\")\n",
    "        if b:\n",
    "            c = b.find(\"a\")\n",
    "            author.append(c.text)\n",
    "        else:\n",
    "            d = a.find(\"div\", class_ = \"read__credit__item\")\n",
    "            author.append(d.text)\n",
    "    return author"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def title(main_url):\n",
    "    titles = []\n",
    "    for i in main_url:\n",
    "        a = parse_html(request_url(i)) \n",
    "        b = a.find(\"h1\", class_ = \"read__title\").text\n",
    "        titles.append(b)\n",
    "    return titles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def date(main_url):\n",
    "    dates = []\n",
    "    for i in main_url:\n",
    "        a = parse_html(request_url(i)) \n",
    "        b = a.find(\"div\", class_ = \"read__time\").text\n",
    "        c = re.sub(\"Kompas.com - \", \"\", b)\n",
    "        dates.append(c)\n",
    "    return dates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "def collect_text(main_url, titles = [], author = [], dates = []):\n",
    "    news = []\n",
    "    paragraf = []\n",
    "    data = []\n",
    "    join =[]\n",
    "    isiteks = []\n",
    "    penulis = []\n",
    "    #collect all text with tag <p> from articles    \n",
    "    for i in main_url:\n",
    "        a = parse_html(request_url(i))       \n",
    "        for k in range(0, len(a.findAll('p'))):\n",
    "            newparagraf = a.find_all('p')[k].text\n",
    "            paragraf.append(newparagraf)\n",
    "        data.append(paragraf)\n",
    "        paragraf = []\n",
    "    for i in data:\n",
    "        join.append(' '.join(i))\n",
    "    \n",
    "    for i in main_url:\n",
    "        news_title = \"Kompas.com\"\n",
    "        news.append(news_title)\n",
    "        \n",
    "    #collect articles and urls in one variable  \n",
    "    for i, j in enumerate(main_url):\n",
    "        isiteks.append({'news' : news[i], 'link' : j, 'title' : titles[i], 'author' : author[i], 'date_time' : dates[i], 'paragraf' : join[i] })\n",
    "    return isiteks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_news(main_url, file_name = ''):\n",
    "    section = all_section(main_url)\n",
    "    corona = find_corona(section)\n",
    "    all_page = all_pages(corona)\n",
    "    titles = title(all_page)\n",
    "    author = writer(all_page)\n",
    "    dates = date(all_page)\n",
    "    text = collect_text(all_page, titles, author, dates)\n",
    "    print(text)\n",
    "    file = save_file(text, file_name)\n",
    "    \n",
    "    return file "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save_file(file, file_name = ''):\n",
    "    new_file = pd.DataFrame(file, columns=['news','link','title', 'author', 'date_time', 'paragraf'])\n",
    "    new_file.to_csv(file_name + '.csv', index=True, encoding='utf-8', sep = ',')\n",
    "    \n",
    "    return new_file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "main_url = ['https://megapolitan.kompas.com/']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{'news': 'Kompas.com', 'link': 'https://megapolitan.kompas.com/read/2020/05/04/20321891/antisipasi-menyebarnya-covid-19-di-kepulauan-seribu-pemkab-berencana-ubah', 'title': 'Antisipasi Menyebarnya Covid-19 di Kepulauan Seribu, Pemkab Berencana Ubah Pulau Sebaru Jadi Rumah Sakit', 'author': 'Jimmy Ramadhan Azhari', 'date_time': '04/05/2020, 20:32 WIB', 'paragraf': 'Antisipasi Menyebarnya Covid-19 di Kepulauan Seribu, Pemkab Berencana Ubah Pulau Sebaru Jadi Rumah Sakit  JAKARTA, KOMPAS.com - Pemerintah Kabupaten Kepulauan Seribu berencana mengubah  Pulau Sebaru yang biasanya dijadikan sebagai tempat observasi menjadi rumah sakit Covid-19.  Wakil Bupati Kepulauan Seribu Junaedi mengatakan, rencana pengubahan fungsi itu dilakukan jika wabah di sana semakin meluas.  \"Pulau Sebaru bukan tempat observasi lagi, tapi rencana akan dijadikan semacam rumah sakit apabila terjadi skala buruk Pandemi Covid 19 di Kepulauan Seribu,\" kata Junaedi saat dihubungi Kompas.com, Senin (4/5/2020). Baca juga: Pemprov DKI Laporkan Rencana Pembatasan Warga yang Masuk Jakarta Usai Lebaran ke Kemenhub  Junaedi mengatakan, pulau tersebut terbilang layak dijadikan sebagai tempat isolasi pasien karena pernah jadi tempat observasi WNI ABK World Dream beberapa waktu lalu.\\xa0 Bahkan pengelola fasilitas observasi tersebut juga telah menyatakan kesiapannya jika memang skema terburuk itu diberlakukan.  Junaedi mengatakan, pemerintah hanya perlu menyediakan tenaga medis dan hal-hal kecil terkait teknis apabila ingin mengubah pulau itu jadi rumah sakit Covid-19.  Adapun saat ini, Pemkab Kepulauan Seribu juga telah menyediakan tempat isolasi pasien dengan kategori orang tanpa gejala (OTG) di masing-masing pulau. Baca juga: Kronologi Tertularnya 10 Pasien Positif Covid-19 di Kepulauan Seribu  \"Upaya yang sudah dilakukan Gugus Tugas menyedian 39 tempat karantina/isolasi di 12 Pulau. Tempatnya sekolahan, GOR, SKKT. Dan sudah dilengkapi oleh velbed di setiap lokasi karantina,\" ucap Junaedi.  Adapun saat ini, sebanyak 10 orang warga Pulau Tidung telah dinyatakan Positif Covid-19.  Sembilan di antaranya berasal dari Pulai Tidung yang merupakan cluster dan subcluster dari Tabligh Akbar Kebon Jeruk, Jakarta Barat.  Sementara satu pasien lainnya berasal dari Pulau Kelapa yang juga terinfeksi di daratan Jakarta.'}, {'news': 'Kompas.com', 'link': 'https://megapolitan.kompas.com/read/2020/05/04/20282811/kasus-covid-19-stagnan-tiga-hari-walkot-bekasi-klaim-psbb-tahap-kedua', 'title': 'Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekasi Klaim PSBB Tahap Kedua Buahkan Hasil', 'author': 'Cynthia Lova', 'date_time': '04/05/2020, 20:28 WIB', 'paragraf': 'Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekasi Klaim PSBB Tahap Kedua Buahkan Hasil  BEKASI, KOMPAS.com - Wali Kota  Bekasi Rahmat Effendi mengklaim bahwa penerapan pembatasan sosial berskala besar (PSBB) tahap kedua di Kota Patriot mulai membuahkan hasil.  Adapun PSBB tahap kedua sudah mulai berjalan sejak 29 April hingga 12 Mei 2020 mendatang.  Hal itu diungkapkan pria dengan sapaan akrab  Pepen setelah kasus  Covid-19 di Kota Bekasi mulai stagnan atau tak terjadi pertambahan kasus pada tiga hari belakangan, yakni sejak 2 hingga 4 Mei 2020.  “Dari 28 April sudah mulai menurun. Nah ini ODP, PDP, dan positif kita lihat, dari tanggal 2 Mei sudah nol penambahannya. Artinya PSBB kita tahap kedua ini dengan bagitu masifnya pencegahan sudah mulai membuahkan hasil. Yang positifnya lihat, sama betul (jumlahnya),” ujar Rahmat di Kota Bekasi, Senin (4/5/2020). Baca juga: Pemkot Bekasi Siapkan 300 Alat Tes Swab bagi Penumpang KRL di Stasiun Bekasi, Besok  Rahmat berujar, berbagai upaya penegakan aturan PSBB tahap kedua diklaim mampu menurunkan angka Covid-19 di Kota Bekasi tiga hari belakangan ini.  Mulai dari rutin memberikan peringatan kepada warga yang masih berkeliaran ataupun masih nongkrong di warung makan atau di pinggir jalan hingga adanya penjagaan di 32 titik check point.  “Alhamdulillah, tidak ada penambahan kasus. Tiga hari ini kelandaian luar biasa, mudah-mudahan sisa delapan hari ini landainya.\" \"Namun kita berdoa saja, minggu ini terjadi penurunan, artinya apa yang selama sudah kita lakukan, kita sudah ke streching sedemikian rupa mudah-mudahan hasilnya nyata,” kata Pepen. Baca juga: Data Penambahan Kasus Covid-19 di Bekasi Hari ke Hari Selama PSBB  Adapun berdasarkan data website corona.bekasikota.go.id, mulai 2 Mei hingga 4 Mei 2020 tak ada peningkatan kasus.  Adapun saat ini tercatat ada 249 kasus positif Covid. Dari 249 kasus positif Covid-19, ada 114 yang sembuh.  Lalu, ada 2.023 yang masih dalam pemantauan. Dari 2.023 ODP, ada 1.511 yang sehat dan 512 orang masih pemantauan.  Kemudian, PDP ada 800 orang. Dari 800 orang PDP, ada 344 orang usai diawasi dan 355 orang masih diawasi.'}, {'news': 'Kompas.com', 'link': 'https://megapolitan.kompas.com/read/2020/05/04/19324561/kronologi-tertularnya-10-pasien-positif-covid-19-di-kepulauan-seribu?page=1', 'title': 'Kronologi Tertularnya 10 Pasien Positif Covid-19 di Kepulauan Seribu', 'author': 'Jimmy Ramadhan Azhari', 'date_time': '04/05/2020, 19:32 WIB', 'paragraf': 'Kronologi Tertularnya 10 Pasien Positif Covid-19 di Kepulauan Seribu  JAKARTA, KOMPAS.com - Hingga hari ini, sudah ada 10 warga Kabupaten  Kepulauan Seribu yang dinyatakan positif  Covid-19. Wakil Bupati Kepulauan Seribu Junaedi mengatakan, 10 warga yang terpapar Covid-19 itu berasal dari dua pulau yang berbeda. \"Sembilan dari  Pulau Tidung, yang satu dari  Pulau Kelapa,\" kata Junaedi saat dihubungi Kompas.com, Senin (4/5/2020). Baca juga: Terindikasi Positif karena Kontak dengan Pasien Covid-19, 8 Warga Kepulauan Seribu Diisolasi  Ia kemudian menjelaskan bahwa sembilan orang yang terpapar di Pulau Tidung bermula dari penularan oleh dua orang yang mengikuti tabligh akbar di Kebon Jeruk, Jakarta Barat.  Sebelum dinyatakan positif Covid-19, keduanya sempat pulang ke Pulau Tidung dan berkontak dengan kerabatnya di sana.  Namun, setelah beberapa orang jemaah tabligh akbar Kebon Jeruk dinyatakan positif Covid-19, keduanya pun diisolasi ke RSD Wisma Atlet Kemayoran dan menjalani swab test.  Baca juga: Berkontak dengan Pasien Positif Covid-19, 38 Warga Pulau Tidung Jalani Tes Swab  Kemudiam, pada 21 April 2020 lalu dikonfirmasi bahwa pasien tersebut dinyatakan positif Covid-19.  Pemerintah setempat kemudian melakukan swab test pada keluarga dan kerabat yang sempat kontak dengan kedua pasien positif tersebut  \"Sabtu (25/4/2020) didapatkan tujuh orang positif terkonfirmasi Covid-19 dikarantina di Wisma Atlet,\" ucap Junaedi.  Sementara, untuk pasien positif Covid-19 dari Pulau Kelapa, yang bersangkutan dinyatakan positif Covid-19 setelah sebelumnya membesuk menantunya di daratan Jakarta.  Baca juga: Masih Banyak Pemuda Nongkrong di Dermaga Kepulauan Seribu Saat PSBB'}, {'news': 'Kompas.com', 'link': 'https://megapolitan.kompas.com/read/2020/05/04/19324561/kronologi-tertularnya-10-pasien-positif-covid-19-di-kepulauan-seribu?page=2', 'title': 'Kronologi Tertularnya 10 Pasien Positif Covid-19 di Kepulauan Seribu', 'author': 'Jimmy Ramadhan Azhari', 'date_time': '04/05/2020, 19:32 WIB', 'paragraf': 'Kronologi Tertularnya 10 Pasien Positif Covid-19 di Kepulauan Seribu  Satu orang tersebut saat ini sedang dirawat di RSUD Koja, Jakarta Utara.   Menurut Junaedi, warga tersebut tidak sempat kembali ke  Pulau Kelapa sebelum dinyatakan positif  Covid-19.  Namun, pihak Puskesmas masih menelusuri riwayat perjalanan warga tersebut.  Adapun pasien positif Covid-19 di Jakarta mencapai 4.472 orang hingga Senin (4/5/2020) ini.  Jumlah pasien yang terinfeksi virus  corona tipe 2 (SARS-CoV-2) itu bertambah 55 orang dibandingkan data terakhir pada kemarin, yakni 4.417 pasien.  Kepala Dinas Kesehatan DKI Jakarta Widyastuti mengatakan, dari total pasien, 650 orang dinyatakan sembuh.'}]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>news</th>\n",
       "      <th>link</th>\n",
       "      <th>title</th>\n",
       "      <th>author</th>\n",
       "      <th>date_time</th>\n",
       "      <th>paragraf</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Kompas.com</td>\n",
       "      <td>https://megapolitan.kompas.com/read/2020/05/04...</td>\n",
       "      <td>Antisipasi Menyebarnya Covid-19 di Kepulauan S...</td>\n",
       "      <td>Jimmy Ramadhan Azhari</td>\n",
       "      <td>04/05/2020, 20:32 WIB</td>\n",
       "      <td>Antisipasi Menyebarnya Covid-19 di Kepulauan S...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Kompas.com</td>\n",
       "      <td>https://megapolitan.kompas.com/read/2020/05/04...</td>\n",
       "      <td>Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekas...</td>\n",
       "      <td>Cynthia Lova</td>\n",
       "      <td>04/05/2020, 20:28 WIB</td>\n",
       "      <td>Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekas...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Kompas.com</td>\n",
       "      <td>https://megapolitan.kompas.com/read/2020/05/04...</td>\n",
       "      <td>Kronologi Tertularnya 10 Pasien Positif Covid-...</td>\n",
       "      <td>Jimmy Ramadhan Azhari</td>\n",
       "      <td>04/05/2020, 19:32 WIB</td>\n",
       "      <td>Kronologi Tertularnya 10 Pasien Positif Covid-...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Kompas.com</td>\n",
       "      <td>https://megapolitan.kompas.com/read/2020/05/04...</td>\n",
       "      <td>Kronologi Tertularnya 10 Pasien Positif Covid-...</td>\n",
       "      <td>Jimmy Ramadhan Azhari</td>\n",
       "      <td>04/05/2020, 19:32 WIB</td>\n",
       "      <td>Kronologi Tertularnya 10 Pasien Positif Covid-...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         news                                               link  \\\n",
       "0  Kompas.com  https://megapolitan.kompas.com/read/2020/05/04...   \n",
       "1  Kompas.com  https://megapolitan.kompas.com/read/2020/05/04...   \n",
       "2  Kompas.com  https://megapolitan.kompas.com/read/2020/05/04...   \n",
       "3  Kompas.com  https://megapolitan.kompas.com/read/2020/05/04...   \n",
       "\n",
       "                                               title                 author  \\\n",
       "0  Antisipasi Menyebarnya Covid-19 di Kepulauan S...  Jimmy Ramadhan Azhari   \n",
       "1  Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekas...           Cynthia Lova   \n",
       "2  Kronologi Tertularnya 10 Pasien Positif Covid-...  Jimmy Ramadhan Azhari   \n",
       "3  Kronologi Tertularnya 10 Pasien Positif Covid-...  Jimmy Ramadhan Azhari   \n",
       "\n",
       "               date_time                                           paragraf  \n",
       "0  04/05/2020, 20:32 WIB  Antisipasi Menyebarnya Covid-19 di Kepulauan S...  \n",
       "1  04/05/2020, 20:28 WIB  Kasus Covid-19 Stagnan Tiga Hari, Walkot Bekas...  \n",
       "2  04/05/2020, 19:32 WIB  Kronologi Tertularnya 10 Pasien Positif Covid-...  \n",
       "3  04/05/2020, 19:32 WIB  Kronologi Tertularnya 10 Pasien Positif Covid-...  "
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r = get_news(main_url, \"news_2\")\n",
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xml.etree.cElementTree as ET\n",
    "def save_file_xml(file):\n",
    "    \n",
    "    data = pd.DataFrame(file, columns=['news','link','title', 'author', 'date_time', 'paragraf'])\n",
    "\n",
    "    root = ET.Element(\"COLLECTION\")\n",
    "    for i in range(len(data)):\n",
    "        news = ET.SubElement(root, \"NEWS\").text = data['news'][i]\n",
    "        id_news = ET.SubElement(news, \"ID\").text = str(i+1)\n",
    "        link = ET.SubElement(news, \"LINK\").text = data['link'][i]\n",
    "        title = ET.SubElement(news, \"TITLE\").text = data['title'][i]\n",
    "        author  =ET.SubElement(news, \"AUTHOR\").text = data['author'][i]\n",
    "        datetime = ET.SubElement(news, \"DATETIME\").text = data['date_time'][i]\n",
    "        paragraf = ET.SubElement(news, \"PARAGRAPH\").text = data['paragraf'][i]\n",
    "    \n",
    "    tree = ET.ElementTree(root)\n",
    "    save = tree.write(\"kompas.xml\")\n",
    "    return save"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}