Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 从组合框中选择后从网页获取href_Excel_Vba_Web Scraping_Combobox - Fatal编程技术网

Excel 从组合框中选择后从网页获取href

Excel 从组合框中选择后从网页获取href,excel,vba,web-scraping,combobox,Excel,Vba,Web Scraping,Combobox,我正试图从中提取数据”https://beacon.schneidercorp.com/“并需要实现: 在州组合框中设置“Iowa”,在县/市/地区组合框中设置“Adair County,IA” 打开“属性搜索”按钮 单击“属性搜索”按钮,进入下一页 所有这些之后,浏览器将进入“https://beacon.schneidercorp.com/Application.aspx?AppID=1034&LayerID=22042&PageTypeID=2&PageID=9328“这是我的主要目标 我

我正试图从中提取数据”https://beacon.schneidercorp.com/“并需要实现:

  • 在州组合框中设置“Iowa”,在县/市/地区组合框中设置“Adair County,IA”
  • 打开“属性搜索”按钮
  • 单击“属性搜索”按钮,进入下一页
  • 所有这些之后,浏览器将进入“https://beacon.schneidercorp.com/Application.aspx?AppID=1034&LayerID=22042&PageTypeID=2&PageID=9328“这是我的主要目标

    我填写了组合框(tagname=“option”),但出现了下一个问题:

    a。我要单击以进入下一页的属性搜索不会弹出,直到我实际单击并在县/市/地区组合框中选择一个选项

    这是填充组合框的例程

    Sub extraccionCondados2()
       Dim IE As New SHDocVw.InternetExplorer
       Dim htmlDoc As MSHTML.HTMLDocument
       Dim htmlElementos As MSHTML.IHTMLElementCollection
       Dim htmlElemento As MSHTML.IHTMLElement
       
       IE.Visible = True
       IE.navigate "https://beacon.schneidercorp.com/"
        
       Do While IE.readyState <> READYSTATE_COMPLETE
          DoEvents
       Loop
       
       Set htmlDoc = IE.document
       Set htmlElementos = htmlDoc.getElementsByClassName("form-control input-lg")
       htmlElementos(0).Value = "Iowa" 'POPULATES THE STATE COMBOBOX
       htmlElementos(1).Value = "1034" 'POPULATES THE COUNTY/CITY/AREA WITH THE RIGHT VALUE
       htmlElementos(1).Click 'IN THIS CASE THIS LINE DOESN'T DO ANYTHING
       'I'VE TRIED WORKING WITH htmlElementos CHILDREN BUT DIDN'T FIND A WAY TO DO IT
    End Sub
    
    Sub-extracionncondados2()
    Dim IE作为新的SHDocVw.InternetExplorer
    将htmlDoc设置为MSHTML.HTMLDocument
    将HtmlLementTos设置为MSHTML.iHtmlLementCollection
    将htmlElemento设置为MSHTML.IHTMLElement
    可见=真实
    即“导航”https://beacon.schneidercorp.com/"
    在IE.readyState readyState\u完成时执行此操作
    多芬特
    环
    设置htmlDoc=IE.document
    设置htmlElementos=htmlDoc.getElementsByClassName(“表单控制输入lg”)
    htmlElementos(0).Value=“Iowa”填充状态组合框
    htmlElementos(1).Value=“1034”用正确的值填充县/市/地区
    htmlElementos(1)。单击“在本例中,此行不起任何作用。”
    我曾尝试与htmlElementos的孩子们一起工作,但没有找到一种方法
    端接头
    
    b。我要找的href在属性搜索被带到视图之前不会出现

    显示属性搜索之前,id=“quickstartList”为空

    id=“quickstartList”在显示属性搜索后获得了新的子项,并且具有我的目标URL


    如何打开属性搜索按钮,或者更好地在第二张图像上获取href?

    每次从组合框中选择后,必须触发更改事件:

    Sub extraccionCondados2()
      Dim IE As New SHDocVw.InternetExplorer
      Dim htmlDoc As MSHTML.htmlDocument
      Dim htmlElementos As MSHTML.IHTMLElementCollection
      Dim htmlElemento As MSHTML.IHTMLElement
      Dim urlFromPropertySearchButton As String
    
      IE.Visible = True
      IE.navigate "https://beacon.schneidercorp.com/"
      Do While IE.readyState <> 4: DoEvents: Loop
    
      Set htmlDoc = IE.document
      Set htmlElementos = htmlDoc.getElementsByClassName("form-control input-lg")
    
      'Select state and trigger html change event of the combobox
      htmlElementos(0).Value = "Iowa"
      Call TriggerEvent(htmlDoc, htmlElementos(0), "change")
    
      'Select country/city/area and trigger html change event of the combobox
      htmlElementos(1).Value = "1034"
      Call TriggerEvent(htmlDoc, htmlElementos(1), "change")
    
      'Get property search button
      Set htmlElemento = htmlDoc.getElementsByClassName("list-group-item track-mru")(0)
    
      'If needed as string read url
      urlFromPropertySearchButton = htmlElemento.href
      'You have the url before clicking the button
      MsgBox urlFromPropertySearchButton
    
      'If you want to open the page for selection
      htmlElemento.Click
    End Sub
    

    必须在组合框中的每个选择之后触发更改事件:

    Sub extraccionCondados2()
      Dim IE As New SHDocVw.InternetExplorer
      Dim htmlDoc As MSHTML.htmlDocument
      Dim htmlElementos As MSHTML.IHTMLElementCollection
      Dim htmlElemento As MSHTML.IHTMLElement
      Dim urlFromPropertySearchButton As String
    
      IE.Visible = True
      IE.navigate "https://beacon.schneidercorp.com/"
      Do While IE.readyState <> 4: DoEvents: Loop
    
      Set htmlDoc = IE.document
      Set htmlElementos = htmlDoc.getElementsByClassName("form-control input-lg")
    
      'Select state and trigger html change event of the combobox
      htmlElementos(0).Value = "Iowa"
      Call TriggerEvent(htmlDoc, htmlElementos(0), "change")
    
      'Select country/city/area and trigger html change event of the combobox
      htmlElementos(1).Value = "1034"
      Call TriggerEvent(htmlDoc, htmlElementos(1), "change")
    
      'Get property search button
      Set htmlElemento = htmlDoc.getElementsByClassName("list-group-item track-mru")(0)
    
      'If needed as string read url
      urlFromPropertySearchButton = htmlElemento.href
      'You have the url before clicking the button
      MsgBox urlFromPropertySearchButton
    
      'If you want to open the page for selection
      htmlElemento.Click
    End Sub
    

    以您的目标网站为例,提供一些关于使用MSXML2.ServerHTTP对象自动执行web抓取的建议

    首先,你可以在问题中找到你想要的页面,如下所示:

    Sub Example1()
    
    Dim con As New MSXML2.ServerXMLHTTP60 ' A web request object - must add project reference to "Microsoft XML, V6.0" in Tools > References
    
        ' Opens a new GET request (no hidden info) for the url
        con.Open "GET", "https://beacon.schneidercorp.com/Application.aspx?AppID=1034&PageTypeID=2"
        con.setRequestHeader "Content-type", "application/x-www-form-urlencoded" ' set a standard content-type for the request
        con.send searchBody ' Send the request
    
        MsgBox con.responseText
    
    End Sub
    
    注意,在URL中,我只需要为Adair county添加
    AppID=1034
    ,为property search添加
    PageTypeID=2
    (我认为PageTypeID 1是地图)。只需查看HTML,您就可以从主页上获得AppID的完整列表(我想您已经知道了如何做到这一点)。MsgBox只显示
    con
    对象已将响应作为html文档返回

    在处理项目并帮助调试和查看html时,如果您想在空闲时查看请求的任何响应,我将使用以下函数将字符串保存为文本文件:

    Sub WriteToFile(s As String, n As String)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim oFile As Object
    Set oFile = fso.CreateTextFile(n)
    oFile.WriteLine s
    oFile.Close
    Set fso = Nothing
    Set oFile = Nothing
    End Sub
    
    因此,对于上面的代码,我会在最后调用该函数,将响应保存为文本文件,我可以使用notepad++将其作为HTML查看。您也可以在F12开发工具中查看html而不保存它

    下面我还包含了一个
    HTMLdocument
    对象,我将响应放入其中

    Sub Example2()
    
    Dim con As New MSXML2.ServerXMLHTTP60 ' A web request object - must add project reference to "Microsoft XML, V6.0" in Tools > References
    Dim html As New HTMLDocument ' An html document to hold responses, used to parse info - add reference to "Microsoft HTML Object Library"
    
        ' Opens a new GET request (no hidden info) for the url
        con.Open "GET", "https://beacon.schneidercorp.com/Application.aspx?AppID=1034&PageTypeID=2"
        con.setRequestHeader "Content-type", "application/x-www-form-urlencoded" ' set a standard content-type for the request
        con.send searchBody ' Send the request
    
        WriteToFile con.responseText, "C:\Users\JamHeadArt\Documents\responseText.txt"
        html.body.innerhtml = con.responseBody
    
    End Sub
    
    填充了
    html
    文档后,您可以使用
    getElementByID
    之类的工具来帮助解析结果等。这只是另一种XML形式,因此您可以遍历节点并通过子/父关系等查找内容


    使用F12开发工具

    我可以用F12开发工具在网络下找到这些东西。在点击搜索按钮之前,只需清除网络流量,然后当你点击搜索时,你会看到一堆请求。第一个请求通常是您想要签出并基本模拟的请求(其余的请求将是javascript触发、css、图像和一般内容)。任何请求都有一个URL,如果是post请求,有时还有一个正文

    在不涉及太多细节的情况下,您通常可以跳过一大堆搜索步骤和页面,通过了解最终搜索的结构和参数来获取所需信息,对网站进行一次访问,返回的信息直接解析为Excel。没有使用浏览器,速度快得多


    选择Iowa后,您是否在html中找到包含所有选项值的下拉列表的html

    <optgroup label="Iowa">
        <option value="1034">Adair County,  IA</option>
        <option value="78">Allamakee County, IA</option>
        <option value="165">Ames, IA</option>
        <option value="96">Audubon County, IA</option>
        <option value="83">Benton County, IA</option>
        <option value="84">Boone County, IA</option>
        <option value="330">Bremer County, IA</option>
        <option value="1015">Buena Vista County,  IA</option>
        <option value="215">Cass County, IA</option>
        <option value="408">Cerro Gordo County, IA</option>
        <option value="501">Cherokee County, IA</option>
        <option value="47">Chickasaw County, IA</option>
        <option value="29">City of Ames, IA - Traffic Accident Database</option>
        <option value="933">City of Cascade, IA</option>
        <option value="516">City of Estherville, IA</option>
        <option value="1061">City of Sigourney, IA</option>
        <option value="1043">Clay County,  IA</option>
        <option value="227">Clayton County, IA</option>
        <option value="375">Clinton County, IA</option>
        <option value="909">Dallas County,  IA</option>
        <option value="49">Davis County, IA</option>
        <option value="72">Delaware County, IA</option>
        <option value="376">Dickinson County, IA</option>
        <option value="93">Dubuque County, IA</option>
        <option value="15">Emmet County, IA</option>
        <option value="79">Fayette County, IA</option>
        <option value="82">Floyd County, IA</option>
        <option value="150">Franklin County, IA</option>
        <option value="825">Fremont County,  IA</option>
        <option value="1064">Greene County,  IA</option>
        <option value="3">Grundy County, IA</option>
        <option value="395">Guthrie County, IA</option>
        <option value="140">Hardin County, IA</option>
        <option value="44">Harrison County, IA</option>
        <option value="60">Henry County, IA</option>
        <option value="617">Humboldt County, IA</option>
        <option value="80">Jackson County, IA</option>
        <option value="325">Jasper County, IA</option>
        <option value="1037">Jefferson County,  IA</option>
        <option value="86">Johnson County, IA</option>
        <option value="164">Jones County, IA</option>
        <option value="81">Keokuk County, IA</option>
        <option value="177">Lee County, IA</option>
        <option value="54">Louisa County, IA</option>
        <option value="594">Lyon County, IA</option>
        <option value="406">Madison County, IA</option>
        <option value="25">Mahaska County, IA</option>
        <option value="70">Marion County, IA</option>
        <option value="1026">Marshall County,  IA</option>
        <option value="410">Mason City, IA</option>
        <option value="153">Mills County, IA</option>
        <option value="929">Mitchell County,  IA</option>
        <option value="21">Montgomery County, IA</option>
        <option value="12">Muscatine Area Geographic Information Consortium (MAGIC)</option>
        <option value="331">O'Brien County, IA</option>
        <option value="611">Osceola County, IA</option>
        <option value="220">Page County, IA</option>
        <option value="218">Palo Alto County, IA</option>
        <option value="1012">Plymouth County,  IA</option>
        <option value="144">Pocahontas County, IA</option>
        <option value="135">Poweshiek County, IA</option>
        <option value="508">Ringgold County, IA</option>
        <option value="75">Sac County, IA</option>
        <option value="1024">Scott County / City of Davenport, Iowa</option>
        <option value="11">Shelby County, IA</option>
        <option value="10">Sioux City, IA</option>
        <option value="984">Sioux County,  IA</option>
        <option value="165">Story County, IA / City of Ames</option>
        <option value="225">Union County, IA</option>
        <option value="595">Wapello County, IA</option>
        <option value="9">Warren County, IA</option>
        <option value="1036">Washington County,  IA</option>
        <option value="723">Webster County, IA</option>
        <option value="73">Winnebago County, IA</option>
        <option value="110">Winneshiek County, IA</option>
        <option value="10">Woodbury County, IA / Sioux City</option>
        <option value="588">Worth County, IA</option>
        <option value="399">Wright County, IA</option>
    </optgroup>
    
    
    阿代尔县
    阿拉马凯县
    艾姆斯,伊利诺伊州
    伊利诺伊州奥杜邦县
    宾夕法尼亚州本顿县
    印第安纳州布恩县
    伊利诺伊州布雷默县
    印第安纳州布埃纳维斯塔县
    加利福尼亚州卡斯县
    乔治亚州塞罗戈多县
    伊利诺伊州切罗基县
    乔治亚州契克索县
    伊利诺伊州艾姆斯市-交通事故数据库
    喀斯喀特市
    伊利诺伊州伊斯特维尔市
    乔治亚州西格尼市
    加利福尼亚州克莱县
    加利福尼亚州克莱顿县
    伊利诺伊州克林顿县
    达拉斯县
    加利福尼亚州戴维斯县
    特拉华县
    伊利诺伊州迪金森县
    伊利诺伊州杜布克县
    埃米特县,伊利诺伊州
    伊利诺伊州费耶特县
    佛罗里达州弗洛伊德县
    弗吉尼亚州富兰克林县
    佛罗里达州弗里蒙特县
    乔治亚州格林县
    乔治亚州格兰迪县
    乔治亚州古思里县
    伊利诺伊州哈丁县
    伊利诺伊州哈里森县
    伊利诺伊州亨利县
    伊利诺伊州洪堡县
    宾夕法尼亚州杰克逊县
    伊利诺伊州贾斯珀县
    乔治亚州杰斐逊县
    佐治亚州约翰逊县
    乔治亚州琼斯县
    基奥库克县,伊利诺伊州
    伊利诺伊州李县
    路易莎县
    伊利诺伊州里昂县
    伊利诺伊州麦迪逊县
    伊利诺伊州马哈斯卡县
    伊利诺伊州马里恩县
    伊利诺伊州马歇尔县
    宾夕法尼亚州梅森市
    伊利诺伊州米尔斯县
    乔治亚州米切尔县
    蒙哥马利县
    马斯卡廷地区地理信息联盟(MAGIC)
    伊利诺伊州奥布赖恩县
    俄勒冈州奥西奥拉县
    乔治亚州佩奇县
    宾夕法尼亚州帕洛阿尔托县
    伊利诺伊州普利茅斯县
    乔治亚州波卡洪塔斯县
    伊利诺伊州波维希克县
    伊利诺伊州灵戈尔德县
    乔治亚州萨克县
    爱荷华州达文波特市斯科特县