我只是尝试下载一个网页并将其以可访问的格式存储在SQL Server 2012中。我已经使用了动态SQL,但也许有一种更简洁,更简单的方法来执行此操作。我已经能够使用下面的代码成功地将htm文件下载到我的本地驱动器,但是我在使用html本身时遇到了困难。我试图将网页转换为XML并从那里解析,但我认为我没有正确地解决HTML到XML的转换问题。
我收到以下错误:“不允许使用内部子集DTD解析XML。使用带有样式选项2的CONVERT来启用有限的内部子集DTD支持”
DECLARE @URL NVARCHAR(500);
DECLARE @Ticker NVARCHAR(10)
DECLARE @DynamicTickerNumber INT
SET @DynamicTickerNumber = 1
CREATE TABLE Parsed_HTML(
[Date] DATETIME
,[Ticker] VarChar (8)
,[NodeName] VarChar (50)
,[Value] NVARCHAR (50));
WHILE @DynamicTickerNumber <= 2
BEGIN
SET @Ticker = (SELECT [Ticker] FROM [Unique Tickers Yahoo] WHERE [Unique Tickers Yahoo].[Ticker Number]= @DynamicTickerNumber)
SET @URL ='http://finance.yahoo.com/q/ks?s=' + @Ticker + '+Key+Statistics'
DECLARE @cmd NVARCHAR(250);
DECLARE @tOutput TABLE(data NVARCHAR(100));
DECLARE @file NVARCHAR(MAX);
SET @file='D:\Ressources\Execution Model\Execution Model for SQL\DB Temp\quoteYahooHTML.htm'
SET @cmd ='powershell "(new-object System.Net.WebClient).DownloadFile('''+@URL+''','''+@file+''')"'
EXEC master.dbo.xp_cmdshell @cmd, no_output
CREATE TABLE XmlImportTest
(
xmlFileName VARCHAR(300),
xml_data xml
);
DECLARE @xmlFileName VARCHAR(300)
SELECT @xmlFileName = 'D:\Ressources\Execution Model\Execution Model for SQL\DB Temp\quoteYahooHTML.htm'
EXEC('
INSERT INTO XmlImportTest(xmlFileName, xml_data)
SELECT ''' + @xmlFileName + ''', xmlData
FROM
(
SELECT *
FROM OPENROWSET (BULK ''' + @xmlFileName + ''' , SINGLE_BLOB) AS XMLDATA
) AS FileImport (XMLDATA)
')
DECLARE @x XML;
DECLARE @string VARCHAR(MAX);
SET @x = (SELECT xml_data FROM XmlImportTest)
SET @string = CONVERT(VARCHAR(MAX), @x, 1);
INSERT INTO [Parsed_HTML] ([NodeName], [Value])
SELECT [NodeName], [Value] FROM dbo.XMLTable(@string)
--above references XMLTable Parsing function that works consistently
END
不幸的是,这需要在SQL Server的范围内运行,我的理解是HTML Agility Pack不能立即兼容。我还注意到,中间表XMLimportTest永远不会被填充,因此这可能不是格式错误的HTML的功能。
答案 0 :(得分:0)
简答:不要。
SQL对某些东西非常好,但是对于下载和解析HTML来说,这是一个糟糕的选择。在您的示例中,您使用PowerShell下载文件,为什么不在PowerShell中解析HTML?然后,您可以将解析后的数据写入CSV文件,并使用OPENROWSET加载。
另一个选项,仍然没有在SQL Server中使用SQL,但可能是通过SQL CLR使用.Net SP。
正如其中一些评论指出的那样,如果你能保证HTML是格式良好的XML那么你可以使用SQL XML功能来解析它,但是网页很少有很好的XML,所以这将是一个冒险的选择。 / p>