使用str_locate时遇到“正则表达式模式语法错误”

sd2nnvve  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(256)

我在str_locate语法方面遇到一些问题,如下所示:

library(stringr)
library(rvest)
library(dplyr)
library(stringi)
library(readr)
library(readstata13)
list.mst = read.dta13("mst.dta")
list.mst = list.mst$ma_thue
link.source = 'https://infodoanhnghiep.com/tim-kiem/ma-so-thue/'
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
info = c()
for (mst in list.mst) {
  link = paste0(link.source, mst,'/')
  message(link)
  search.result = read_html(link) 
  all.com.link = search.result %>% html_nodes(".company-name a") %>% html_attr('href') %>% unique()
  for (com.link in all.com.link) {
    com.page = read_html(paste0("https:",com.link))
    com.info = com.page %>% html_nodes(xpath = '//*[@id="left-content"]/div[2]/div[2]/div[1]') %>% html_text()
    com.name = str_sub(com.info, 
                       start = str_locate(com.info, pattern = "Tên doanh nghi???p:")[2]+1,
                       end = str_locate(com.info, pattern = "Mã s??? thu???:")[1]-1)
    com.mst <- str_sub(com.info, 
                       start = str_locate(com.info, pattern = "Mã s??? thu???:")[2]+1,
                       end = str_locate(com.info, pattern = "Tình tr???ng ho???t ")[1]-1)
    com.active = str_sub(com.info, 
                         start = str_locate(com.info, pattern = "Tình tr???ng ho???t ")[2]+1+5,
                         end = str_locate(com.info, pattern = "ký qu???n lý:")[1]-1-9)
    com.add = str_sub(com.info, 
                      start = str_locate(com.info, pattern = "???a ch???:")[2]+1,
                      end = str_locate(com.info, pattern = "i???n tho???i:")[1]-1-1)
    com.tel = str_sub(com.info, 
                      start = str_locate(com.info, pattern = "i???n tho???i:")[2] +1,
                      end = str_locate(com.info, pattern = "???i di???n pháp lu???t:")[1]-1-1)
    com.cap.phep = str_sub(com.info, 
                           start = str_locate(com.info, pattern = "Ngày c???p gi???y phép:")[2]+1,
                           end = str_locate(com.info, pattern = "Ngày b???t ")[1]-1)
    com.hoat.dong = str_sub(com.info, 
                            start = str_locate(com.info, pattern = "Ngày b???t ")[2]+1+14,
                            end = str_locate(com.info, pattern = "Ngày nh???n TK:")[1]-1)
    com.nganh2 =     str_sub(com.info, 
                             start = str_locate(com.info, pattern = "Ngành ngh??? kinh doanh:")[2])
    com.nganh = str_sub(com.info, 
                        start = str_locate(com.info, pattern = "Ngành ngh??? kinh doanh:")[2] +1)
    info= rbind(info, t(c(com.name, com.mst, com.active, com.add, com.tel, com.cap.phep, com.hoat.dong,com.nganh)))
    info = trim(info)
  }
}

https://infodoanhnghiep.com/tim-kiem/ma-so-thue/0100111338/
Error in stri_locate_first_regex(string, pattern, opts_regex = opts(pattern)) : 
Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=`//Tên doanh nghi???p:`)

下面是我的示例数据集:link
我真的不知道我的代码有什么问题,所以我真的很感谢任何建议给我. upom看到越南语短语没有读R正确,我试图逃避它,但无济于事.谢谢大家!!!

5vf7fwbs

5vf7fwbs1#

正如注解中所指出的,这个特定的错误似乎是由某种字符编码问题触发的,并且没有足够的信息来重现或调试这个错误。

  • BUT * 实际上没有必要通过子字符串来解决这个问题,因为每个描述和值都放在自己的元素中。由于这些表中的行数可能会变化,缺失的值将在结果数据集中引入NA值。

下面的示例替换了所讨论的内部循环,并使用固定的URL集作为示例;值描述取自表的第一列,然后用 * janitor * 清除。

library(rvest)
library(purrr)
library(janitor)
all.com.link_example <- c("https://infodoanhnghiep.com/thong-tin/Cong-Ty-Co-Phan-My-Thuat-Trung-uong-11338.html",
                          "https://infodoanhnghiep.com/thong-tin/Cong-ty-TNHH-hoi-cho-trien-lam-quoc-te-Thang-Long-11338-003.html",
                          "https://infodoanhnghiep.com/thong-tin/Chi-Nhanh-Cty-My-Thuat-TW-11338-001.html")

