Web Scraping隐藏的html输入标签

时间:2018-05-17 19:25:29

标签: c# web-scraping

我正在使用c#winforms和工具箱中的WebBrowser Control来定期导航到一个url并抓取其数据。我已将事件webbrowser_documentcomplete事件绑定,并且在事件中我使用了该行

element.OuterText.Trim()

获取元素。一旦我有了HtmlElement,我就可以使用OuterText属性来查看元素中的内容了

<input id="MainRadGrid_ClientState" name="MainRadGrid_ClientState" type="hidden" /> </div>

我的问题是,即使我正在查看的输入类型设置为“隐藏”,上面的代码也能正常工作。事情似乎在这一点上发生了变化,我不再能够获得outertext值。有人可以帮助我获得元素的outertext或者只是进入隐藏元素来获取其数据

public void CTRL_PDF_Clicked(object sender, ClickedEventArgs e)
        {
            // Write your code here.
            bool exportDone = false;

            //Declare variables
            string fileName;
            string fileLocation;
            XPathNavigator nameNode;
            XPathNavigator folderNode;
            XPathNavigator timeNode;
            //Set the values for each variable
            nameNode = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:PDFName", NamespaceManager);
            folderNode = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:FolderLocation", NamespaceManager);
            fileName = nameNode.Value;
            fileLocation = folderNode.Value;


            //Do the work -- switch to the PDF view then export it as a PDF file.
            Microsoft.Office.InfoPath.View currentView = this.CurrentView;
            this.CurrentView.Export(@fileLocation + fileName + ".pdf", ExportFormat.Pdf);


            //Now set up the values for SharePoint
            string jobID = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:PostID", NamespaceManager).Value;
            string formPT = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:Total_PT", NamespaceManager).Value;
            string formBC = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:Total_BC", NamespaceManager).Value;
            string formSRS = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:Total_SRS", NamespaceManager).Value;
            string srsChoice = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:SRSOption", NamespaceManager).Value;
            string engName = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:Engineer/my:Engineer_Company", NamespaceManager).Value;


            // Now update the list item in SharePoint
            XPathNavigator batch = DataSources["Post CAML"].CreateNavigator();
            batch.SelectSingleNode("/Batch/Method/Field[@Name='ID']", NamespaceManager).SetValue(jobID);
            batch.SelectSingleNode("/Batch/Method/Field[@Name='EstimatedFeet']", NamespaceManager).SetValue(formPT);
            batch.SelectSingleNode("/Batch/Method/Field[@Name='BCEstFT']", NamespaceManager).SetValue(formBC);
            //batch.SelectSingleNode("/Batch/Method/Field[@Name='SRSEst']", NamespaceManager).SetValue(formSRS);
            batch.SelectSingleNode("/Batch/Method/Field[@Name='SRS']", NamespaceManager).SetValue(srsChoice);
            batch.SelectSingleNode("/Batch/Method/Field[@Name='Engineer']", NamespaceManager).SetValue(engName);

            string xmlPTEst = batch.SelectSingleNode("/Batch/Method/Field[@Name='EstimatedFeet']", NamespaceManager).Value;
            string xmlBCEst = batch.SelectSingleNode("/Batch/Method/Field[@Name='BCEstFT']", NamespaceManager).Value;
            string xmlSRSEst = batch.SelectSingleNode("/Batch/Method/Field[@Name='SRSEst']", NamespaceManager).Value;
            string xmlSRSVal = batch.SelectSingleNode("/Batch/Method/Field[@Name='SRS']", NamespaceManager).Value;

            WebServiceConnection wc = (WebServiceConnection)this.DataConnections["Web Service Submit"];

            wc.Execute();

            exportDone = true;

            if (exportDone == true)
            {
                MessageBox.Show("Export Done. Click OK to continue.");
            }

            // End your code here.
        }

2 个答案:

答案 0 :(得分:1)

根据页面作者的难度,可能会有困难。

输入类型='隐藏'是一回事,但可能有其他字段在视觉上隐藏了CSS样式或只是放在屏幕上。最后,可能会有一些值在页面提交时在最后一秒组成,因此您必须深入思考您想要的值。此外,在加载页面后,可能会打开,生成或删除某些字段,从而无法进行简单的抓取页面抓取。

但是对于类型为hidden的输入标记,XSLT搜索可以非常快速地为您提供这些节点的列表。

答案 1 :(得分:0)

您没有说明您的搜索方式,但一般来说,您的问题的答案应该是响亮的&#34;是。&#34;如果您正在抓取网页内容,这意味着您要下载由网络服务器发送到任何浏览器的相同内容(HTML源等)。在你的刮刀中,你不需要尊重&#34;隐藏&#34;样式或任何类型的东西。对于您的代码,它只是一个非常大的字符串或一系列字符串。你可以根据自己的需要解析它们。