Очистка открытого веб-сайта с помощью python BeautifulSoup

#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] для получения последнего


и это дает мне