Доступ к подробной информации из тегов привязки на веб-странице - PullRequest
1 голос
/ 12 октября 2019

Я очищаю веб-страницу, мне удалось получить данные из таблицы в CSV-файл, используя селен. Я борюсь с тем, чтобы получить информацию из тегов привязки, присутствующих в каждой строке таблицы.

Я попытался щелкнуть все теги привязки таблицы, чтобы получить информацию из соответствующих URL-адресов, но она останавливается посленажав на первый URL. Выдает ошибку: Message: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы. Я не уверен, что это правильный подход к этой проблеме. Вот мой код того, что я пробовал до сих пор. Прошу прощения, если код не отформатирован должным образом. Я новичок в python и stackoverflow.

 import csv
 import requests
 import time
 from selenium import webdriver
 from selenium.webdriver.common.by import By
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC

 browser = webdriver.Chrome(executable_path=r"D:\jewel\chromedriver.exe")
 browser.get(('https://e-sourcingni.bravosolution.co.uk/web/login.shtml'))
 signInButton = browser.find_element_by_css_selector(".only")
 signInButton.click()
 time.sleep(5)
 table = browser.find_element_by_css_selector(".list-table")

 for a in browser.find_elements_by_css_selector(".detailLink"):
  a.click()
  time.sleep(2)
  browser.execute_script("window.history.go(-1)")
  time.sleep(2)

 with open('output.csv', "w") as f:
   writer = csv.writer(f)
   writer.writerow(["S.No","Status","Organization","Project Title","First Publishing Date","Work Category","Listing Deadline"])
  for row in table.find_elements_by_css_selector('tr'):
    writer.writerow([d.text for d in row.find_elements_by_css_selector('td')])


 browser.close()

Что мне нужно, это извлечь данные из href тегов, имеющих класс detailLink. Я не могу найти правильный подход для этого.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Я использовал обычный цикл for для итерации таблицы вместо каждого цикла. Попробуйте это и дайте мне знать, как это происходит.

import csv
import time
from selenium import webdriver

browser = webdriver.Chrome('/usr/local/bin/chromedriver')  # Optional argument, if not specified will search path.
browser.implicitly_wait(5)

browser.execute_script("window.open('about:blank','tab1');")
browser.switch_to.window("tab1")
browser.get(('https://e-sourcingni.bravosolution.co.uk/web/login.shtml'))
signInButton = browser.find_element_by_css_selector(".only")
signInButton.click()
time.sleep(5)
table = browser.find_element_by_css_selector(".list-table")
links=browser.find_elements_by_css_selector(".detailLink")
for i in range(len(links)):
    links=browser.find_elements_by_css_selector(".detailLink") 
    links[i].click()
    time.sleep(2)
    browser.execute_script("window.history.go(-1)")
    time.sleep(2)

with open('output.csv', "w") as f:
    writer = csv.writer(f)
    writer.writerow(["S.No","Status","Organization","Project Title","First Publishing Date","Work Category","Listing Deadline"])
    table=browser.find_elements_by_xpath("//table[@class='list-table']//tr")
    for row in range(len(table)):
        x=[]
        for d in browser.find_elements_by_xpath("//table[@class='list-table']//tr["+str(row)+"]//td"):
            x.append(d.text.encode('utf-8'))
        writer.writerow(x)


browser.close()
0 голосов
/ 12 октября 2019

Да, поскольку вы переходите на следующую страницу, он не может найти элемент на предыдущей странице, поскольку вы изменили страницу. Вы можете попробовать это

import csv
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

 browser = webdriver.Chrome(executable_path=r"D:\jewel\chromedriver.exe")

browser.execute_script("window.open('about:blank','tab1');")
browser.switch_to.window("tab1")
browser.get("https://e-sourcingni.bravosolution.co.uk/web/login.shtml")
signInButton = browser.find_element_by_css_selector(".only")
signInButton.click()
time.sleep(5)
table = browser.find_element_by_css_selector(".list-table")

for a in table.find_elements_by_tag_name("a"):
    try:
        if a.get_attribute("class") == "detailLink":
            id = a.get_attribute("onclick")
            id = id.replace("javascript:goToDetail('","")
            id = id.replace("', '02260');stopEventPropagation(event);", "")
            a_href = a.get_attribute("href")
            browser.execute_script("window.open('about:blank','tab2');")
            browser.switch_to.window("tab2")
            browser.get("https://e-sourcingni.bravosolution.co.uk/esop/toolkit/opportunity/opportunityDetail.do?opportunityId="+ id +"&oppList=CURRENT")

            time.sleep(2)
            #wait for the element to load

            browser.switch_to.window("tab1")
            # print("in it ")
    except:
        print("detailLink is not present in the a tag class")

with open('output.csv', "w") as f:
    writer = csv.writer(f)
    writer.writerow(["S.No","Status","Organization","Project Title","First Publishing Date","Work Category","Listing Deadline"])
    for row in table.find_elements_by_css_selector('tr'):
        writer.writerow([d.text for d in row.find_elements_by_css_selector('td')])


browser.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...