Веб-скрапинг данных внутри вкладки с использованием Rselenium

Я хочу очистить сводную таблицу в разделе «Статистика игрока» на следующей странице: https://www.sofascore.com/southampton-wolverhampton/dsV

Я пытаюсь использовать RSelenium для этой цели.

Вот мой код:

   rm=rsDriver(browser = "chrome", chromever  = "111.0.5563.64",
                verbose = F,
                port = free_port())
    
    rmDr=rm$client
    rmDr$open()
    rmDr$navigate("https://www.sofascore.com/southampton-wolverhampton/dsV")
    elem <- rmDr$findElement(using = 'xpath', '//button[@data-tabid = "summary"]')

Сводные данные появляются, когда я нажимаю кнопку «Сводка». Поэтому я использовал xpath для извлечения этой кнопки, как указано выше. Но это не сработало.

Не могли бы вы предложить какой-либо альтернативный способ?

Спасибо.

Это ошибка, которую я получил:

Selenium message:no such element: Unable to locate element: {"method":"xpath","selector":"//button[@data-tabid = "summary"]"}
  (Session info: chrome=111.0.5563.65)
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '4.0.0-alpha-2', revision: 'f148142cf8', time: '2019-07-01T21:30:10'
System info: host: 'DESKTOP-MOGN5AG', ip: '192.168.0.114', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '19.0.2'
Driver info: driver.version: unknown

Error:   Summary: NoSuchElement
     Detail: An element could not be located on the page using the given search parameters.
     class: org.openqa.selenium.NoSuchElementException
     Further Details: run errorDetails method

Вот снимок:

Что значит "не получилось"? Вы получили ошибку? Если это так, отредактируйте свой вопрос и добавьте полное сообщение об ошибке в виде текста в правильном формате. Если нет, объясните, что вы ожидали, но не произошло и т. д.

JeffC 01.04.2023 21:44

Я не вижу кнопки «Сводка» на странице, и CTRL+F тоже не находит результатов. Локатор также не находит соответствующий элемент. Нам потребуется более подробное описание кнопки, которую вы пытаетесь нажать, ее расположение на странице и, возможно, даже скриншот с обведенной кнопкой и т. д. Вы уверены, что дали нам правильный URL-адрес? Мы должны войти в учетную запись или?

JeffC 01.04.2023 21:47

Вы забыли упомянуть, что вам нужно нажать на кнопку «СТАТИСТИКА ИГРОКА», прежде чем вы увидите кнопку «Сводка». Как только я это сделал, твой локатор заработал нормально. Я предполагаю, что вам нужно добавить ожидание перед нажатием, потому что страница загружает много данных... эта кнопка, вероятно, сначала не существует.

JeffC 01.04.2023 23:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я щелкнул вкладку сводки, используя это

remDr$findElement(using = "css",value = ".fircAT > div:nth-child(2)")$clickElement()

Затем, после того, как страница переключилась на вкладки, я вытащил html страницы, а затем искал узел таблицы. Вот весь код:

# load libraries
library(RSelenium)
library(rvest)
library(magrittr)

# define target url
url <- "https://www.sofascore.com/southampton-wolverhampton/dsV"


# start RSelenium ------------------------------------------------------------

rD <- rsDriver(browser = "firefox", port=4550L, chromever = NULL)
remDr <- rD[["client"]]

# open the remote driver-------------------------------------------------------
remDr$open()

# Navigate to webpage -----------------------------------------------------
remDr$navigate(url)


# click on the summary tab ------------------------------------
remDr$findElement(using = "css",value = ".fircAT > div:nth-child(2)")$clickElement()



# pull the webpage html
# then read it
page_html <- remDr$getPageSource()[[1]] %>% 
  read_html() 



# find table elements
tables <- page_html %>% html_table()

summary_stats_table <- tables[[1]]

Вот как это выглядит:

