我想从我的 html 文件中提取一些数据,但我有点困惑,因为我不明白我应该将什么视为标签。我使用这个简单的代码从<td> </td>
标签中获取数据
$arr = @()
$path = "C:\test.html"
$pattern = '(?i)<tr[^>]*><td[^>]*>(.*)</td><td>'
Get-Content $path | Foreach {if ([Regex]::IsMatch($_, $pattern)) {
$arr += [Regex]::Match($_, $pattern)
}
}
$arr | Foreach {$_.Value}
但我想要获取的数据有这样的文字
<td align="center" class="row1"><img src="style_images/1/folder_post_icons/icon11.gif" border="0" alt="" /></td>
<td class="row1" valign="middle">
<div style='float:right'></div>
<div>
<a href='http://xxxxxx.org/forum/index.php?showtopic=78777&view=getnewpost'><img src='style_images/1/newpost.gif' border='0' alt='Goto first unread' title='Goto first unread' hspace=2 /></a> <span id='tid-span-78777'><b><a id="tid-link-78777" href="http://xxxxxx/forum/index.php?showtopic=78777" title="This topic was started: Apr 4 2009, 22:09:22">Evil Blood - The Best Of... '83-'86 [best of/compilation] (1986)</a></b></span>
<script type=text/javascript>
var ch78777=0;var tmr78777=0;
function st78777() {if(!ch78777){my_show_div(my_getbyid(("78777_preview")));getData("act=st&t=78777&view=getpost","78777_preview");tmr78777=-1;}}
</script>
<span
onmouseover='if(!tmr78777) {tmr78777=setTimeout("st78777();",1000);}'
onmouseout='if(tmr78777) {clearTimeout(tmr78777);};tmr78777=0;if(!ch78777) {my_hide_div(my_getbyid(("78777_preview")));}'
onmousedown='if(tmr78777!=-1){st78777();};ch78777=1;'
style="cursor: pointer;"><img src="../images/seetopic.gif"></span><div id='78777_preview' class='topicpreview' style='display:none'></div>
<div class="desc"><span onclick='return span_desc_to_input("78777");' id='tid-desc-78777'>Thrash Metal</span></div>
</div>
</td>
我尝试从 3 个不同的 html 标签获取 3 个文本数据。我的示例文本如下(您可以在上面的代码中找到它们)
1. http://xxxxxx/forum/index.php?showtopic=78777
2. Evil Blood - The Best Of... '83-'86 [best of/compilation] (1986)
3. Thrash Metal
但我不明白我需要考虑哪些标签,因为使用 DOM 检查器我发现例如id='tid-desc-78777'>TEXT TO EXTRACT</span></div>
总是有不同的数字,例如我可以有id='tid-desc-78777' but also
id='tid-desc-35812'` 等等。其他 HTML 标签也有同样的问题。
例如,您可以在这里看到来自检查器的标签名称,但在源代码中它们为什么不同? https://i.stack.imgur.com/Ofq2E.png
答案1
我认为你不应该用正则表达式解析 HTML。这篇 Stackoverflow 帖子说得很清楚:https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
除了自己编写 HTML 解析器之外,“正确”的做法是使用现有的解析器并使用结果。这里有一个适用于 powershell 的解析器。http://woshub.com/parsing-html-webpages-with-powershell/
这个想法是,为了完全使用 HTML,您需要考虑解析的状态,这是正则表达式无法做到的。
即使如此,当您只是解析来自 Web 服务器的响应时,JavaScript 还没有被执行,因此如果 js 以某种方式修改了页面,您将不会得到修改。
使用 js 抓取网站的一种稍微简单的方法是依靠浏览器。这篇文章介绍了控制 IE 浏览页面和与页面交互的最基本方法。Powershell。如何使用 AutoBrowse 模块在网页上调用 javascript
缺点是您将打开一个 IE 实例,但优点是您将在渲染后访问 HTML DOM。这应该可以为您节省数小时的眼泪和头痛