【问题标题】:How to get data from all pages by selenium python如何通过 selenium python 从所有页面获取数据
【发布时间】:2018-09-07 13:11:10
【问题描述】:

我试图通过下面代码中显示的链接从所有页面中获取数据,但没有成功。

# -*- coding: utf-8 -*-
from time import sleep
from scrapy import Spider
from selenium import webdriver
from scrapy.selector import Selector
from scrapy.http import Request
from selenium.common.exceptions import NoSuchElementException
import pandas as pd 
driver = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe')
driver.get('http://buyersguide.recyclingtoday.com/search')
results = list()
#scrpae data here
rows = driver.find_elements_by_xpath("//td[@style='font-weight:bold;']//parent::tr")
#get more pages 
while True:
            try:
                driver.find_element_by_partial_link_text('Next').click()

                sleep(15)

                #scrpae data here
                rows = driver.find_elements_by_xpath("//td[@style='font-weight:bold;']//parent::tr")

                for i in range(0, len(rows)):
                    print(rows[i])

                    results.append(rows[i])

                    print('---')


            except NoSuchElementException:


                break
#get all the wanted data 
records = [] 
for result in results:
     company=result.find_element_by_xpath('./td[1]').text
     address = result.find_element_by_xpath('./td[2]').text
     contact= result.find_element_by_xpath('./td[3]//a').text
     number= result.find_element_by_xpath('./td[5]').text
     records.append((company,address,contact,number))
#output to be table 
 df = pd.DataFrame(records, columns=['company','number','address', 'contact']) 

【问题讨论】:

  • 什么不起作用?你有什么例外吗?
  • 你发布的主要是代码......几乎没有解释。究竟是什么问题?它“不起作用”不是很具有描述性。转储代码并期望我们运行它并告诉您问题所在是不合理的。期望是您自己运行代码并进行一些调查和调试。完成此操作后仍然卡住,然后发布 1. 你想做什么(用文字),2. 你是如何尝试做的(用代码,minimal reproducible example)和描述什么不起作用(包括错误消息),示例 HTML 或页面链接,以及您尝试过的所有内容。
  • 。我检查了代码,运行它,没有出现错误,但就是无法获取公司、联系人、号码等数据,但是如果我一一运行代码jupyter notebook,没问题。

标签: python selenium selenium-chromedriver


【解决方案1】:

这不是对您问题的回答,因为没有对您所面临问题的解释。但是,我对它进行了一次尝试。这不是单元测试的,如果您要利用此实现,请使用 webdriver wait 代替 time.sleep 并进行单元测试

我得到了数据,但没有测试是否所有数据都进入了 iframe

import time
from selenium.webdriver import Chrome
from selenium.common.exceptions import NoSuchElementException
import pandas as pd

driver = Chrome(executable_path=<path>)
driver.get('http://buyersguide.recyclingtoday.com/search')
results = []

while True:
    time.sleep(2)
    results_table = driver.find_element_by_css_selector('#Body_tbl>tbody')
    rows = results_table.find_elements_by_tag_name('tr')
    del rows[:2] # delete header
    del rows[-2:] # delete footer
    for row in rows:
        data = row.find_elements_by_tag_name('td')
        results.append([data[0].text, data[1].text, data[2].text, data[4].text])

    time.sleep(2)
    try:
        next_ = driver.find_element_by_link_text('Next >')
        next_.click()
    except NoSuchElementException:
       break

df = pd.DataFrame(results, columns=['Address', 'Company', 'Contact', 'Phone Number'])

【讨论】:

  • 我检查了我写的代码,运行它,没有出现错误,但是就是无法获取公司,联系人,电话号码等数据,但是如果我一个一个运行代码在 jupyter notebook 上就可以了
  • 您好,先生,此代码有效,但有一个小问题,数据[2] 我不想获取文本,实际上它有 href,我想获取 href,请问我知道如何我能拿到吗?
【解决方案2】:

试试这个(缩进可能被破坏):

driver.find_element_by_partial_link_text('Next').click()
#sleep(15)# you can use explicit wait time as below
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//td[@style='font-weight:bold;']//parent::tr"))
rows = driver.find_elements_by_xpath("//td[@style='font-weight:bold;']//parent::tr"))
for i in rows:
    text= i.text
    print text

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多