使用 css 选择器 excel vba 从网站抓取数据

Posted

技术标签:

【中文标题】使用 css 选择器 excel vba 从网站抓取数据【英文标题】:Scraping data from website with css selectors excel vba 【发布时间】:2020-03-12 22:24:18 【问题描述】:

我正在尝试使用 CSS 选择器从网站上抓取特定数据。我在 QHar 的帮助下取得了成功,但现在的要求已经改变。这是我下面的代码:

代码

Public Sub CompanyData2()

Dim html As HTMLDocument, ws As Worksheet, re As Object

Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\s2,"
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set html = New HTMLDocument

With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", "https://www.bizi.si/iskanje?q=", False
    .send
    html.body.innerHTML = .responseText
End With

ws.Range("A4").Value = re.Replace(Join$(Array(html.querySelector("td.item a").innerText), ", "), Chr$(32))
ws.Range("A5").Value = re.Replace(Join$(Array(html.querySelector("td.item + td.item").innerText), ", "), Chr$(32))
ws.Range("B6").Value = re.Replace(Join$(Array(html.querySelector("td.item + td.item + td.item + td.item").innerText), ", "), Chr$(32))

End Sub

结果如下:

网站

我想像这样在表格 1 A3 上提取公司名称:

谢谢。

【问题讨论】:

请使用sn-p工具通过edit分享html我们可以用来测试 您传递给 url 末尾以获得如图所示的最终输出的值是多少?我们是否可以至少有两个具有预期输出的示例输入,因为看起来 html 在我的测试中可能会有所不同, 我可以找到并返回 REPROMAT d.o.o.但不是您显示的全名。 好的。我弄清楚了实际发生的事情 请尝试编辑后的答案。 【参考方案1】:

您需要在 A1 中使用REPROMAT,然后在发出初始查询后,您必须访问实际的公司页面以获取显示的公司名称。如果您直接使用公司网址,那么您可以跳过第一个请求并从第二个请求开始使用代码。

Public Sub CompanyData()
    Dim html As HTMLDocument, ws As Worksheet, nodes As Object

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set html = New HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.bizi.si/iskanje?q=" & Application.EncodeURL(ws.Range("A1").Value), False
        .send
        html.body.innerHTML = .responseText

        Set nodes = html.querySelectorAll("td.item")

        With ws
            .Range("A4").Value = nodes.Item(0).FirstChild.innerText
            .Range("A5").Value = nodes.Item(1).innerText
            .Range("A6").Value = "DŠ: " & nodes.Item(3).innerText
        End With

        .Open "GET", html.querySelector("[id$=linkCompany]").href, False
        .send
        html.body.innerHTML = .responseText
        ws.Range("A3") = html.querySelector("#ctl00_ctl00_cphMain_cphMainCol_CompanySPLPreview1_labTitlePRS").innerText
    End With
End Sub

【讨论】:

我还有一个问题要问 QHarr。它现在工作正常,但是当我在网站 BIZI 中更换公司时,我在 excel 中得到了与以前搜索相同的结果。我必须关闭并打开 excel 才能提取不同的公司数据。谢谢。 嗨,您介意打开一个新问题并解释问题以及您尝试过的方法吗?如果您愿意,可以在此处放置指向它的链接。 您可以尝试在 .Open 行之后添加 .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" 看看是否这首先会改变事情。 ***.com/questions/59009092/… 我正在向您发送链接。谢谢。 你尝试使用我提到的请求头了吗?

以上是关于使用 css 选择器 excel vba 从网站抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 从多个打开的文件资源管理器窗口中关闭特定的文件资源管理器窗口

使用表单从网站屏幕获取数据到 Excel - VBA

使用 VBA 从 Access 运行后从任务管理器中删除 Excel 任务

Excel VBA - 如何从另一个控件触发列表框单击

VBA代码根据excel工作簿中的值从webform下拉列表中选择一个值

从VBA中的excel中选择多列