当前位置: 首页 > 知识库问答 >
问题:

无法使用selenium从页面中名为“heading”的每个类中获取数据

封瑞
2023-03-14

你好,我是数据抓取的新手。在这里,我试图从所有具有“标题”属性的类中抓取数据。但是在我的代码中,它只打印第一个元素,即使我使用循环进行迭代。

预期输出-从具有属性“heading”的所有页面类中刮取数据

实际输出-仅从类名为“heading”的第一个元素中提取数据,甚至不单击next按钮。

我用来测试的网站在这里

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, WebDriverException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import pandas as pd
from openpyxl.workbook import Workbook


DRIVER_PATH = 'C:/Users/Aishwary/Downloads/chromedriver_win32/chromedriver'

driver = webdriver.Chrome(executable_path=DRIVER_PATH)

driver.get('https://www.fundoodata.com/citiesindustry/19/2/list-of-information-technology-(it)-companies-in-noida')

# get all classes which has heading as a class name 
company_names = driver.find_elements_by_class_name('heading')

# to store all companies names from heading class name
names_list = []

while True:

    try:
        for name in company_names: # iterate each name in all div classes named as heading
            text = name.text    # get text data from those elements
            names_list.append(text)
            print(text)
            # Click on next button to get data from next pages as well
            driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="main-container"]/div[2]/div[4]/div[2]/div[44]/div[1]/ul/li[7]/a'))))
            driver.find_element_by_xpath('//*[@id="main-container"]/div[2]/div[4]/div[2]/div[44]/div[1]/ul/li[7]/a').click()

    except (TimeoutException, WebDriverException) as e:
        print("Last page reached")
        break


driver.quit()

# Store those data in excel sheet
df = pd.DataFrame(names_list)
writer = pd.ExcelWriter('companies_names.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='List')
writer.save()

共有1个答案

罗兴运
2023-03-14

此脚本将从页面中获取所有业务名称:

import requests
import pandas as pd
from bs4 import BeautifulSoup


url = 'https://www.fundoodata.com/citiesindustry/19/2/list-of-information-technology-(it)-companies-in-noida'

all_data = []
while True:
    print(url)

    soup = BeautifulSoup( requests.get(url).content, 'html.parser' )
    for h in soup.select('div.heading'):
        all_data.append({'Name' : h.text})
        print(h.text)

    next_page = soup.select_one('a:contains("Next")')
    if not next_page:
        break

    url = 'https://www.fundoodata.com' + next_page['href']

df = pd.DataFrame(all_data)
print(df)

df.to_csv('data.csv')

印刷品:

                              Name
0                   BirlaSoft Ltd
1             HCL Infosystems Ltd
2            HCL Technologies Ltd
3           NIIT Technologies Ltd
4          3Pillar Global Pvt Ltd
..                             ...
481  Innovaccer Analytics Pvt Ltd
482         Kratikal Tech Pvt Ltd
483          Sofocle Technologies
484    SquadRun Solutions Pvt Ltd
485   Zaptas Technologies Pvt Ltd

[486 rows x 1 columns]

并保存数据。csv(来自LibreOffice的屏幕截图):

 类似资料:
  • 最近,我一直试图从一个网站上获取大量的定价,从一个页面开始,每个项目的页面都链接到起始页面。我希望运行一个脚本,允许我单击某个项目的框,删除该项目的定价和描述,然后返回起始页并继续该循环。然而,有一个明显的问题,我在刮掉第一件物品后遇到了。返回起始页后,容器没有定义,因此出现了一个陈旧的元素错误,该错误会中断循环并阻止我获取其余的项。这是我使用的示例代码,希望能够一个接一个地刮去所有项目。 然而,

  • 我现在花了几个小时在这里阅读这个问题的解决方案,就像这样:从setTimeout获取返回值 但是我找不到任何解决问题的方法来获取removeCount值。我还试图添加一个promise,但我不知道如何使用增量。

  • 我无法从两个表中获得数据,每个表都有条件。文档中没有示例。我只需要来自students表的行,其中一个字段被标记为非活动,来自Guardian表的相应行email字段不为空。卫报有很多学生。我得到了结果,但是我得到了Guardian电子邮件的空值。我尝试了很多ID、型号名称等组合,但我就是不明白。 结果: http://book.cakephp.org/2.0/en/core-libraries/

  • 问题内容: 我有这个数据库结构 我需要的是在特定日期登录的所有用户的列表,例如 我目前正在尝试通过单个SQL查询完成此操作,但是我真的不知道如何获取表中记录的所有时间的时间跨度以及如何将其连接到登录的用户。 我最大的问题是如何创建数据库中所有时间的“虚拟”表… 问题答案: 编辑 CTE的二进制增长,而不是线性增长。2 ^ 100个日期应在合理范围内。

  • 当我执行时,它也打印和,我如何在Python中使用selenium只获取示例文本?

  • 创建基类: 然后初始化页面对象: 然后创建测试用例: 输出: 请告诉我怎么了。