Я хочу очистить сводную таблицу в разделе «Статистика игрока» на следующей странице: 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
Вот снимок:
Я не вижу кнопки «Сводка» на странице, и CTRL+F тоже не находит результатов. Локатор также не находит соответствующий элемент. Нам потребуется более подробное описание кнопки, которую вы пытаетесь нажать, ее расположение на странице и, возможно, даже скриншот с обведенной кнопкой и т. д. Вы уверены, что дали нам правильный URL-адрес? Мы должны войти в учетную запись или?
Вы забыли упомянуть, что вам нужно нажать на кнопку «СТАТИСТИКА ИГРОКА», прежде чем вы увидите кнопку «Сводка». Как только я это сделал, твой локатор заработал нормально. Я предполагаю, что вам нужно добавить ожидание перед нажатием, потому что страница загружает много данных... эта кнопка, вероятно, сначала не существует.
Я щелкнул вкладку сводки, используя это
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
Привет, спасибо за ваш ответ. Есть ли причина, по которой это не работает для хрома?
Не могли бы вы также объяснить использование «fircAT > div:nth-child(2)»? Спасибо
.fircAT > div:nth-child(2)
нажимает кнопку «СТАТИСТИКА ИГРОКА», которая открывает панель «Сводка». Это селектор CSS... .fircAT
— это имя класса (.
указывает на класс), >
означает дочерний элемент, а div:nth-child(2)
означает второй (2)
дочерний элемент DIV. Хотя я предпочитаю селекторы CSS, а не XPath, в данном случае я бы использовал //div[text()='Player statistics']
, потому что он удобочитаем. Если что-то на странице изменится и мой локатор сломается, у меня будет лучшее представление о том, что я НАЖИМАЛ, чтобы я мог создать новый локатор... но это личное предпочтение.
Кроме того, это отлично работает для хрома. В его настройках, вероятно, уже установлен Firefox.
@JeffC, спасибо за объяснение селектора! Просто любопытно, почему вы предпочитаете селекторы CSS?
CSS-селекторы @Russ выполняются быстрее, их синтаксис проще и легче читается, и они лучше поддерживаются браузером. Тем не менее, у XPath есть свое место ... это единственный способ найти элемент по содержащемуся тексту, и вы можете выполнять более сложные обходы DOM, чем с помощью селекторов CSS. Я предпочитаю ID, затем 90% всего остального — селекторы CSS, затем (в двух перечисленных выше ситуациях) я использую XPaths.
@Russ Прошу прощения за то, что задаю много вопросов. Я понял, что .fircAT > div:nth-child(2) используется для поиска вкладки статистики игрока после изучения вашего ответа. Не могли бы вы объяснить, как вы извлекаете только результаты на вкладке сводки? Потому что мне любопытно расширить ваш метод, чтобы очистить другие вкладки, такие как атака, а также защита. Еще раз спасибо
Инструменты веб-разработчика великолепны. Вот как я нахожу, какой селектор css выбрать. В вашем примере похоже, что вы можете нацелить этот селектор .iiSsIo
, чтобы получить строку параметров вкладки, затем использовать html_children()
, чтобы найти каждую вкладку, а затем передать дочерние элементы в цикл, который вы используете, чтобы щелкнуть каждую вкладку и извлечь таблицу.
Что значит "не получилось"? Вы получили ошибку? Если это так, отредактируйте свой вопрос и добавьте полное сообщение об ошибке в виде текста в правильном формате. Если нет, объясните, что вы ожидали, но не произошло и т. д.