Как получить следующий элемент с последующим братом? - PullRequest
0 голосов
/ 21 октября 2019

Задача 1 : Как щелкнуть по следующему элементу div того же класса (отдельная страница), очистить страницу, вернуться назад и щелкнуть следующий элемент div? Поскольку все элементы имеют одинаковое имя класса и содержат уникальную ссылку на отдельные страницы, которые я хотел бы очистить, возникает проблема, что мне нужно найти элемент-> Перейти на страницу-> Очистить информацию-> Вернуться назад->Перейти к следующему элементу и так далее. Решено:

Задача 2 : Как выполнить печать в формате CSV для печати текста, а НЕ путей xpath. См. Код, используемый ниже:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager

driver.get('https://www.example.com/list/')

# Loop load more in list
loadmore = True

while loadmore:
    try:
        next_link = driver.find_element_by_xpath('//button[@id="show-more"]')
        next_link.click()
    except NoSuchElementException:
        rows_remaining = False

# Open Csv file
File = open('list.csv', 'w')
writer = csv.writer(File)
entries = [] # defines entries
writer.writerows((entries))

# Collect all the elements
elements = driver.find_elements_by_css_selector("a[href*='/stockholm/']")

# Loop through each element to scrape
urls=[]
for element in elements:
    urls.append(element.get_attribute('href'))
    print(element.get_attribute('href')) # gets the href value of the element

# Define Xpath
def get_elements_by_xpath(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

for url in urls:
    driver.get(url)
    facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]
    for name, xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    writer.writerow(facts)

Этот код используется для печати в CSV на одной странице и без зацикливания URL-адресов:

facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]


with open('list.csv', 'a') as f:
    writer = csv.writer(f)
    entries = []
    for name, xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    writer.writerows(zip(*entries))

1 Ответ

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

Вам не нужно использовать следующих братьев и сестер. Вы можете найти все div, используя find_elements, который возвращает список. После этого вы можете перебрать каждый элемент и очистить то, что вам нужно.

    # Collect all the elements
elements = driver.find_elements_by_css_selector("a[href*='/stockholm/']")

# Loop through each element to scrape
urls=[]
for element in elements:
    urls.append(element.get_attribute('href'))
    print(element.get_attribute('href')) # gets the href value of the element

# Define Xpath
def get_elements_by_xpath(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

# Open Csv file
File = open('list.csv', 'w')
writer = csv.writer(File)

for url in urls:
    print(url) # Check if the url is correct
    driver.get(url)
    entries = [] # defines entries - Reset to blank after each loop
    facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]
    for xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    print(entries) #Check what you are writing into csv file before writing
    writer.writerow(entries)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...