Веб-скрапинг с помощью rvest

Я пытаюсь сделать веб-скрейпинг на следующую веб-страницу с помощью rvest: https://www.superu.ad/oli-de-girasol_c360259/

Но похоже, что rvest (R) не может найти некоторые селекторы css, которые уже существуют в URL-адресе, например .product-name

webpage<-read_html('https://www.superu.ad/oli-de-girasol_c360259/')
rank_data_html <- html_nodes(webpage,'.product-name') #returns nothing

Я ожидаю вывод различных названий продуктов, которые появляются в URL-адресе, но фактический вывод равен нулю.

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

Ответы 2

Я экспериментировал с python и обнаружил, что это зависит от парсера. Если бы я использовал lxml, это не удалось. Это я использовал html.parser, это сработало. Это часто происходит, когда документ не идеально сформирован. Другой парсер == другой результат. Например, некоторые элементы в конечном итоге игнорируются.

Чтобы подтвердить это, я поместил URL в

https://validator.w3.org/

то есть

https://validator.w3.org/nu/?doc=https%3A%2F%2Fwww.superu.ad%2Foli-de-girasol_c360259%2F

На этой странице есть ряд ошибок, которые могут быть замешаны.

Может быть, это вам как-то пригодится? Не знаете, какие варианты у вас есть для разных парсеров/пакетов, которые могли бы лучше справиться с этой ситуацией, будьте более снисходительны.

Пример с python (извинения)

Работает:

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.superu.ad/oli-de-girasol_c360259/')
soup = bs(r.content, 'html.parser')
products = [item.text for item in soup.select('.product-name')]
print(products)

Не удается

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.superu.ad/oli-de-girasol_c360259/')
soup = bs(r.content, 'lxml')
products = [item.text for item in soup.select('.product-name')]
print(products)
Ответ принят как подходящий

Это должно сделать работу:

library(rvest)
library(dplyr) # to use the pipes %>%
webpage = read_html('https://www.superu.ad/oli-de-girasol_c360259/')
product_names = webpage %>% 
html_nodes(xpath= '//*[contains(concat( " ", @class, " " ), concat( " ", "product-name", " " ))]') %>%
html_text()

product_names

Вы должны использовать Xpath с rvest, он работает лучше, чем селекторы CSS.

Чтобы получить Xpath, вы можете использовать расширение SelectorGadget для Chrome (вы можете переключиться на Xpath).

Не могли бы вы объяснить, почему xpath работает лучше, чем селекторы css? В этом случае я думаю, что это может быть связано с типом контента application/xhtml+xml; charset=utf-8, но в целом так ли это на самом деле?

QHarr 25.05.2019 20:50

Честно говоря, я не знаю почему, это просто опыт использования rvest. Может быть, это потому, что вы должны сначала использовать символ # в своем селекторе css. Посмотрите здесь: stat4701.github.io/edav/2015/04/02/rvest_tutorial

Alexandre georges 25.05.2019 21:14

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