爬网台

时间:2021-04-08 01:09:34

标签: r web-scraping rvest

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

我特别需要一些专栏(“Bewertung spezielle Radwege & Qualität der Radwege”、“Investitionen & QUalität der Infrastruktur”、“Bewertung der Infrastruktur”、“Fahrradsharing-Score”、“Autofreier Tag”、“Critical-Mass-Fahr -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,"

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

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

2 个答案:

答案 0 :(得分: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 年 4 月 8 日创建

答案 1 :(得分:1)

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

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

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