了解要考虑哪些 HTML 标签

了解要考虑哪些 HTML 标签

我想从我的 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&amp;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... &#39;83-&#39;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... &#39;83-&#39;86 [best of/compilation] (1986)
3. Thrash Metal

但我不明白我需要考虑哪些标签,因为使用 DOM 检查器我发现例如id='tid-desc-78777'>TEXT TO EXTRACT</span></div>总是有不同的数字,例如我可以有id='tid-desc-78777' but alsoid='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。这应该可以为您节省数小时的眼泪和头痛

相关内容