Частичное совпадение XPATH с идентификатором Python, Selenium, - PullRequest
0 голосов
/ 27 февраля 2019

Могу ли я иметь правильный XPATH для извлечения элементов tr id = "review_"?Мне удалось получить элементы, но мне не повезло с идентификаторами, поскольку они частично совпадают

<table class="admin">
<thead>"snip"</thead>
<tbody>
    <tr id="review_984669" class="">
    <td>weird_wild_and_wonderful_mammals</td>
    <td>1</td>
    <td><input type="checkbox" name="book_review[approved]" id="approved" value="1" class="attribute_toggle"></td>
    <td><input type="checkbox" name="book_review[rejected]" id="rejected" value="1" class="attribute_toggle"></td>
    <td>February 27, 2019 03:56</td>
    <td><a href="/admin/new_book_reviews/984669?page=2">Show</a></td>
    <td>
        <span class="rest-in-place" data-attribute="review" data-object="book_review" data-url="/admin/new_book_reviews/984669">
bad
        </span>
    </td>
    </tr>
    <tr id="review_984670" class="striped">

Я использовал Selenium с Chrome, чтобы извлечь единственную таблицу на странице.

Table_Selenium_Elements = driver.find_element_by_xpath('//*[@id="admin"]/table')

Затем я использовал нижеприведенное для получения данных из каждой строки.

for Pri_Key, element in enumerate(Table_Selenium_Elements.find_elements_by_xpath('.//tr')):
# Create an empty secondary dict for each new Pri Key
    sec = {}
    # Secondary dictionary needs a Key. Keys are items in column_headers list
    for counter, Sec_Key in enumerate(column_headers):
        # Secondary dictionary needs Values for each key.
        # Values are individual items in each sub-list of column_data list
        # Slice the sub list with the counter to get each item
        sec[Sec_Key] = element.get_attribute('innerHTML')[counter]
    pri[Pri_Key] = sec

Это только показывает данные в каждом, то есть "weird_wild_and_wonderful_mammals", "1"

НО мне действительно нужныtr id = review_xxx.Я не знаю, как это сделать.Идентификационный номер изменяется, поэтому, возможно, xpath «содержит» выражение ИЛИ xpath «begin_with» выражение.

Так как я нуб, я думаю, что захватил review_ID, но я не извлекаю правильно через цикл for.

Может кто-нибудь показать мне правильный XPATH для извлечения родительского tr и дочернего tds.... и тогда я настрою цикл.Спасибо Сэм

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

На основе вашего HTML с примером ниже селекторов вы можете получить все строки:

admin_table_rows = driver.find_elements_by_css_selector(".admin tbody > tr")
admin_table_rows = driver.find_elements_by_css_selector(".admin tr[id^='review_']")
admin_table_rows = driver.find_elements_by_xpath("//table[@class='admin']//tr[starts-with(@id,'review_')]")

Чтобы получить атрибут id, вы можете использовать метод element.get_attribute("id").

Вот пример того, как выможет очистить данные:

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

wait = WebDriverWait(driver, 10)

admin_table_rows = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".admin tr[id^='review_']")))

for row in admin_table_rows:
    row_id = row.get_attribute("id").replace("review_", "")
    label = row.find_element_by_css_selector("td:nth-child(1)")
    num = row.find_element_by_css_selector("td:nth-child(2)")
    date = row.find_element_by_css_selector("td:nth-child(3)")
    href = row.find_element_by_css_selector("a").get_attribute("href")
0 голосов
/ 27 февраля 2019
driver.find_element_by_class_name('striped')

или

# If it is the last row in the table.
driver.find_elements_by_css_selector('tbody tr')[-1]

или

# If it is surely the 2nd row in the table.
driver.find_elements_by_css_selector('tbody tr')[1]
0 голосов
/ 27 февраля 2019

Вы просто запрашиваете xPath для нахождения самого элемента таблицы?

В вашем примере у вас есть xPath, который ищет таблицу у вас

[@id="admin"]

adminкласс, а не идентификатор.Это работает, если вы просто переключите это на

Table_Selenium_Elements = driver.find_element_by_xpath('//*[@id="admin"]/table')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...