Как бы я очистил серию страниц, где элемент имеет другой путь xpath, используя Selenium? - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужна помощь в очистке ряда страниц, подобных этой: https://electionresults.ewashtenaw.org/electionreporting/aug2018/precinctreport1.html. URL-адреса легко просеиваются - чтобы перейти на следующую страницу, вы просто увеличиваете число после «предварительного отчета». Я специально пытаюсь получить только итоги голосования за второй раздел «Губернатор», с Абдул эль-Сайедом, Шри Танедаром и Гретхен Уитмер. Проблема в том, что я создал свой сценарий с селеном, используя первую предельную страницу (ту, которую я только что связал), и пути xpath различаются от страницы к странице. Поэтому, когда я запустил свой скрипт, он остановился на второй странице, потому что не смог найти элемент. Как я мог обойти это? Вот мой код:

import pandas as pd
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
#


# Finds the total number of precincts to be scraped 
driver = webdriver.Chrome(executable_path="/users/aliallam/Desktop/scraper test/chromedriver")
url = 'https://electionresults.ewashtenaw.org/electionreporting/aug2018/indexprecinctreport.html'
driver.get(url)
precinct_nums = driver.find_elements_by_class_name('regular')
driver.close()

# Perm vars
precincts = []
all_abdul_votes = []
all_shri_votes = []
all_gretchen_votes = []

def ScrapePrecinct(precinct):

    # Initial Selenium stuff
    driver = webdriver.Chrome(executable_path="/users/aliallam/Desktop/scraper test/chromedriver")
    url = f'https://electionresults.ewashtenaw.org/electionreporting/aug2018/precinctreport{precinct}.html'
    driver.get(url)

    # Find Precinct Name
    precinct_text = driver.find_element_by_class_name('h2').text

    # Find vote numbers for each candidate & assign to variable
    abdul_votes = driver.find_element_by_xpath('/html/body/center/table/tbody/tr[73]/td[4]').text
    shri_votes = driver.find_element_by_xpath('/html/body/center/table/tbody/tr[75]/td[4]').text
    gretchen_votes = driver.find_element_by_xpath('/html/body/center/table/tbody/tr[77]/td[4]').text

    # Append all data from precinct to perm vars 
    precincts.append(precinct_text)
    all_abdul_votes.append(abdul_votes)
    all_shri_votes.append(shri_votes)
    all_gretchen_votes.append(gretchen_votes)

    driver.quit()

itterations = len(precinct_nums)
counter = "1"
while int(counter) <= itterations:
    ScrapePrecinct(counter)
    counter = str(int(counter) + 1)

print(precincts)
print(all_abdul_votes)
print(all_shri_votes)
print(all_gretchen_votes)

1 Ответ

0 голосов
/ 17 апреля 2020

Я полагаю, что следующие xpath'ы должны выполнить эту работу:

driver.find_element_by_xpath('//tr/td[text()[contains(.,"Abdul El-Sayed(DEM)")]]/../td[4]')
driver.find_element_by_xpath('//tr/td[text()[contains(.,"Shri Thanedar(DEM)")]]/../td[4]')
driver.find_element_by_xpath('//tr/td[text()[contains(.,"Gretchen Whitmer(DEM)")]]/../td[4]')

Я пробовал это на нескольких страницах "precinctreport", и, похоже, он работает нормально.

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