【问题标题】:How do I scrape hyperlinks on a page using WatIn?如何使用 WatIn 抓取页面上的超链接?
【发布时间】:2011-11-19 03:11:20
【问题描述】:

我正在尝试使用 WatIn 收集超链接列表(链接到的 url)。我尝试使用:

            foreach (Link l in myIE.Links)
            {

                Links.Add(l.ToString());                    
            }


            string LinksCSV = string.Join(",", Links.ToArray());
            richTextBox2.Text = LinksCSV;

我正在尝试列出我的 Richtextbox 中的所有超链接,但是上面返回了超链接名称,所以它一遍又一遍地显示“链接”。

此外,我将只需要列出包含“webpage.php?id=”的网址/链接,然后再列出一个唯一编号。如何返回仅由包含“webpage.php?id="?

过滤的抓取的 url

更新: 这是一个更新的测试,可以使用其他站点,但不是我需要的站点。下面的代码有效。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WatiN.Core;


namespace ScrapeTest
{
class Program
{
    [STAThread]
        static void Main(string[] args)
    {
        IE ie = new IE();

        ie.GoTo("http://www.freesound.org/browse/tags/organ/");

        foreach (var currLink in ie.Links)
        {
            if (currLink.Url.Contains("sounds"))
            {
                Console.WriteLine("contains Edit in the link Url" + currLink.Url);
            }
        }

        Console.ReadLine();

    }

}

}

代码似乎是正确的,但它与我的特定网址和超链接的交互似乎是问题所在。我所关注的网站和超链接包含敏感信息,因此省略了。

使用我的网站 主页面 http://website.com 脚本运行,因此我将其发送到 http://website.com/data.php?search=%22%22&cat=0 的唯一页面存在问题 可能是因为网址中的 .php 吗? 如果有帮助,URL 也会存储在页面上,如下所示。

td class="alt2">
<a align="center" href="data.php?id=111111">EDIT</a>
/td>

更新和解决方案:由于某种原因,当我尝试使用 Url.Contains 方法时似乎会出现此问题。我最终所做的是将每个抓取的 Url 存储到一个列表中,并根据需要逐行测试我的列表以返回所需的 Url。非常感谢您的帮助。

【问题讨论】:

    标签: c# filter watin bots scrape


    【解决方案1】:

    在您的代码中myIE.LinksLinkCollection,这意味着当您遍历Link 对象时,您需要指定您想要的属性,在这种情况下它将是Url

    示例 - 访问 google.com 并将链接地址写入控制台。

        ie.GoTo("http://www.google.com");
    
        System.Threading.Thread.Sleep(5000);   //<-- Added due to diagnose what might be a timing issue.
    
        foreach (var currLink in ie.Links)
        {
            if (currLink.Url.Contains("www.google.com"))
            {
                Console.WriteLine("contains www.google.com in the link Url" + currLink.Url);
            }
        }
    

    在 WatiN 2.1、IE9、Win7 上测试。

    【讨论】:

    • 您的信息似乎应该回答我的问题,但是当我实施您的解决方案时,我不断收到错误:NullReferenceException:对象引用未设置为对象的实例。这发生在 if 语句中。我不明白为什么会抛出这个错误?
    • 使用您的确切示例有效,但如果我使用我自己的 GoTo url 和我的特定 Url.Contains,它就不起作用。当我用谷歌代替我的信息来检索时,我得到了 NullReferenceException。
    • 如果没有看到您的完整代码,我将无能为力,除了进行疯狂的猜测,其中包括您的“链接”对象未正确初始化。更新您的问题以包含您使用 www.google.com 失败的完整、完整的代码,我会看看。
    • 鉴于代码适用于一个站点而不适用于另一个站点,您的站点是否正在使用异步调用来构建至少一些页面?也许添加一个 Thread.Sleep() 以确保一切都已完成。休眠一个线程绝对不是等待异步调用完成的好方法,但它可以快速轻松地添加以进行诊断。请参阅上面的更新代码。
    • 不幸的是,合并睡眠代码并没有解决错误。我在 OP 中添加了更多细节。
    【解决方案2】:

    您可以通过使用Contains() 来做到这一点,如下所示

    foreach (Link l in myIE.Links)    
    {  
                if(l.ToString().Contains("webpage.php?id="))
                    Links.Add(l.ToString());  
    } 
    

    【讨论】:

    • 感谢您的回复,但是出现了 2 个问题。首先是使用 l.tostring() 方法返回单词“Link”而不是超链接“webpage.php?.id=”。第二个问题是,在我意识到第一个问题之后,我使用 Contains("Link") 测试了代码,它在 If 语句中给出了错误:NullReferenceException。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2020-01-23
    • 2020-08-19
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多