从网页获取信息

时间:2011-04-11 19:04:05

标签: c# screen-scraping

我不是真正的程序员(更多的是脚本编写者),并使用AutoIt编写了一个非常快速的脚本!从惠普网站上收集有关我们所拥有的计算机列表的信息。我想我会尝试将它移植到C#以使它更“专业”。

代码读入包含产品代码,序列号的文件。然后它将此信息放入datagridview。有三列,第三列是开始日期(我正在寻找的)。

以下是我到目前为止的情况。从这里开始,我迷失了下一步该做什么。该网页确实转到下一页,但我不明白如何获取我需要的信息(第一个开始日期 - 即保修开始的时间)。在AutoIt中!它是第19帧,然后我解析了它。我只是不知道如何在C#中做到这一点。

任何指针都会非常感激。

    private void runner(int i)
    {
        int j = i;
        bool loadFinished = false;

        webBrowser1.DocumentCompleted += delegate { loadFinished = true; };
        webBrowser1.Navigate("http://www11.itrc.hp.com/service/ewarranty/warrantyInput.do");

        while (!loadFinished )
        {
            Thread.Sleep(100);
            Application.DoEvents();
        }

        webBrowser1.Document.GetElementById("productnumber").InnerText = dt.Rows[j][0].ToString();
        webBrowser1.Document.GetElementById("serialnumber1").InnerText = dt.Rows[j][1].ToString();

        HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("SELECT");
        foreach (HtmlElement elem in elems)
        {
            if (elem.Name.ToString() == "country")
            {
                elem.SetAttribute("value", "US");
            }
        }

        int countelement = 0;
        HtmlElementCollection col = webBrowser1.Document.GetElementsByTagName("INPUT");
        foreach (HtmlElement element in col)
        {
            if (element.Name.ToString() == "")
            {
                if (countelement == 1)
                {
                    element.InvokeMember("click");
                }
                countelement++;
            }
        }
        dt.Rows[j][2] = "done";

    }`

2 个答案:

答案 0 :(得分:0)

我真的无法帮助你(因为我从未做过你现在正在做的事情)但我认为 watin 自动化库可以帮助你显着

答案 1 :(得分:0)

我想我明白了。在提交按钮上的单击事件之后,我需要暂停以等待加载新页面。即使我看到了新的网页,该程序已经转移到下一个命令。查看调试中的变量我可以看到它是旧页面。下面是我使用的代码。

在我弄清楚网页加载后,我已经知道它是第19帧了。从那里开始只是将字符串转换为行数组然后循环查找第一个开始日期并提取该信息的问题。

        private void runner(int i)
    {
        int j = i;
        bool loadFinished = false;

        webBrowser1.DocumentCompleted += delegate { loadFinished = true; };
        webBrowser1.Navigate("http://www11.itrc.hp.com/service/ewarranty/warrantyInput.do");

        while (!loadFinished )
        {
            Thread.Sleep(100);
            Application.DoEvents();
        }

        webBrowser1.Document.GetElementById("productnumber").InnerText = dt.Rows[j][0].ToString();
        webBrowser1.Document.GetElementById("serialnumber1").InnerText = dt.Rows[j][1].ToString();

        HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("SELECT");
        foreach (HtmlElement elem in elems)
        {
            if (elem.Name.ToString() == "country")
            {
                elem.SetAttribute("value", "US");
            }
        }

        int countelement = 0;
        HtmlElementCollection col = webBrowser1.Document.GetElementsByTagName("INPUT");
        foreach (HtmlElement element in col)
        {
            if (element.Name.ToString() == "")
            {
                if (countelement == 1)
                {
                    element.InvokeMember("click");
                    do
                    {
                        Application.DoEvents();
                    } while (webBrowser1.IsBusy);
                }
                countelement++;
            }
        }

        string output = "";
        int county = 0;
        HtmlElementCollection elly = webBrowser1.Document.GetElementsByTagName("TABLE");
        foreach (HtmlElement el in elly)
        {
            if (county == 19)
            {
                string[] lines = el.InnerText.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                foreach (string line in lines)
                {
                    if (line.IndexOf("Start Date") != -1)
                    {
                        output = line.ToString();
                        dt.Rows[j][2] = output.Remove(0, 10);
                        break;
                    }

                }

            }
            county++;
        }

    }