【问题标题】:R: rvest - getting nested text with rvestR: rvest - 使用 rvest 获取嵌套文本
【发布时间】:2015-05-22 23:46:51
【问题描述】:

问题:

从此网络中提取产品图片的 URL:

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

有些图片有一个属性“data-origin”,我可以拉取图片的url。问题是,有些产品没有这个属性。但他们在 src 属性中有我需要的 URL。

到目前为止:

1) 我可以获得具有“数据来源”属性的产品的网址。 2) 商品没有“data-origin”属性但src属性中有url时无法获取url。

#

注意事项:

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

1 个产品的示例:

正确网址: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,一个接一个。 这更接近我想要的。因为我需要获取页面上所有产品的 url。

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 属性中有我需要的 url。所以我使用:

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 NA NA [33] NA 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>

【问题讨论】:

  • 这里的问题是 html_attr("scr") 它应该是:html_attr("src")。我已经解决了。

标签: r rvest


【解决方案1】:
    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"

【讨论】:

  • 你是对的。我想我会这样做,然后使用一些文本操作来获得我需要的东西。我已经使用 html_nodes() 来获取所有元素的信息。但是该对象在类中:XMLNodeSet。我想我需要将其转换为列表,以便在其上使用 lapply 功能? (删除我不需要的额外文本?)
  • @OmarGonzales:这是另一个不在 OP 中的问题,请阅读this
  • 我知道,但是您的意见帮助我以正确的方式对问题进行建模。谢谢。我认为没有必要提出一个新问题。
  • 很公平。如果您尝试仅获取链接,则可以使用来自library(XML)getHTMLLinks("website")
  • 我已经尝试过了,但这不是我想要的。另外,我更喜欢用 rvest 来做这件事。我想我会提出一个新问题。
【解决方案2】:

这是问题的答案:

PC 将为您提供代码的图像部分的信息。在第 3 行中,您可以更具体地使用“img”来获取确切信息。

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

您会注意到某些元素在“data-original”属性中具有您想要的 url。而其他人将它放在“src”属性中。

示例“原始数据”:

[[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"/> 

示例“src”:

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

1 ) 使用此代码获取具有“src”属性中信息的元素的 url。

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

2 ) 使用此代码获取具有“data-original”属性中信息的元素的 url。

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

问题继续存在,因为我需要一个 if else 语句来确定在哪里使用“data-original”属性或“src”属性。我会为此提出一个新问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多