Как очистить данные с веб-сайта и записать в CSV в указанном формате в R?

Я пытаюсь очистить данные с https://www.booking.com/country.html.

Идея состоит в том, чтобы извлечь все числа, касающиеся любого типа жилья, указанного для конкретной страны.

Выходные данные должны содержать список всех стран в столбце A файла Excel и соответствующее количество списков для различных типов собственности (например, апартаменты, хостелы, курорты и т. Д.) В каждой соответствующей стране, рядом с названиями стран. в отдельные столбцы.

Мне нужно собрать все детали для всех типов собственности в данной стране.

На изображении выше описан выходной формат, необходимый в Excel. Я могу получить страну, используя приведенный ниже код, но не типы собственности и соответствующие данные.

Как получить данные итеративно в функции для всех стран и записать в CSV.

library(rvest)
library(reshape2)
library(stringr)

url <- "https://www.booking.com/country.html"

bookingdata <- read_html(url)

#extracting the country
country <- html_nodes(bookingdata, "h2 > a") %>% 
  html_text()
write.csv(country, 'D:\\web scraping\\country.csv' ,row.names = FALSE)
print(country)

#extracting the data inside the inner div 
html_nodes(bookingdata, "div >div > div > ul > li > a")%>%
  html_text()
for (i in country) {
print(i)
html_nodes(pg, "ul > li > a") %>% 
  html_text()
  print(accomodation)
}

#getting all the data
accomodation <- html_nodes(pg, "ul > li > a") %>% 
  html_text()

#separating the numbers
accomodation.num <- (str_extract(accomodation, "[0-9]+"))
#separating the characters
accomodation.char <- (str_extract(accomodation,"[aA-zZ]+"))
#separating unique characters
unique(accomodation.char)

1 ответ

Решение
import requests
from bs4 import BeautifulSoup
import pandas as pd

r = requests.get('https://www.booking.com/country.html')
soup = BeautifulSoup(r.text, 'html.parser')

data = []
for item in soup.findAll('div', attrs={'class': 'block_third block_third--flag-module'}):
    country = [(country.text).replace('\n', '')
               for country in item.findAll('a')]
    data.append(country)

final = []
for item in data:
    final.append(item)

df = pd.DataFrame(final)
df.to_csv('output.csv')

Просмотреть выходные данные в Интернете: нажмите здесь

Другая версия для требований пользователя через ЧАТ:

import requests
from bs4 import BeautifulSoup
import pandas as pd

r = requests.get('https://www.booking.com/country.html')
soup = BeautifulSoup(r.text, 'html.parser')

data = []
for item in soup.select('div.block_third.block_third--flag-module'):
    country = [(country.text).replace('\n', '')
               for country in item.select('a')]
    data.append(country)

final = []
for item in data:
    final.append(item)

df = pd.DataFrame(final).set_index(0)
df.index.name = 'location'
split = df.stack().str.extract('^(?P<freq>[\d,]+)\s+(?P<category>.*)').reset_index(level=1, drop=True)
pvt = split.pivot(columns='category', values='freq')
pvt.sort_index(axis=1, inplace=True)
pvt.reset_index().to_csv('output2.csv', index=False)
Другие вопросы по тегам