【问题标题】:Web scraping: how extract the text (names) in the hyperlinks in a web page?网页抓取:如何提取网页超链接中的文本(名称)?
【发布时间】:2014-06-12 14:49:34
【问题描述】:

我是编程和 R 方面的新手。我需要一点帮助。我的请求很简单(我知道,我很惭愧),因为你会很快解决。我正在从事一个入侵植物物种项目,我需要此列表中的植物物种名称列表:http://www.issg.org/database/species/List.asp

物种的名称是超链接,我如何将名称提取到数据框或表格中?

我一直在使用下面的代码提取链接,但链接中的文本没有物种的名称:

url <- "http://www.issg.org/database/species/List.asp"
doc <- htmlParse(url)
links <- xpathSApply(doc, "//a/@href")

链接文本是这样的: 第一个物种(例如“ecology.asp?si=1590&amp;fr=1&amp;sts=&amp;lang=EN”) 第二种(例如“ecology.asp?si=1043&amp;fr=1&amp;sts=&amp;lang=EN”) ....

任何帮助将不胜感激。

【问题讨论】:

    标签: html r hyperlink web-scraping text-extraction


    【解决方案1】:

    只是对@jdharrison 出色答案的一个小小的、微不足道的修改。

    library(XML)
    url <- "http://www.issg.org/database/species/List.asp"
    doc <- htmlParse(url)
    links <- doc["//a[contains(@href,'ecology.asp?')]"]
    df    <- data.frame(names=sapply(links,xmlValue))
    head(df)
    #                   names
    # 1 Abelmoschus moschatus
    # 2     Abrus precatorius
    # 3       Acacia concinna
    # 4        Acacia confusa
    # 5     Acacia farnesiana
    # 6     Acacia longifolia
    

    所以事实证明你不需要使用xpathApply(...);您可以使用 [...] 中的 XPath “索引”XMLInternalDocument 对象。

    links <- doc["//a[contains(@href,'ecology.asp?')]"]
    

    这会生成满足 XPath 查询条件的节点的列表。然后,您可以使用sapply(...)xmlValue(...) 函数“应用”到列表中的每个元素。

    df    <- data.frame(names=sapply(links,xmlValue))
    

    我们使用sapply(...) 是因为我们想要一个向量作为结果,并在调用data.frame(...) 时将其扭曲为您要求的数据框。

    最后,我忍不住要评论一下这种“感到羞耻”的事情(尽管我确信我会后悔...)。您的问题提出得很好,简洁,有一个代码示例,您提供了您的数据集(通过链接),并且您清楚地说明了您想要的结果。我在 SO 上看到的问题中只有不到 1% 是这样的,所以你应该感到羞耻的反面。

    【讨论】:

    • 非常详细的解释。所以doc["//a[contains(@href,'ecology.asp?')]"]本质上是getNodeSet的伪装。
    • +1 有没有办法订阅你的指导性帖子@jlhoward :)
    • @jdharrison - 是的。在getNodeSet(...) 文档的(非常广泛的)示例的大约 3/4 处,此方法被标识为“语法糖”。我不知道它在其他任何地方都有描述......
    • @Osssan - 不确定这是否是您的意思,但如果您点击任何人的姓名,您会进入一个页面,其中列出了他们已回答的所有问题。不过,我不建议这样做,因为您会不必要地限制自己。
    • 谢谢你,也感谢@jdharrison。你们保存了我的项目:)
    【解决方案2】:

    您可以在锚标签中搜索字符串ecology.asp?,然后提取元素文本和 href 属性

    url <- "http://www.issg.org/database/species/List.asp"
    library(XML)
    doc <- htmlParse(url)
    links <- xpathApply(doc, "//a[contains(@href,'ecology.asp?')]"
                         , function(x){
                           data.frame(name = xmlValue(x), href = xmlGetAttr(x, "href"))
                         })
    > head(do.call(rbind.data.frame, links))
    name                                  href
    1 Abelmoschus moschatus   ecology.asp?si=15&fr=1&sts=&lang=EN
    2     Abrus precatorius ecology.asp?si=1609&fr=1&sts=&lang=EN
    3       Acacia concinna ecology.asp?si=1343&fr=1&sts=&lang=EN
    4        Acacia confusa  ecology.asp?si=191&fr=1&sts=&lang=EN
    5     Acacia farnesiana   ecology.asp?si=49&fr=1&sts=&lang=EN
    6     Acacia longifolia ecology.asp?si=1662&fr=1&sts=&lang=EN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2013-07-15
      • 2021-12-25
      • 2020-06-18
      相关资源
      最近更新 更多