#python #web-scraping #beautifulsoup #na
#питон #соскабливание полотна #прекрасный суп #na
Вопрос:
Я пытаюсь очистить место для открытого стола с помощью Прекрасного супа.Код выполняется успешно, но результат, который я получаю, содержит много столбцов NA. Вот этот код.
def parse_html(html):
data, item = pd.DataFrame(), {}
soup = BeautifulSoup(html, 'lxml')
for i, resto in enumerate(soup.find_all('div', class_='rest-row-info')):
item['name'] = resto.find('span', class_='rest-row-name-text').text
booking = resto.find('div', class_='booking')
item['bookings'] = re.search('d ', booking.text).group() if booking else 'NA'
rating = resto.select('div.all-stars.filled')
item['rating'] = int(re.search('d ', rating[0].get('style')).group()) if rating else 'NA'
reviews = resto.find('span', class_='star-rating-text--review-text')
item['reviews'] = int(re.search('d ', reviews.text).group()) if reviews else 'NA'
item['price'] = int(resto.find('div', class_='rest-row-pricing').find('i').text.count('
и результаты:
name bookings rating reviews price cuisine location
0 IL Carino Restaurant 1 NA NA 3 Upper East Side
1 French Roast Uptown 10 NA NA 3 Upper West Side
2 The Mermaid Inn Uptown 72 NA NA 3 Upper West Side
3 Cafe Du Soleil 101 NA NA 2 Upper West Side
4 The Leopard at des Artistes 24 NA NA 4 Upper West Side
Любая рекомендация или предложение приветствуются.
Комментарии:
1. Рейтинг, обзоры и колонки кухни отсутствуют.
2. Вы уже заглянули в html-файл? Кроме того, вы можете попытаться запустить свой код без преобразования типов (в int), в общем, кажется, что вы выполняете несколько шагов в одной строке кода, что затруднит отладку.
3. Одним из способов может быть простое использование
pandas.read_html
. получите таблицу и удалите значения N / a из фрейма данных.4. сначала используйте
print()
, чтобы увидеть, что вы получаете в переменной. Может быть, вы получаете пустые значения, так что позже вы получитеNA
. Возможно, потребуется некоторое время, чтобы загрузить все данные, или он отправит вам другой HTML, который вы видите в веб-браузере.5. вы пропускаете все значения в столбце, поэтому, возможно, вы используете неправильные значения
find()
,select()
и вам следует проверить, что вы получаете в HTML - может быть, сервер отправляет другой HTML, который вы можете увидеть в браузере, или он использует JavaScript для добавления элементов, но для этого требуется больше времени.
Ответ №1:
Я не вижу на этой странице
rating = resto.select('div.all-stars.filled')
и код также не может его найти - так что вы получаете NA
для rating
Но это дает мне такие строки, как 4.5 stars out of 5
rating = resto.select('.star-rating .star-rating-score')
#print(rating)
item['rating'] = rating[0]['aria-label'] if rating else 'NA'
Я не вижу на этой странице
resto.find('span', class_='star-rating-text--review-text')
и код также не может его найти - так что вы получаете NA
для reviews
Но это дает мне такие строки, как Awesome
, Exceptional
reviews = resto.select('div.review-rating-text span')
#print(reviews)
item['reviews'] = reviews[0].text if reviews else 'NA'
Есть два элемента с классом 'rest-row-meta--cuisine'
, и вы получаете первый, поэтому вы получаете $$$$
item['cuisine'] = resto.find('span', class_='rest-row-meta--cuisine').text
но вы должны использовать find_all
для получения обоих, а затем использовать [-1]
для получения последнего
item['cuisine'] = resto.find_all('span', class_='rest-row-meta--cuisine')[-1].text
и это дает мне
Pizzeria
Italian
Sushi
Steak
Contemporary Italian
Pizzeria
American
Italian
American
from selenium import webdriver
import pandas as pd
from bs4 import BeautifulSoup
from time import sleep
import re
def parse_html(html):
data, item = pd.DataFrame(), {}
soup = BeautifulSoup(html, 'lxml')
for i, resto in enumerate(soup.find_all('div', class_='rest-row-info')):
item['name'] = resto.find('span', class_='rest-row-name-text').text
booking = resto.find('div', class_='booking')
item['bookings'] = re.search('d ', booking.text).group() if booking else 'NA'
rating = resto.select('.star-rating .star-rating-score')
#print(rating)
item['rating'] = rating[0]['aria-label'] if rating else 'NA'
reviews = resto.find('span', class_='star-rating-text--review-text')
reviews = resto.select('div.review-rating-text span')
#print(reviews)
item['reviews'] = reviews[0].text if reviews else 'NA'
item['price'] = int(resto.find('div', class_='rest-row-pricing').find('i').text.count('
rating reviews cuisine
0 4.5 stars out of 5 Awesome Italian
1 4.5 stars out of 5 Awesome French American
2 4.7 stars out of 5 Exceptional Italian
3 4.8 stars out of 5 Exceptional Seafood
4 4.4 stars out of 5 Awesome French
.. ... ... ...
95 4.7 stars out of 5 Exceptional Contemporary Italian
96 4 stars out of 5 Excellent Pizzeria
97 NA NA American
98 4.7 stars out of 5 Exceptional Italian
99 4.4 stars out of 5 Awesome American
))
item['cuisine'] = resto.find('span', class_='rest-row-meta--cuisine').text
item['location'] = resto.find('span', class_='rest-row-meta--location').text
data[i] = pd.Series(item)
return data.T
restaurants = pd.DataFrame()
driver = webdriver.Chrome(ChromeDriverManager().install())
url = "https://www.opentable.com/new-york-restaurant-listings"
driver.get(url)
while True:
sleep(1)
new_data = parse_html(driver.page_source)
if new_data.empty:
break
restaurants = pd.concat([restaurants, new_data], ignore_index=True)
print(len(restaurants))
# driver.find_element_by_link_text('Next').click()
driver.close()
restaurants.to_csv('results.csv', index=False)
print(restaurants)
и результаты:
Любая рекомендация или предложение приветствуются.
Комментарии:
1. Рейтинг, обзоры и колонки кухни отсутствуют.
2. Вы уже заглянули в html-файл? Кроме того, вы можете попытаться запустить свой код без преобразования типов (в int), в общем, кажется, что вы выполняете несколько шагов в одной строке кода, что затруднит отладку.
3. Одним из способов может быть простое использование
pandas.read_html
. получите таблицу и удалите значения N / a из фрейма данных.4. сначала используйте
print()
, чтобы увидеть, что вы получаете в переменной. Может быть, вы получаете пустые значения, так что позже вы получитеNA
. Возможно, потребуется некоторое время, чтобы загрузить все данные, или он отправит вам другой HTML, который вы видите в веб-браузере.5. вы пропускаете все значения в столбце, поэтому, возможно, вы используете неправильные значения
find()
,select()
и вам следует проверить, что вы получаете в HTML - может быть, сервер отправляет другой HTML, который вы можете увидеть в браузере, или он использует JavaScript для добавления элементов, но для этого требуется больше времени.
Ответ №1:
Я не вижу на этой странице
и код также не может его найти - так что вы получаете NA
для rating
Но это дает мне такие строки, как 4.5 stars out of 5
Я не вижу на этой странице
и код также не может его найти - так что вы получаете NA
для reviews
Но это дает мне такие строки, как Awesome
, Exceptional
Есть два элемента с классом 'rest-row-meta--cuisine'
, и вы получаете первый, поэтому вы получаете $$$$
но вы должны использовать find_all
для получения обоих, а затем использовать [-1]
для получения последнего
и это дает мне
))
item['cuisine'] = resto.find_all('span', class_='rest-row-meta--cuisine')[-1].text
#print(item['cuisine'])
item['location'] = resto.find('span', class_='rest-row-meta--location').text
data[i] = pd.Series(item)
return data.T
restaurants = pd.DataFrame()
#driver = webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome()
url = "https://www.opentable.com/new-york-restaurant-listings"
driver.get(url)
while True:
sleep(1)
new_data = parse_html(driver.page_source)
if new_data.empty:
break
restaurants = pd.concat([restaurants, new_data], ignore_index=True)
print(len(restaurants))
# driver.find_element_by_link_text('Next').click()
#driver.close()
restaurants.to_csv('results.csv', index=False)
print(restaurants[['rating', 'reviews', 'cuisine']])
))
item[‘cuisine’] = resto.find(‘span’, class_=‘rest-row-meta—cuisine’).text
item[‘location’] = resto.find(‘span’, class_=‘rest-row-meta—location’).text
data[i] = pd.Series(item)
return data.T
restaurants = pd.DataFrame()
driver = webdriver.Chrome(ChromeDriverManager().install())
url = «https://www.opentable.com/new-york-restaurant-listings»
driver.get(url)
while True:
sleep(1)
new_data = parse_html(driver.page_source)
if new_data.empty:
break
restaurants = pd.concat([restaurants, new_data], ignore_index=True)
print(len(restaurants))
# driver.find_element_by_link_text(‘Next’).click()
driver.close()
restaurants.to_csv(‘results.csv’, index=False)
print(restaurants)
и результаты:
Любая рекомендация или предложение приветствуются.
Комментарии:
1. Рейтинг, обзоры и колонки кухни отсутствуют.
2. Вы уже заглянули в html-файл? Кроме того, вы можете попытаться запустить свой код без преобразования типов (в int), в общем, кажется, что вы выполняете несколько шагов в одной строке кода, что затруднит отладку.
3. Одним из способов может быть простое использование
pandas.read_html
. получите таблицу и удалите значения N / a из фрейма данных.4. сначала используйте
print()
, чтобы увидеть, что вы получаете в переменной. Может быть, вы получаете пустые значения, так что позже вы получитеNA
. Возможно, потребуется некоторое время, чтобы загрузить все данные, или он отправит вам другой HTML, который вы видите в веб-браузере.5. вы пропускаете все значения в столбце, поэтому, возможно, вы используете неправильные значения
find()
,select()
и вам следует проверить, что вы получаете в HTML — может быть, сервер отправляет другой HTML, который вы можете увидеть в браузере, или он использует JavaScript для добавления элементов, но для этого требуется больше времени.
Ответ №1:
Я не вижу на этой странице
и код также не может его найти — так что вы получаете NA
для rating
Но это дает мне такие строки, как 4.5 stars out of 5
Я не вижу на этой странице
и код также не может его найти — так что вы получаете NA
для reviews
Но это дает мне такие строки, как Awesome
, Exceptional
Есть два элемента с классом 'rest-row-meta--cuisine'
, и вы получаете первый, поэтому вы получаете $$$$
но вы должны использовать find_all
для получения обоих, а затем использовать [-1]
для получения последнего
и это дает мне