Selenium PY - xpath - петля не работает - PullRequest
0 голосов
/ 02 июня 2018

У меня есть вопрос об извлечении второго элемента в классе с помощью Selenium и, в частности, xpath.Глядя на изображение (извините за то, что не сообщали о кодировке HTML, но это было бы слишком долго), я бы извлек второй элемент с индексом «содержимое поля», то есть о дате (4 июня 2018 года).Тем не менее, есть еще один объект, который также был проиндексирован с «полевым содержанием»: «Культура и идентичность в Европе».Поэтому у меня есть некоторые проблемы только с извлечением даты и помещением ее во фрейм данных, как я пытался сделать в своем коде. введите описание изображения здесь

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
from selenium.common.exceptions import TimeoutException
import pandas as pd

browser = webdriver.Chrome(executable_path=r'C:xxx', chrome_options=option)
browser.get(url)
url= "https://www.mooc-list.com/countries/italy"
titles_element = browser.find_elements_by_xpath("//div[starts-with(@class, 'views-row views-row-')]")
titles = [x.text for x in titles_element]
for i in titles_element:
    newtitle= i.find_elements_by_xpath("//div[@class='views-field views-field-title']")
moocstitle = [x.text for x in newtitle]
for i in titles_element:
    area= i.find_elements_by_xpath("//span[@class='field-content']")
areas = [x.text for x in area]
moocs = pd.DataFrame({'moocs': moocstitle,

                          'areas': areas
                       })

moocs.head(10)

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Вы можете попробовать этот Xpath:

//a[contains(text(),'Cultures and Identities')]/ancestor::div[contains(@class,'field-title')]/following-sibling::div[contains(@class,'start')]/span
0 голосов
/ 02 июня 2018

Не пытаясь сделать это специально для селена (я использую lxml, но xpath должны быть такими же), я думаю, что мы сможем продвинуться далеко, просто изменив свой xpath.Например, этот xpath может получить вам все строки с датами:

'//div[contains(@class, "views-field-field-start-date-text")]/span'

Затем вы можете индексировать это:

result[2].text
0 голосов
/ 02 июня 2018

Если я правильно заметил, список имен классов, которые содержат текст даты, уникален.Текст даты можно выбрать двумя способами:

Чтобы выбрать имя класса, содержащее внутри нескольких имен классов:

#if class name has spaces on both sides 
//div[contains(concat(' ', normalize-space(@class), ' '), ' test-class')]/span

#if class name has spaces on left side only(your example)
//div[contains(concat(' ', normalize-space(@class)), ' views-field-field-start-date-text')]/span

Чтобы выбрать с помощьювсе имена классов определенного тега класса

//div[@class='views-field views-field-field-start-date-text')]/span
...