summary_stats_table
# A tibble: 32 × 12
   ``    `+`    Goals Assists Tackles Acc. …¹ Duels…² Groun…³ Aeria…⁴ Minut…⁵ Posit…⁶
   <lgl> <chr>  <int>   <int>   <int> <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  
 1 NA    Moham…     0       0       4 22/32 … 11 (7)  6 (4)   5 (3)   90'     D      
 2 NA    Jan B…     0       0       2 19/30 … 6 (6)   2 (2)   4 (4)   90'     D      
 3 NA    Adama…     0       0       1 11/19 … 11 (7)  11 (7)  0 (0)   45'     F      
 4 NA    Craig…     0       0       1 54/61 … 12 (7)  4 (3)   8 (4)   90'     D      
 5 NA    João …     1       0       1 8/11 (… 7 (2)   5 (2)   2 (0)   20'     M      
 6 NA    Ainsl…     0       0       4 24/36 … 10 (9)  7 (6)   3 (3)   90'     D      
 7 NA    James…     0       0       0 35/42 … 8 (4)   5 (1)   3 (3)   90'     M      
 8 NA    João …     0       0       3 10/12 … 4 (3)   4 (3)   0 (0)   45'     M      
 9 NA    Carlo…     1       0       1 22/26 … 14 (4)  13 (4)  1 (0)   79'     M      
10 NA    Hugo …     0       0       1 19/20 … 5 (2)   3 (2)   2 (0)   45'     D      
# … with 22 more rows, 1 more variable: Rating <dbl>, and abbreviated variable names
#   ¹​`Acc. passes`, ²​`Duels (won)`, ³​`Ground duels (won)`, ⁴​`Aerial duels (won)`,
#   ⁵​`Minutes played`, ⁶​Position
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

Привет, спасибо за ваш ответ. Есть ли причина, по которой это не работает для хрома?

student_R123 01.04.2023 22:49

Не могли бы вы также объяснить использование «fircAT > div:nth-child(2)»? Спасибо

student_R123 01.04.2023 22:56
.fircAT > div:nth-child(2) нажимает кнопку «СТАТИСТИКА ИГРОКА», которая открывает панель «Сводка». Это селектор CSS... .fircAT — это имя класса (. указывает на класс), > означает дочерний элемент, а div:nth-child(2) означает второй (2) дочерний элемент DIV. Хотя я предпочитаю селекторы CSS, а не XPath, в данном случае я бы использовал //div[text()='Player statistics'], потому что он удобочитаем. Если что-то на странице изменится и мой локатор сломается, у меня будет лучшее представление о том, что я НАЖИМАЛ, чтобы я мог создать новый локатор... но это личное предпочтение.
JeffC 01.04.2023 23:24

Кроме того, это отлично работает для хрома. В его настройках, вероятно, уже установлен Firefox.

JeffC 01.04.2023 23:25

@JeffC, спасибо за объяснение селектора! Просто любопытно, почему вы предпочитаете селекторы CSS?

Russ 01.04.2023 23:36

CSS-селекторы @Russ выполняются быстрее, их синтаксис проще и легче читается, и они лучше поддерживаются браузером. Тем не менее, у XPath есть свое место ... это единственный способ найти элемент по содержащемуся тексту, и вы можете выполнять более сложные обходы DOM, чем с помощью селекторов CSS. Я предпочитаю ID, затем 90% всего остального — селекторы CSS, затем (в двух перечисленных выше ситуациях) я использую XPaths.

JeffC 01.04.2023 23:56

@Russ Прошу прощения за то, что задаю много вопросов. Я понял, что .fircAT > div:nth-child(2) используется для поиска вкладки статистики игрока после изучения вашего ответа. Не могли бы вы объяснить, как вы извлекаете только результаты на вкладке сводки? Потому что мне любопытно расширить ваш метод, чтобы очистить другие вкладки, такие как атака, а также защита. Еще раз спасибо

student_R123 02.04.2023 02:11

Инструменты веб-разработчика великолепны. Вот как я нахожу, какой селектор css выбрать. В вашем примере похоже, что вы можете нацелить этот селектор .iiSsIo, чтобы получить строку параметров вкладки, затем использовать html_children(), чтобы найти каждую вкладку, а затем передать дочерние элементы в цикл, который вы используете, чтобы щелкнуть каждую вкладку и извлечь таблицу.

Russ 02.04.2023 02:17

Другие вопросы по теме

Похожие вопросы