在cmd文件中读取html并获取img标记

时间:2015-02-09 13:03:19

标签: html regex batch-file

我必须在cmd文件中读取html文件。在那里我必须寻找img标签,在这个标签中必须得到src的字符串。我该怎么处理?

我尝试逐行阅读,并尝试通过以下内容了解img标记内容:

for /f "tokens=*" %%a in (./mypage.htm) do (

echo %%a| findstr /r "<img.*src.*/>">nul
    if errorlevel 0 (
        echo %%a
    )
)

但是有了这个,它显示了所有行以及一些错误消息,例如:&#34;找不到文件&#34;或&#34;语法错误&#34;

2 个答案:

答案 0 :(得分:0)

而不是贪婪的量词,尝试使用惰性.*?并且还要转义斜杠\/<img.*src.*?\/>

答案 1 :(得分:0)

如果Windows包含更强大的命令行正则表达式解释器,这可能会更容易。 findstr适用于提供布尔匹配/不匹配或返回包含匹配的整行,但不能真正与sedgrep -o的灵活性竞争匹配和仅返回该行的匹配部分。

我要做的是使用Windows Scripting Host(VBScript / JScript)来获得更强大的regexp和字符串操作工具。这是一个示例.bat / JScript hybrid:

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "htmlfile=test.html"

rem // invoke hybrid JScript code
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do (
    rem // do stuff with %%I
    echo found: %%I
)

rem // end main runtime
goto :EOF

@end
// end batch / begin JScript chimera

var fso = WSH.CreateObject('scripting.filesystemobject'),
    html = fso.OpenTextFile(WSH.Arguments(0), 1),
    images = html.ReadAll().replace(/\r?\n/g, '').match(/img[^>]+?src=(['"]).+?(?=\1)/ig);

html.Close();
WSH.Echo(images.join('\n').replace(/img[^>]+?src=['"]/ig,''));

这应该成功匹配

<img src="typical.jpg">

<img class="noclick" src="class/included.png" />

<img style="border: 0"
src="tag/has/line/break.gif">

<img src="http://apostrophe/in/source's name.jpg">

<img src='single-quoted.jpg' />

...即使sedgrep也很难。


如果您有一个特别顽固的HTML文档无法进行正则表达式抓取,您可以将Internet Explorer作为COM对象调用,以将<img>标记解析为DOM节点。如果您尝试通过JavaScript或CSS伪元素动态填充图像的页面,这将是有益的。这种IE的调用远远超过 ,但它是一种故障保护。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "htmlfile=test.html"

for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do (
    rem // do stuff with %%I
    echo %%I
)

rem // end main runtime
goto :EOF

@end
// end batch / begin JScript chimera

var fso = WSH.CreateObject('scripting.filesystemobject'),
    IE = WSH.CreateObject('InternetExplorer.Application'),
    htmlfile = fso.GetAbsolutePathName(WSH.Arguments(0));

IE.Visible = 0;
IE.Navigate('file:///' + htmlfile.replace(/\\/g, '/'));
while (IE.Busy || IE.ReadyState != 4) WSH.Sleep(25);

var images = IE.document.getElementsByTagName('img');

for (var i=0; i<images.length; i++) WSH.Echo(images[i].src);

IE.Quit();