【问题标题】:Scrape website links in R在 R 中抓取网站链接
【发布时间】:2018-09-13 06:59:06
【问题描述】:

当你在 R 中抓取链接时使用 rvest 或 RSelenium,你可以通过定义 HTML 代码的开始部分来做到这一点,例如给定节点内的 href。如果我遇到以下 2 个链接怎么办:

<a href="some_link" data-tracking="click_body" data-tracking-data='{"touch_point_button":"photo"}' data-featured-tracking="listing_no_promo">

<a href="some_link" data-tracking="click_body" data-tracking-data='{"touch_point_button":"photo"}' data-featured-tracking="listing_promo">

如您所见,它们仅在最后一部分有所不同。你知道我怎样才能抓住(定义)只有促销/无促销的链接吗?

【问题讨论】:

标签: r rvest rselenium


【解决方案1】:

使用xpathXML 库: 假设您正在寻找 no_promo 链接:

library(XML)
library(httr)
response <- GET(yourLink)
parsedoc <- htmlParse(response)
xpathSApply(parsedoc, "//a[@data-featured-tracking='listing_no_promo']", xmlGetAttr, "href")

或者如果您只是在 data-featured-tracking 参数中查找包含关键字“no_promo”的链接,那么最后一部分将是:

xpathSApply(parsedoc, "//a[contains(@data-featured-tracking, 'no_promo')]", xmlGetAttr, "href")

【讨论】:

    【解决方案2】:

    所以让我们将links 定义为包含 html 字符串的对象,例如

     links <- html_children(read_html("https://www.otodom.pl/sprzedaz/mieszkanie/"))
    

    然后您可以使用正则表达式来匹配这些字符串中的“promo”/“no_promo”,请参阅

    p1 <- grepl("promo", links, fixed = TRUE)
    p1
    [1] TRUE TRUE
    p2 <- grepl("no_promo", links, fixed = TRUE)
    p2
    [1] FALSE  TRUE
    

    所以links[p1] 包含所有包含“promo”的字符串(所以“no_promo”也是如此),links[p2] 包含所有包含“no_promo”的字符串。现在剩下的就是子集:

    promo <- links[p1-p2] # contains strings with promo but not with no_promo
    no.promo <- links[p2] # contains strings with no_promo
    

    【讨论】:

    • 任何想法如何通过 touch_point_button":"photo" ---> 结构从此类代码的 sn-p 中提取链接似乎是相同的,但是上面提出的解决方案似乎不起作用:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2014-12-25
    • 2020-06-30
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多