【发布时间】: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