【发布时间】:2018-07-22 16:54:49
【问题描述】:
我正在查看@OmegaStripes 对这个问题How to get a particular InnerText from a specific class? 的答案,这里使用Split 函数和指定的分隔符字符串从.responseBody 中提取href。
然后我尝试复制它以提取以下href:
"https://www.england.nhs.uk/statistics/wp-content/uploads/sites/2/2018/02/New-AmbSYS-to-2018-Jan.csv"
来自NHS England's Ambulance Quality Indicators
HTML sn-p:
<main class="main group" role="main">
<div class="page-content" id="main-content">
<header>
<h1>Ambulance Quality Indicators</h1>
</header>
<article class="rich-text">
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>CSV Data</strong><br>
These files have the same data as other published spreadsheets, but without any formatting:<br>
<a href="https://www.england.nhs.uk/statistics/wp-content/uploads/sites/2/2018/02/New-AmbSYS-to-2018-Jan.csv" class="csv-link" onclick="ga('send', 'event', 'Downloads', 'CSV', 'https://www.england.nhs.uk/statistics/wp-content/uploads/sites/2/2018/02/New-AmbSYS-to-2018-Jan.csv');">New Systems Indicators August 2017 to January 2018 (CSV, 23KB)</a><br>
</article>
</div>
</main>
问题:
我收到如下回复文本:
响应文本示例:
通过快速研究,查看参考资料,我猜测这可能是编码问题?
我尝试设置.SetRequestHeader
.setRequestHeader "Content-Type", _
"application/x-www-form-urlencoded; charset=UTF-8"
这对输出没有影响。
说实话,我不知道如何解决这个问题。
请对我如何获得预期的响应文本有任何建议?即我可以解析感兴趣的href。
上下文:
这是一项更大的工作的一部分,其中:
1) 我想抓取该 CSV 链接(其名称每个月都会更改),没有浏览器弹出
2) 下载目标文件内容
3) 使用 ADODB.Stream 将二进制文件写出。
@OmegaStripes 在回答我的问题Return focus to ThisWorkbook.Activesheet after XMLHTTP60 file download 时概述了此过程。我目前正在尝试理解并实施该建议。
代码:
Option Explicit
Public Const url As String = "https://www.england.nhs.uk/statistics/statistical-work-areas/ambulance-quality-indicators/"
Public aBody As String
Sub Testing()
' Download via XHR
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=utf-8"
.send
' Get binary response content
aBody = .responseBody
End With
ActiveSheet.Range("A1") = aBody
End Sub
参考资料:
1)XMLHTTP and Special Characters (eg, accents)
2)setRequestHeader Method (IXMLHTTPRequest)
【问题讨论】:
-
响应头没有指定编码,这可能是
MSXML2.XMLHTTP没有正确解码正文的原因。使用ADODB.Stream和stream.CharSet = "UTF-8"。例如:stackoverflow.com/questions/26624736/convert-binary-to-string/… -
@FlorentB。谢谢。我会看看的。我不知道是不是我的无知,但这似乎是为了以后的阶段。这会以某种方式与响应文本相关联吗?我首先必须从 XHR 中识别文件 url。
-
请注意,
.responseBody返回编码为 UTF-8 的字节数组。您将其转换为String(UTF-16编码),这就是为什么您会得到所有这些外来字符。如果 CSV 文件只包含 ASCII 字符,则使用.responseText,如果没有,则使用ADODB.Stream转换.responseBody。
标签: html vba web-scraping encoding xmlhttprequest