info <- map(all.com.link_example,
    \(url) {
      html <- read_html(url)
      info <- html_element(html, ".company-info .description") %>% html_text2()
      # each cell in the 2-column table
      html_elements(html, ".mt-20 .responsive-table-cell") %>% 
      html_text2() %>% 
      # as 2-coumn matrix, same shape and structure as table
      matrix(ncol = 2, byrow = TRUE) %>% 
      # add infor row to matrix
      rbind(c("info", info))
      }) %>% 
  # m[,1] - description column 
  # m[,2] - value column
  # make safe column names from 2nd column, apply those to values vector
  # map_dfr turns each such list into tibble row retunrs single tribble
  map_dfr(\(m) set_names(m[,2], make_clean_names(m[,1])))

结果:

info
#> # A tibble: 3 × 17
#>   ten_doanh_ng…¹ ten_g…² ma_so…³ tinh_…⁴ noi_d…⁵ dia_chi dien_…⁶ dai_d…⁷ giam_…⁸
#>   <chr>          <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
#> 1 CÔNG TY CỔ PH… CEFINA… 010011… Đang h… Cục Th… Số 66,… 043844… "\r Ng… Cao Ho…
#> 2 Công ty TNHH … <NA>    010011… Doanh … Cục Th… Số 1 G… <NA>    "\r Võ… Võ Viế…
#> 3 Chi Nhánh Cty… <NA>    010011… Doanh … Cục Th… 371/13… <NA>    "\r Đi… Chu Vă…
#> # … with 8 more variables: ngay_cap_giay_phep <chr>,
#> #   ngay_bat_dau_hoat_dong <chr>, ngay_nhan_tk <chr>, nam_tai_chinh <chr>,
#> #   so_lao_dong <chr>, cap_chuong_loai_khoan <chr>, tk_ngan_hang <chr>,
#> #   info <chr>, and abbreviated variable names ¹​ten_doanh_nghiep,
#> #   ²​ten_giao_dich, ³​ma_so_thue, ⁴​tinh_trang_hoat_dong, ⁵​noi_dang_ky_quan_ly,
#> #   ⁶​dien_thoai, ⁷​dai_dien_phap_luat, ⁸​giam_doc

tibble::glimpse(info)
#> Rows: 3
#> Columns: 17
#> $ ten_doanh_nghiep       <chr> "CÔNG TY CỔ PHẦN MỸ THUẬT TRUNG ƯƠNG", "Công ty…
#> $ ten_giao_dich          <chr> "CEFINAR., JSC", NA, NA
#> $ ma_so_thue             <chr> "0100111338", "0100111338-003", "0100111338-001"
#> $ tinh_trang_hoat_dong   <chr> "Đang hoạt động (đã được cấp GCN ĐKT)", "Doanh …
#> $ noi_dang_ky_quan_ly    <chr> "Cục Thuế Thành phố Hà Nội", "Cục Thuế Thành ph…
#> $ dia_chi                <chr> "Số 66, ngõ Núi Trúc, phố Núi Trúc, Phường Kim …
#> $ dien_thoai             <chr> "0438444555", NA, NA
#> $ dai_dien_phap_luat     <chr> "\r Nguyễn Minh Vũ\r", "\r Võ Viết Lượng\r", "\…
#> $ giam_doc               <chr> "Cao Hoàng Dương", "Võ Viết Lượng", "Chu Văn Hả…
#> $ ngay_cap_giay_phep     <chr> "22/05/1998", "08/04/2002", "21/12/1998"
#> $ ngay_bat_dau_hoat_dong <chr> "10/03/1993", "01/01/2002", "31/05/1993"
#> $ ngay_nhan_tk           <chr> "15/03/2004", "02/04/2002", "28/05/1998"
#> $ nam_tai_chinh          <chr> "2000", "2002", "1998"
#> $ so_lao_dong            <chr> "107", "10", "5"
#> $ cap_chuong_loai_khoan  <chr> "025-194", "1-025-550-554", "1-025-430-459"
#> $ tk_ngan_hang           <chr> "\r Mã số thuế: 0100111338\nTên giao dịch: CEFI…
#> $ info                   <chr> "\r\n\nCông Ty Cổ Phần Mỹ Thuật Trung Ương có m…

创建于2023年2月20日,使用reprex v2.0.2

相关问题