我的代碼作業正常并抓取資料,但是當我嘗試輸出到 JSON 時它不起作用。我創建了一個字典并嘗試使用 pandas 轉換為 JSON。我收到以下錯誤:回傳轉儲(溢位錯誤:達到最大遞回級別
/usr/local/Cellar/[email protected]/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/subprocess.py:1052:資源警告:子行程40103仍在運行系統:1:資源警告:未關閉檔案 <_io.BufferedWriter name=4> sys:1: ResourceWarning: unclosed <socket.socket fd=6, family=AddressFamily.AF_INET6, type=SocketKind.SOCK_STREAM, proto=6, laddr=('::1', 57427, 0, 0), raddr=('::1', 57423, 0, 0)>
這是我的代碼:
import unittest
import time
import pandas as pd
import json
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
test_url = "https://brocku.ca/guides-and-timetables/timetables/?session=fw&type=ug&level=all&program=ACTG"
before_XPath = "/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr["
aftertd_XPath = "]/td["
aftertr_XPath = "]"
course_code = []
course_title = []
class WebTableTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome('/Users/Downloads/chromedriver')
self.driver.maximize_window()
# def test_1_get_num_rows_(self):
# driver = self.driver
# driver.get(test_url)
#
# WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//*[@id="7858101"]')))
# # time.sleep(10)
# # num_rows = len (driver.find_elements(By.XPATH, '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]'));
# num_rows = len(driver.find_elements(By.XPATH,
# '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr'));
#
# # num_rows = len (driver.find_elements_by_xpath("//*[@id='datatable-1547']/tbody/tr"))
# print("Rows in table are " repr(num_rows))
# def test_1_get_num_columns_(self):
# driver = self.driver
# driver.get(test_url)
#
# WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//*[@id="7858101"]')))
# # time.sleep(10)
# # num_rows = len (driver.find_elements(By.XPATH, '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]'));
# num_rows = len(driver.find_elements(By.XPATH,
# '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr[2]/td'));
#
# # num_rows = len (driver.find_elements_by_xpath("//*[@id='datatable-1547']/tbody/tr"))
# print("Columns in table are " repr(num_rows))
def test_get_row_col_info_(self):
driver = self.driver
driver.get(test_url)
# course_code.append(driver.find_elements(By.XPATH,
# '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr'));
#
# course_title.append(driver.find_elements(By.XPATH,
# '/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr[2]/td'));
# time.sleep(30)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '//*[@id="7858101"]')))
rows = len(driver.find_elements(By.XPATH,
'/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr'));
# print (rows)
columns = len(driver.find_elements(By.XPATH,
'/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr[2]/td'));
# print(columns)
# print("Company" " " "Contact" " " "Country")
for t_row in range(2, (rows 1)):
for t_column in range(1, (columns 1)):
course_code.append(driver.find_elements(By.XPATH,
'/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr'));
course_title.append(driver.find_elements(By.XPATH,
'/html/body/div/div[8]/div[2]/div/div[2]/div/div[3]/div/div/div/div/div/div/div[2]/div[4]/table/tbody/tr[2]/td'));
FinalXPath = before_XPath str(t_row) aftertd_XPath str(t_column) aftertr_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
# print(cell_text, end = ' ')
print(cell_text)
print()
df = pd.DataFrame({'course_code': course_code, 'course_title': course_title})
df.to_json('ACTG.json')
if __name__ == "__main__":
unittest.main()
uj5u.com熱心網友回復:
問題是course_code兩者course_title都包含來自 Selenium 的 HTML 元素。
您不能將整個 Selenium HTML 元素序列化為 JSON。相反,在將其序列化為 JSON 之前,您必須從這些元素的文本內容(或屬性)中挑選出相關值并將其放入資料框中而不是元素中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/444609.html
