Python - Selenium - webscrape तालिका HTML में पाठ के साथ WebDriverWait का उपयोग कर
मैं निम्नलिखित वेबसाइट के 500 या अधिक कर्मचारियों के साथ सभी कंपनी के नाम को हटाने की कोशिश करता हूं:
https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1
मैंने पहली साइट के कंपनी नामों को खंगालने के लिए एक कोड लिखा था और स्क्रिप्ट फिर "नेक्स्ट साइट बटन" पर क्लिक करेगी और नामों को फिर से स्क्रैप करेगी। नामों को एक सूची में सहेजा जाएगा, और यह तब तक होगा जब तक सूची में कुछ निश्चित नाम न हों। फिर यह सूची को डेटाफ्रेम में स्थानांतरित कर देगा और इसे xslfile में निर्यात करेगा। दुर्भाग्य से फिलहाल ऐसा नहीं है। यहाँ कोड है
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
company_list = []
driver = webdriver.Chrome('/Users/rieder/Anaconda3/chromedriver_win32/chromedriver.exe')
driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1')
driver.find_element_by_id("cookiesNotificationConfirm").click();
while len(company_list) < 20:
company_name = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='zebraTable zebraTable--companies']//following::tr[2]/td[@class='zebraTable__td zebraTable__td--companyName']/a"))).get_attribute("innerHTML")
for p in range(len(company_name)):
company_list.append(company_name)
driver.find_element_by_xpath("//*[@id='content']/section[3]/div/div/form/div/div[2]/div[2]/div[2]/div/button[2]").click();
print(company_list)
df = pd.DataFrame(company_list,columns =['Unternehmensname'])
df.to_excel("output.xlsx")
time.sleep(5)
और मेरा आउटपुट इस तरह दिखता है:
['\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ', '\n Progress-Werk Oberkirch AG\n ']
मुझे लगता है कि इसकी वजह से .get_attribute () को केवल एक विशेषता मिलती है, लेकिन मुझे नहीं पता कि इस बिंदु पर सभी विशेषताओं को कैसे प्राप्त किया जाए।
inb4 धन्यवाद
जवाब
हाँ, .get_attribute()आप एक बार में केवल एक विशेषता प्राप्त कर सकते हैं। सभी विशेषताएँ प्राप्त करने के लिए आप जावास्क्रिप्ट कोड को नीचे कर सकते हैं:
driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', ele)
यहाँ हाथी तुम्हारा निराकरण है।
सभी कंपनी के नाम को प्रिंट करने के लिए आप नीचे दिए गए दृष्टिकोण का उपयोग कर सकते हैं:
company_names = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//td[@class='zebraTable__td zebraTable__td--companyName']")))
for cn in company_names:
print(cn.text)
नोट: यह पहले पृष्ठ पर कंपनी के सभी नामों को प्रिंट करेगा। यदि आप सभी पृष्ठ से नाम प्राप्त करना चाहते हैं तो आपको प्रत्येक पृष्ठ पर अगले पृष्ठ के आइकन पर क्लिक करना होगा और एक लूप में उपरोक्त कोड पर क्लिक करना होगा।
आप find_elements_by_css_selectorकई वेब तत्वों (सभी दिखाए गए कंपनी के नाम) को खोजने के लिए विधि का उपयोग कर सकते हैं ।
मैं सब कुछ नहीं लिखूंगा, लेकिन जबकि लूप की शुरुआत कुछ इस तरह दिखनी चाहिए:
companies = driver.find_elements_by_css_selector(".zebraTable__td--companyName")
फिर आपको companiesसूची के माध्यम से लूप करना चाहिए और प्रत्येक सूची सदस्य के लिए विशेषताओं को प्राप्त करना चाहिए ।
इसने निम्नलिखित कोड के साथ काम किया, जो पहले 100 कंपनी नामों के साथ एक उत्कृष्ट सूची बनाता है:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import pandas as pd
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
company_list = []
driver = webdriver.Chrome('/Users/rieder/Anaconda3/chromedriver_win32/chromedriver.exe')
driver.get('https://de.statista.com/companydb/suche?idCountry=276&idBranch=0&revenueFrom=-1000000000000000000&revenueTo=1000000000000000000&employeesFrom=500&employeesTo=100000000&sortMethod=revenueDesc&p=1')
driver.find_element_by_id("cookiesNotificationConfirm").click();
while len(company_list) < 100:
company_names = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//td[@class='zebraTable__td zebraTable__td--companyName']")))
for cn in company_names:
company_list.append(cn.text)
driver.find_element_by_xpath("//*[@id='content']/section[3]/div/div/form/div/div[2]/div[2]/div[2]/div/button[2]").click();
df = pd.DataFrame(company_list, columns =['Unternehmensname'])
df.to_excel("output.xlsx")
time.sleep(5)
बहुत बहुत धन्यवाद दोस्तों