如何下载网页并在SQL中解析

时间:2016-04-10 16:44:02

标签: sql sql-server xml web-scraping dynamic-sql

我只是尝试下载一个网页并将其以可访问的格式存储在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的功能。

1 个答案:

答案 0 :(得分:0)

简答:不要。

SQL对某些东西非常好,但是对于下载和解析HTML来说,这是一个糟糕的选择。在您的示例中,您使用PowerShell下载文件,为什么不在PowerShell中解析HTML?然后,您可以将解析后的数据写入CSV文件,并使用OPENROWSET加载。

另一个选项,仍然没有在SQL Server中使用SQL,但可能是通过SQL CLR使用.Net SP。

正如其中一些评论指出的那样,如果你能保证HTML是格式良好的XML那么你可以使用SQL XML功能来解析它,但是网页很少有很好的XML,所以这将是一个冒险的选择。 / p>