In this post I am sharing my experience in collecting the texts of the COVID-19 surveillance reports published daily on the Ministry of Health and Sports, Myanmar website in Myanmar language. Principally, I used the rvest package and standard tools of the R Statistical Environment including the regex functions. The idea is quite simple: (i)Identify and extract the specific URLs,(ii)read the reports from the MOHS, (iii)extract the body text of the reports, (iv)format the reports, and (v)write out the text file.
Extracting the links from the main page
library(rvest)
Loading required package: xml2
writeLines(rptURLs.Apr27, "rptURLs.Apr27_1140AM.txt", useBytes = TRUE)
From the COVID-19 page of MOHS, Myanmar, we identified the line number of URLs, 331 to 649 covering the reports we are looking for and write the URLs out to a text file for checking.
rptURLs.Apr27_331_649 <- rptURLs.Apr27[331:649]
writeLines(rptURLs.Apr27_331_649, "rptURLs.Apr27_331_649.txt", useBytes = TRUE)
Filter the links to get the reports of interest
However, when we tried using these URLs, covering April, March and February we found that we were getting this error:
“Error in open.connection(x,”rb“) : HTTP error 400.”
For that matter we tried retrieving only the reports for the month of April. April contained 53 reports of interest (as of April 27, 2020), though we later found that the reports for the dates April 1 and 2 were not readable programmatically.
“Error in open.connection(x,”rb“) : HTTP error 400.”
For that matter we tried retrieving only the reports for the month of April. April contained 53 reports of interest (as of April 27, 2020), though we later found that the reports for the dates April 1 and 2 were not readable programmatically.
From the raw URLs we tried to extract only those that were of interest using Regex with the following patterns found by inspection of the Ministry of Health and Sports COVID-19 page:
u1 <- "https://mohs.gov.mm/Main/content/new/covid-19"
u2 <- "https://mohs.gov.mm/page/"
u3 <- "https://www.mohs.gov.mm/page/"
u4 <- "https://www.mohs.gov.mm/Main/content/new/covid-19"
u5 <- "http://mohs.gov.mm/Main/content/new/covid-19"
up <- paste(c(u1,u2,u3,u4,u5), collapse = "|")
up
That didn’t work because some of the above URL-patters were also matched by reports that we were not looking for. Here, grep gives 69 URLs, correct is 53!
Use brute-force; download all links
A brute-force alternative would be to retrieve all the reports and then filter by report headings to get our reports of interest! Not pretty, but workable.
The following code gives:
Error in open.connection(x, “rb”) : HTTP error 400. Timing stopped at: 2.14 0.14 172.9
Error in open.connection(x, “rb”) : HTTP error 400. Timing stopped at: 2.14 0.14 172.9
url0 <- rptURLs.Apr27[331:426]
system.time({
M <- length(url0)-2
xvect.0 <- vector()
for (k in 1:M) {
xvect.0[k] <- url0[k] %>% read_html() %>%
html_text() %>% gsub("[\r\n]", "", .)
}
})
length(xvect.0)
By trial and error, we found that url0[94:96] were not readable, so we excluded them.
system.time({
M <- length(url0)-3
xvect.x <- vector()
for (k in 1:M) {
xvect.0[k] <- url0[k] %>% read_html() %>%
html_text() %>% gsub("[\r\n]", "", .)
}
})
user system elapsed
2.42 0.26 189.40
length(xvect.0)
[1] 93
Filter and get our reports
First we excluded the reports we were not interested. Then we extracted the body of reports:
pa01 <- "COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း|COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း"
xvect.01 <- xvect.0[grepl(pa01, xvect.0)]
s01 <- regexpr(pa01,xvect.01)
e0 <- gregexpr("\u104b",xvect.01)
e <- sapply(e0,max)
xvect.02 <- substr(xvect.01,s01,e+1)
cat(xvect.02[51])
COVID-19 ရောဂါ စောင့်ကြပ်ကြည့်ရှုမှုနှင့်ပတ်သက်၍ သတင်းထုတ်ပြန်ခြင်း (3-4-2020, 8:00 PM) ၁။ ကျန်းမာရေးနှင့်အားကစားဝန်ကြီးဌာနသည် ကမ္ဘာ့နိုင်ငံများတွင် ကူးစက်ပျံ့နှံ့လျက်ရှိသည့် COVID-19 ရောဂါ ဖြစ်ပွားမှုနှင့်ပတ်သက်၍ ရောဂါစောင့်ကြပ်ကြည့်ရှုခြင်း၊ ရောဂါ ရှာဖွေ၍ ထိရောက်စွာကုသမှုပေးခြင်း၊ ရောဂါပိုးတွေ့ရှိသူများနှင့် ထိတွေ့မှုရှိခဲ့သူများအား ရှာဖွေဖော်ထုတ်၍ အသွားအလာကန့်သတ်ခြင်း၊ လိုအပ်ပါက ဆေးရုံတက်ရောက်ကုသမှု ခံယူနိုင်စေရေး ဆောင်ရွက် ခြင်း၊ ပြည်ပနိုင်ငံများမှ ပြန်လည်ဝင်ရောက်လာသူများအား သက်ဆိုင်ရာ ဒေသအာဏာပိုင်အဖွဲ့များ၊ အခြားဌာနဆိုင်ရာများနှင့် ချိတ်ဆက်၍သတင်းရယူခြင်း၊ အသွားအလာ ကန့်သတ်ခြင်းလုပ်ငန်းများ ဆောင်ရွက်ခြင်း၊ COVID-19 ရောဂါနှင့်ပတ်သက်၍ ပြည်သူလူထုမှ သတင်းမှန်များ ရရှိနိုင်ရေး အတွက် နေ့စဉ်သတင်းထုတ်ပြန်ခြင်း လုပ်ငန်းများအား အရှိန်အဟုန်မြှင့် ဆောင်ရွက်လျက်ရှိပါသည်။ ၂။ (၂-၄-၂၀၂၀) ရက်နေ့၊ ညနေ (၆) နာရီမှ (၃-၄-၂၀၂၀) ရက်နေ့၊ ညနေ (၆) နာရီအထိ စောင့်ကြည့်လူနာအသစ် (၄၆) ဦး ရှိပါသည်။ ၃။ အမျိုးသားကျန်းမာရေးဓာတ်ခွဲမှုဆိုင်ရာဌာန (ရန်ကုန်) မှ (၃-၄-၂၀၂၀) ရက်နေ့ ဓာတ်ခွဲစစ်ဆေးမှုအဖြေများအရ စောင့်ကြည့်လူနာနှင့် ဆေးရုံ (သို့မဟုတ်) အိမ်တွင် အသွားအလာကန့်သတ်၍ စောင့်ကြပ်ကြည့်ရှုမှုခံယူနေသူ (၅၅) ဦး၏ ဓာတ်ခွဲနမူနာများအား စစ်ဆေးခဲ့ရာ အားလုံး၏ ဓာတ်ခွဲအဖြေများတွင် COVID-19 ရောဂါပိုး မရှိကြောင်း (မရှိကြောင်း) တွေ့ရှိရပါသည်။ ၄။ COVID-19 ရောဂါ ဓာတ်ခွဲအတည်ပြုလူနာ (၁၉) ဦးအနက် ချင်းပြည်နယ်၊ တီးတိန်ပြည်သူ့ ဆေးရုံတွင် လူနာ (၁) ဦး၊ ရန်ကုန်မြို့၊ ဝေဘာဂီအထူးကုဆေးရုံကြီးတွင် လူနာ (၉) ဦး နှင့် မန္တလေး မြို့၊ ကန်တော်နဒီဆေးရုံတွင် လူနာ (၁) ဦး၊ နေပြည်တော်ပြည်သူ့ဆေးရုံကြီးတွင် လူနာ (၁) ဦး၊ ရှမ်းပြည်နယ် (မြောက်ပိုင်း)၊ ပြည်သူ့ဆေးရုံကြီး၊ လားရှိုးမြို့တွင် ကျောက်မဲမြို့ ပြည်သူ့ဆေးရုံမှ ပြောင်းရွှေ့လူနာ (၁) ဦး၊ ပဲခူးတိုင်းဒေသကြီး၊ ပြည်သူ့ဆေးရုံကြီး၊ ပြည်မြို့တွင် ပြည်သူ့ဆေးရုံ၊ ပေါက်ခေါင်းမြို့မှ ပြောင်းရွှေ့လူနာ (၄) ဦး၊ စုစုပေါင်း (၁၇) ဦးတို့၏ ကျန်းမာရေးအခြေအနေမှာ တည်ငြိမ်လျက်ရှိပါသည်။ ဝေဘာဂီအထူးကုဆေးရုံကြီးရှိ လူနာ (၂) ဦးအား အထူးကြပ်မတ်ခန်း၌ သီးခြားထားရှိဆေးကုသမှု ပေးလျက်ရှိပါသည်။ ၅။ ယခုအခါ (၂၃-၃-၂၀၂၀) ရက်နေ့မှ (၃-၄-၂၀၂၀) ရက်နေ့အထိ မြန်မာနိုင်ငံတွင် COVID-19 ရောဂါ ဓာတ်ခွဲအတည်ပြုလူနာ (၂၀) ဦး တွေ့ရှိလာရပြီဖြစ်ပါသည်။ သို့ဖြစ်ပါ၍ ပြည်သူများ အနေဖြင့် ကျန်းမာရေးနှင့်အားကစားဝန်ကြီးဌာနမှ ထုတ်ပြန်ထားသော ရောဂါကာကွယ် ရေးဆိုင်ရာ ကျန်းမာရေးပညာပေးအချက်အလက်များအား တိကျစွာလိုက်နာ ဆောင်ရွက်ခြင်းဖြင့် မိမိသာမက မိမိ၏ မိသားစုနှင့်ပတ်ဝန်းကျင်မှ လူများအတွက်ပါ ရောဂါကူးစက်မှုမရှိစေရေး ပူးပေါင်း ဆောင်ရွက် ပေးနိုင်ကြပါရန် နှိုးဆော်အပ်ပါသည်။
Need for correct order of code points
For the filter above, I used the pattern:
pa01 <- "COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း"
However, the result failed to include two reports for “April 20, 8:00 PM and April 20, 10:00 AM”. After a lot of frustrations I found out that those two were using:
"COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း"
And they looked exactly the same.
But when you compare them, it turns out that they are not identical.
But when you compare them, it turns out that they are not identical.
"COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း" == "COVID-19.+စောင့်ကြပ်ကြည့်ရှုမှု.+သတင်းထုတ်ပြန်ခြင်း"
[1] FALSE
If you look at the codes, you’ll see why!
[1] "COVID-19.+စောင့\u103aက\u103cပ\u103aက\u103cည့\u103aရ\u103eုမ\u103eု.+သတင\u103aးထုတ\u103aပ\u103cန\u103aခ\u103cင\u103aး"
[2] "COVID-19.+စောင\u103a့က\u103cပ\u103aက\u103cည\u103a့ရ\u103eုမ\u103eု.+သတင\u103aးထုတ\u103aပ\u103cန\u103aခ\u103cင\u103aး"
Create a dataframe for convenience
For convenience the results were collected in a dataframe.
We created a dataframe with title in first column and report text in the second column. For printing out the results to a text file, a third column combining the last two was created.
We created a dataframe with title in first column and report text in the second column. For printing out the results to a text file, a third column combining the last two was created.
xM <- data.frame(stringr::str_split_fixed(xvect.02,"\\)",2),stringsAsFactors = FALSE)
xM[,1] <- paste0(xM[,1],")")
xM$xout <- paste0(xM[,1],"\n", trimws(xM[,2]),"\n")