用rvest进行网页抓取

时间:2019-05-24 19:25:17

标签: r web-scraping rvest

我正在尝试使用rvest将网页抓取到以下网页: https://www.superu.ad/oli-de-girasol_c360259/

但是看来rvest(R)无法找到URL中已经存在的某些CSS选择器,例如.product-name

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

我希望出现在url中的不同产品名称的输出,但实际输出为空。

2 个答案:

答案 0 :(得分:2)

这应该可以完成工作:

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,您可以使用适用于Chrome的SelectorGadget扩展程序(可以切换到Xpath)。

答案 1 :(得分:1)

我在python中进行了实验,发现它取决于解析器。如果我使用lxml,它将失败。我使用html.parser起作用了。当文档的格式不正确时,通常会发生这种情况。不同的解析器==不同的结果。例如,某些元素最终被忽略了。

为确认这一点,我将网址放入

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)