R:rvest - 用rvest

时间:2015-05-22 23:46:52

标签: r rvest

问题:

从此网站中提取产品图片的网址:

http://www.linio.com.pe/computacion/pc-escritorio/

某些图片具有“数据源”属性,我可以拉动图像的网址。问题是,有些产品没有这个属性。但是他们在src属性中有我需要的URL。

到目前为止:

1)我可以获得具有“data-origin”属性的产品的url。 2)当产品没有属性“data-origin”但在src属性中有url时,无法获取url。

注意事项:

源代码中有两个网址:有和没有。精灵。。 我不需要精灵部分的网址。

1个产品的示例:

Rigth网址:http://media.linio.com.pe/p/hp-1987-043329-1-catalog.jpg

可以在img标签或noscript部分找到。

错误的网址:http://media.linio.com.pe/p/hp-1987-043329-sprite.jpg

这是“sprite-hidden”类

更新1:

使用SelectorGadget它说我应该使用“.lazyImg”。但我没有得到我所期望的。

  PCimgs  <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
            html_nodes(".lazyImg")%>%
            html_text()

但我明白了:

[1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

更新2:

调查我看到有人可以一个接一个地使用两个html_nodes。 这更接近我想要的。因为我需要为页面上的所有产品提供网址。

PCs <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
    html_nodes(".product-item-img") %>%
    html_nodes("img")

但是,这给了我比需要更多的信息。所以我尝试了这个修改(感谢用户提出这个想法):

PCs <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
    html_nodes(".product-item-img") %>%
    html_nodes("img") %>%
    html_attr("data-original")

这很有效!部分:

我明白了:

 [1] "http://media.linio.com.pe/p/hp-1987-043329-1-catalog.jpg"      
 [2] NA                                                              
 [3] "http://media.linio.com.pe/p/hp-7585-499619-1-catalog.jpg"      
 [4] NA

这是因为某些元素具有属性:data-origin,而其他元素则没有。但他们在scr attrbute中有我需要的网址。所以我用:

PCs <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
    html_nodes(".product-item-img") %>%
    html_nodes("img") %>%
    html_attr("scr")

但我明白了:

> PCs

[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [33] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

任何帮助?

这是页面(http://www.linio.com.pe/computacion/pc-escritorio/

的源代码
        <ul class="product-items" id="catalog-items">
              <li id="HP016EL59NXCPEAMZ" class="product-item " itemscope itemtype="http://schema.org/Product" data-badge="badgeDivFalse">
            <a id="1:HP016EL59NXCPEAMZ" href="http://www.linio.com.pe/HP---Desktop-All-in-One-Intel-Celeron-18.5-500GB-4GB---Plateado-Negro-923340.html" title="HP - Desktop All-in-One Intel Celeron 18.5'' 500GB 4GB - Plateado/Negro">
        <ul>
            <li class="product-item-img" style="position: relative;">
                <span class="lazyImage">
                    <span style="width:160px;height:160px;" class="itm-imageWrapper itm-imageWrapper-HP016EL59NXCPEAMZ">
                        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII="
                            data-original="http://media.linio.com.pe/p/hp-1987-043329-1-catalog.jpg"
                            width="160"
                            height="160" class="itm-img lazyImg"
                            onerror="catalog.onError($(this)); this.width=160">

                        <noscript>
                            <img
                                src="http://media.linio.com.pe/p/hp-1987-043329-1-catalog.jpg"
                                class="itm-img"
                                width="160"
                                height="160"
                            >
                        </noscript>
                                                </span>
                                                <span class="sprite hidden">http://media.linio.com.pe/p/hp-1987-043329-sprite.jpg</span>
                                        </span>
                                </li>

2 个答案:

答案 0 :(得分:3)

    PCs <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
    html_node("span.itm-imageWrapper.itm-imageWrapper-HP016EL59NXCPEAMZ img")%>%
    html_attr("data-original")
[1] "http://media.linio.com.pe/p/hp-1987-043329-1-catalog.jpg"

答案 1 :(得分:0)

这是问题的答案:

PC将为您提供代码图像部分的信息。在第3行中,您可以更具体,并使用&#34; img&#34;获得确切的信息。

PCs <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
    html_nodes(".product-item-img") %>%
    html_nodes("img")

您会注意到某些元素在&#34; data-original&#34;中包含了您想要的网址。 attribut。其他人会在&#34; src&#34;属性。

示例&#34;数据原创&#34;:

[[47]]
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=" data-original="http://media.linio.com.pe/p/epson-9425-1474711-1-catalog.jpg" width="160" height="160" class="itm-img lazyImg" onerror="catalog.onError($(this)); this.width=160"/> 

示例&#34; src&#34;:

 [[46]]
<img src="http://media.linio.com.pe/p/lg-6587-168029-1-catalog.jpg" class="itm-img" width="160" height="160"/> 

1)使用此代码获取元素的网址,其中包含&#34; src&#34;属性。

   PCs2 <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
            html_nodes(".product-item-img") %>%
            html_nodes("img") %>%
            html_attr("src")

2)使用此代码获取元素的网址,其中包含&#34; data-original&#34;属性。

PCs3 <- html("http://www.linio.com.pe/computacion/pc-escritorio/")%>%
        html_nodes(".product-item-img") %>%
        html_nodes("img") %>%
        html_attr("data-original")

问题仍在继续,因为我需要一个if else语句来确定在哪里使用&#34; data-original&#34; attr或者&#34; src&#34; attribbut。我会为此提出一个新问题。