【问题标题】:Webscraping Table网页抓取表
【发布时间】:2021-04-08 01:09:34
【问题描述】:

我正在尝试从以下页面 (https://www.coya.com/bike/fahrrad-index-2019) 抓取表格,即 50 个德国城市的自行车指数值(如果您单击“Alle Ergebnisse +”,您将看到所有 50 个城市。

我特别需要一些专栏(“Bewertung spezielle Radwege & Qualität der Radwege”、“Investitionen & QUAlität der Infrastruktur”、“Bewertung der Infrastruktur”、“Fahrradsharing-Score”、“Autofreier Tag”、“Critical-Mass-Fahrrad -aktionen,“事件分数)。

这是我尝试过的:

library(rvest)
num_link="https://www.coya.com/bike/fahrrad-index-2019"
num_page= read_html(num_link)
xyc= num_page %>% html_nodes("._1200:nth-child(2)") %>% html_text()

我尝试了 Selectorgadget,不幸的是,我在一个长字符串中获得了表的所有值(str_split 具有挑战性,因为数字中的逗号与数字之间的逗号混合在一起:

      "[1] "Ergebnisse für DeutschlandKriminalitätInfrastrukturFahrrad-SharingEvents#StadtLandSizeTotal Score1OldenburgDeutschlandK57,90,4271,94588,3594,4684,5227,153,0590,3454,1836,4515,0525,75N31,5216,2669,122MünsterDeutschlandK58,740,3910,53445,5883,0488,4328,1551,2388,0453,0535,522630,76N23,8412,4265,933Freiburg i. Breisg.DeutschlandK59,350,"

如果可能的话,有人能帮我刮一下表格吗,尤其是特定列的一些值(见上文)?非常感谢任何帮助/提示。

提前谢谢你。 (我是新手,请温柔。)

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    这是解决难题的一种方法。虽然行名使用了很多图标,所以我只留下空的列名。您可以创建向量名称并使用手动分配它们

    names(table_content) <- names_vector

    这里是代码

    library(rvest)
    #> Loading required package: xml2
    library(dplyr, warn.conflicts = FALSE)
    library(purrr)
    
    # Here is just reuse your code
    num_link <- "https://www.coya.com/bike/fahrrad-index-2019"
    num_page <- read_html(num_link)
    
    # Extract the items from your code but go further down
    table_content <- num_page %>% html_nodes("._1200:nth-child(2)") %>%
      # Extract the node that contain the table
      html_nodes(css = ".w-dyn-list") %>% 
      # Extract the nodes corresponded to each row
      html_nodes(css = ".bike-collection-item") %>%
      # Then map the function that take each rows in and convert them to a table
      # and bind them together into one table
      map_dfr(function(x) {
        # suppress the message due to no column name was feed into map_dfc
        suppressMessages(
          x %>% html_nodes(".td") %>%
            map_dfc(function(x) { x %>% html_text })
        )
      })
    

    这是提取的内容

    #> # A tibble: 70 x 21
    #>    ...1  ...2  ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10 ...11 ...12 ...13
    #>    <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    #>  1 1     Olde… Deut… K     57,9  0,427 1,94  588,… 94,46 84,52 27,1  53,05 90,34
    #>  2 2     Müns… Deut… K     58,74 0,391 0,53  445,… 83,04 88,43 28,15 51,23 88,04
    #>  3 3     Frei… Deut… K     59,35 0,34  2,27  962,… 88,87 77,52 32,57 48,11 93,49
    #>  4 4     Bamb… Deut… K     55,59 0,302 0     456,… 89,04 92,66 30,29 47,74 93,75
    #>  5 5     Gött… Deut… K     62,66 0,28  3,07  379,… 92,8  80,99 23,03 48,07 89,18
    #>  6 6     Heid… Deut… K     63,14 0,22  1,21  394,… 90,39 88,33 29,02 47,88 94,21
    #>  7 7     Karl… Deut… K     57,39 0,25  4,23  725,… 90,35 71,62 18,75 46,33 93,93
    #>  8 8     Brau… Deut… K     67,36 0,21  0     522,… 85,89 90,97 20,55 49,2  89,78
    #>  9 9     Kons… Deut… K     62,77 0,22  4,6   121,… 93,62 76,98 23    48,49 94,09
    #> 10 10    Brem… Deut… M     58,86 0,21  1,38  334,… 87,34 87,15 18,64 59,78 94,64
    #> # … with 60 more rows, and 8 more variables: ...14 <chr>, ...15 <chr>,
    #> #   ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>, ...20 <chr>,
    #> #   ...21 <chr>
    

    reprex package (v1.0.0) 于 2021-04-08 创建

    【讨论】:

      【解决方案2】:

      您可能希望一次创建一个表,然后一次创建一个列,这样您就可以创建一个数据框。试试这个例子:

      col1 <- num_page %>% html_nodes(paste0(".w-dyn-item :nth-child(2) div")) %>% 
                           html_text()
      

      选择器小工具很漂亮,但我通常需要进行大量试验才能获得正确的选择器。

      【讨论】:

        猜你喜欢
        • 2020-06-18
        • 2023-03-12
        • 1970-01-01
        • 2021-07-25
        • 2020-05-08
        • 2020-03-17
        • 2014-05-21
        • 1970-01-01
        相关资源
        最近更新 更多