【问题标题】:How do I scrape data from property tax website如何从房产税网站上抓取数据
【发布时间】:2020-06-18 04:55:47
【问题描述】:

我想从这个页面上刮一些东西http://bexar.trueautomation.com/clientdb/Property.aspx?cid=110&prop_id=1229623

  1. 我想要属性 ID:在属性表下
  2. 土地表下的平方英尺和市场价值
  3. 改进/建筑下的改进 #1

遇到一些问题

  1. 我找不到任何 elementID 或标签/类名称的组合来提取此信息
  2. 同上
  3. 我只想提取列表中的第一项并将 (0) 添加到下面代码中的多个位置并不能实现这一点

我在想最好的方法是创建一个子 ProcessHTMLPage ProcessHTMLPage2 和 ProcessHTMLPage3 来完成所有这些,然后我可以处理格式以根据需要将它们放入适当的列中

Sub GetHTMLDocumentXML()

    Dim XMLPage As New MSXML2.XMLHTTP60
    Dim HTMLDoc As New MSHTML.HTMLDocument
    Dim HTMLPage As MSHTML.HTMLDocument
    Dim URL As String
    Dim HTMLDiv As MSHTML.IHTMLElement
    Dim HTMLTable As MSHTML.IHTMLElement


    XMLPage.Open "GET", "http://bexar.trueautomation.com/clientdb/Property.aspx?cid=110&prop_id=1229623", False
    XMLPage.send

    If XMLPage.Status <> 200 Then
        MsgBox XMLPage.Status & " - " & XMLPage.statusText
        Exit Sub
    End If

    HTMLDoc.body.innerHTML = XMLPage.responseText

    ProcessHTMLPage2 HTMLDoc

End Sub

Sub ProcessHTMLPage2(HTMLPage As MSHTML.HTMLDocument)

    Dim HTMLTable As MSHTML.IHTMLElement
    Dim HTMLTables As MSHTML.IHTMLElementCollection
    Dim HTMLRow As MSHTML.IHTMLElement
    Dim HTMLCell As MSHTML.IHTMLElement
    Dim RowNum As Long, ColNum As Integer

    Set HTMLTables = HTMLPage.getElementsByClassName("improvements")

    Cells.Clear

    For Each HTMLTable In HTMLTables

        Debug.Print HTMLTable.className
        RowNum = RowNum + 1

        For Each HTMLRow In HTMLTable.getElementsByTagName("tr")
            Debug.Print vbTab & HTMLRow.innerText
            ColNum = 1


            For Each HTMLCell In HTMLRow.Children
                Debug.Print vbTab & HTMLCell.innerText
                Cells(RowNum, ColNum) = HTMLCell.innerText
                ColNum = ColNum + 1

            Next HTMLCell

        Next HTMLRow
    Next HTMLTable

    Range("A1").Select
    ActiveCell.CurrentRegion.EntireColumn.AutoFit
End Sub

【问题讨论】:

  • 代码对我有用,可以帮助我进行改进。由于*我只想提取列表中的第一项 * 似乎是您唯一真正的问题,只需通过在第一次迭代后停止的 For Each HTMLCell In HTMLRow.Children 循环中添加一个计数器来制造第一项。 Do ... Loop Until i = 1
  • 斯科特感谢您的快速回复!抱歉,我希望能够提取 Property ID:在 Property 表下以及 Land Table 下的 Sqft 和 Market Value,但我似乎无法弄清楚可以完成此操作的 elementID 类名或标签名。 ``` Do Cells(RowNum, ColNum) = HTMLCell.innerText i = i + 1 Loop until i = 1 ColNum = ColNum + 1 ``` 使我的工作簿崩溃,它将改进 #1: 放入 A1 然后崩溃

标签: vba web-scraping


【解决方案1】:

尝试以下操作以从该网页获取Property ID,Sqft,Market Value。我不得不使用硬编码索引来定位最后两个元素,因为我找不到任何特定的标记。

Public Sub FetchInfo()
    Const Url$ = "http://bexar.trueautomation.com/clientdb/Property.aspx?cid=110&prop_id=1229623"
    Dim S$, oItem As Object
    Dim propertyId$, Sqft$, marketValue$

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
        .send
        S = .responseText
    End With

    With CreateObject("HTMLFile")
        .write S
        For Each oItem In .getElementsByTagName("td")
            If InStr(oItem.innerText, "Property ID:") > 0 Then
                propertyId = oItem.NextSibling.innerText
                Exit For
            End If
        Next oItem

        Sqft = .getElementById("landDetails").getElementsByTagName("td")(4).innerText
        marketValue = .getElementById("landDetails").getElementsByTagName("td")(7).innerText

        Debug.Print propertyId, Sqft, marketValue
    End With
End Sub

【讨论】:

  • 这太棒了,我添加了以下内容以获得我需要的其他信息 living = .getElementById("improvementBuildingDetails").getElementsByTagName("td")(2).innerText Value = .getElementById("改进BuildingDetails").getElementsByTagName("td")(3).innerText 然后将所有变量放入单元格中,非常感谢
  • 如果您不介意,还有一个问题,在一堆网站中循环是否足够容易让我们说如果属性 ID 介于 1000000 和 1230000 之间,或者您认为这将 excel 推得太远了?
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多