【问题标题】:Site scraping with F# and Canopy使用 F# 和 Canopy 进行站点抓取
【发布时间】:2014-05-09 23:10:03
【问题描述】:

我正在尝试使用 F# 和 Canopy 编写一个简单的爬虫(请参阅 http://lefthandedgoat.github.io/canopy/)。我正在尝试从具有“.application-tile”类的所有元素中提取文本。但是,在下面的代码中,我收到以下构建错误,我不明白。

This expression was expected to have type
    OpenQA.Selenium.IWebElement -> 'a    
but here has type
    OpenQA.Selenium.IWebElement

知道为什么会这样吗?谢谢!

open canopy
open runner
open System

[<EntryPoint>]
let main argv = 
    start firefox

    "taking canopy for a spin" &&& fun _ ->
        url "https://abc.com/"

        // Login Page
        "#i0116" << "abc@abc.com"
        "#i0118" << "abc"
        click "#abcButton"

        // Get the Application Tiles -- BUILD ERROR HAPPENS HERE
        elements ".application-tile" |> List.map (fun tile -> (tile |> (element ".application-name breakWordWrap"))) |> ignore

    run()

【问题讨论】:

  • 你想用你的 List.map 完成什么?
  • 我正在尝试从每个元素中获取文本/内容。

标签: f# canopy-web-testing


【解决方案1】:
open canopy
open runner

start firefox

"taking canopy for a spin" &&& fun _ ->
    url "http://lefthandedgoat.github.io/canopy/testpages/"

    // Get the tds in tr
    let results = elements "#value_list td" |> List.map read

    //or print them using iter
    elements "#value_list td" 
        |> List.iter (fun element -> System.Console.WriteLine(read element))

run()

这应该可以满足您的需求。

canopy 有一个名为“read”的函数,它接收一个选择器或一个元素。由于您从“元素“选择器”中获得了所有这些元素,因此您可以映射读取列表。

List.map 接收一个函数,运行它,并返回一个结果列表。 (在 C# 中类似的元素。选择(x => 读取(x)) List.iter 与 .foreach(x => System.Console.Writeline(read(x))

相同

【讨论】:

    【解决方案2】:

    我相信错误发生在您的 List.map 调用中的投影 lambda 中。从树冠文档 elements 返回匹配 css 选择器或文本的所有元素。 element 获取具有给定 css 选择器或文本的元素。

    因此,您在这里获得了与选择器“.application-tile”匹配的元素列表。 List.map 需要一个 lambda,它接受一个 IElement(元素中包含的类型),它将把它投影到一个新的形式(通用的 'a)中。

    我对这个框架了解不多,但我不确定你为什么要获取一个元素,然后将它传递到另一个对元素的调用中。

    进一步查看文档,我们发现了 read 函数: “读取元素的文本(或值或选定选项)。”这是你想要的吗?

    【讨论】:

    • “读取元素的文本(或值或选定的选项)。”这是你想要的吗? - 是的。这正是我想要的。我的理解是“元素”将返回所有具有“.application-tile”类的元素,我想要一个包含找到的每个元素的内容/文本的集合。
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多