【问题标题】:Appending Scraped Data to Dataframe - Python, Selenium将抓取的数据附加到数据框 - Python,Selenium
【发布时间】:2018-01-22 18:30:26
【问题描述】:

我正在学习网页抓取并在 Eat24(Yelp 的网站)上工作。我能够从 Yelp 中抓取基本数据,但无法做一些非常简单的事情:将该数据附加到数据框。这是我的代码,我已经注释了,所以应该很容易理解。

from selenium import webdriver
import time
import pandas as pd
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

#go to eat24, type in zip code 10007, choose pickup and click search

driver.get("https://new-york.eat24hours.com/restaurants/index.php")
search_area = driver.find_element_by_name("address_auto_complete")
search_area.send_keys("10007")
pickup_element = driver.find_element_by_xpath("//[@id='search_form']/div/table/tbody/tr/td[2]")
pickup_element.click()
search_button = driver.find_element_by_xpath("//*[@id='search_form']/div/table/tbody/tr/td[3]/button")
search_button.click()


#scroll up and down on page to load more of 'infinity' list

for i in range(0,3):
    driver.execute_script("window.scrollTo(0, 
document.body.scrollHeight);")
    driver.execute_script("window.scrollTo(0,0);")
    time.sleep(1)

#find menu urls

menu_urls = [page.get_attribute('href') for page in 
driver.find_elements_by_xpath('//*[@title="View Menu"]')]

df = pd.DataFrame(columns=['name', 'menuitems'])

#collect menu items/prices/name from each URL
for url in menu_urls:
    driver.get(url)
    menu_items = driver.find_elements_by_class_name("cpa")
    menu_items = [x.text for x in menu_items]
    menu_prices = driver.find_elements_by_class_name('item_price')
    menu_prices = [x.text for x in menu_prices]
    name = driver.find_element_by_id('restaurant_name')
    menuitems = dict(zip(menu_items, menu_prices))
    df['name'] = name
    df['menuitems'] = menuitems

df.to_csv('test.csv', index=False)

问题在最后。它不会将 menuitems + name 添加到数据框中的连续行中。我曾尝试使用 .loc 和其他功能,但它变得一团糟,所以我删除了我的尝试。任何帮助将不胜感激!

编辑:当 for 循环尝试将第二组菜单项/餐厅名称添加到数据框时,我得到的错误是“ValueError:值的长度与索引的长度不匹配”

【问题讨论】:

  • pd 中的 pd.DataFrame 是什么?它没有在您发布的片段中定义
  • @KirilS。 import pandas as pd
  • 抱歉,我在开头添加了这个,已编辑。感谢您了解
  • 你不应该有第三列menu_prices,或者加入menuitems中的项目吗?

标签: python python-2.7 selenium selenium-webdriver web-scraping


【解决方案1】:

我想出了一个简单的解决方案,不知道为什么我以前没有想到它。我添加了一个“行”计数,每次迭代都会增加 1,并使用 .loc 将数据放在第“行”行中

row = 0
for url in menu_urls:
    row +=1
    driver.get(url)
    menu_items = driver.find_elements_by_class_name("cpa")
    menu_items = [x.text for x in menu_items]
    menu_prices = driver.find_elements_by_class_name('item_price')
    menu_prices = [x.text for x in menu_prices]
    name = driver.find_element_by_id('restaurant_name').text
    menuitems = [dict(zip(menu_items, menu_prices))]
    df.loc[row, 'name'] = name
    df.loc[row, 'menuitems'] = menuitems
    print df

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 2018-07-03
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2018-10-13
    • 2019-09-08
    相关资源
    最近更新 更多