如何通过PowerShell Invoke-WebRequest深度解析HTML并提取表格数据
刚好我之前处理过类似的无Feed网站内容提取需求,用PowerShell的Invoke-WebRequest完全能搞定!下面给你一步步拆解方案:
用PowerShell解析指定HTML表格生成替代Feed
核心思路是:先抓取网页内容并解析为DOM对象,精准定位目标表格,提取关键数据后转换成你需要的格式(比如RSS、CSV、JSON)。
1. 抓取并解析网页
先用Invoke-WebRequest获取目标网页,它会自动把HTML解析成可操作的DOM对象,省去手动处理字符串的麻烦:
# 替换成目标网站的实际URL $webContent = Invoke-WebRequest -Uri "http://www.example.com/target-page"
如果网站有反爬限制,可以模拟浏览器请求头:
$headers = @{ "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } $webContent = Invoke-WebRequest -Uri "http://www.example.com/target-page" -Headers $headers
2. 定位到指定ID的表格
利用DOM的getElementById方法,直接锁定ID为category1的目标表格:
$targetTable = $webContent.ParsedHtml.getElementById("category1")
3. 遍历表格提取事件数据
接下来遍历表格<tbody>里的每一行,提取日期时间、事件标题和对应的链接:
# 获取表格的主体部分 $tableBody = $targetTable.getElementsByTagName("tbody")[0] # 遍历所有行,提取数据并封装为对象 $eventList = foreach ($row in $tableBody.getElementsByTagName("tr")) { $cells = $row.getElementsByTagName("td") # 确保每行有两个单元格,避免报错 if ($cells.Count -eq 2) { # 提取日期单元格的文本和链接 $dateLink = $cells[0].getElementsByTagName("a")[0] # 提取事件单元格的文本和链接 $eventLink = $cells[1].getElementsByTagName("a")[0] # 输出自定义对象,方便后续转换格式 [PSCustomObject]@{ DateTime = $dateLink.innerText.Trim() DateUrl = $dateLink.href EventName = $eventLink.innerText.Trim() EventUrl = $eventLink.href } } }
4. 转换为你需要的格式
拿到$eventList这个对象数组后,就可以轻松转换成各种常用格式:
转CSV(适合导入Excel或数据库)
$eventList | Export-Csv -Path "events.csv" -NoTypeInformation -Encoding UTF8
转JSON(适合程序调用)
$eventList | ConvertTo-Json | Out-File "events.json" -Encoding UTF8
生成RSS Feed(替代原生Feed的最佳选择)
手动拼接XML格式的RSS内容,直接生成可订阅的Feed文件:
# RSS头部 $rssHeader = @" <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>自定义事件Feed</title> <link>http://www.example.com/target-page</link> <description>从目标网站提取的最新事件</description> "@ # 生成每个事件的RSS item $rssItems = foreach ($event in $eventList) { # 把日期转换成RSS标准的RFC1123格式 $pubDate = [DateTime]$event.DateTime | Get-Date -Format "r" @" <item> <title>$($event.EventName)</title> <link>$($event.EventUrl)</link> <pubDate>$pubDate</pubDate> <description>事件时间:$($event.DateTime)</description> </item> "@ } # RSS尾部 $rssFooter = @" </channel> </rss> "@ # 拼接并保存RSS文件 ($rssHeader + $rssItems -join "`n" + $rssFooter) | Out-File "events.rss" -Encoding UTF8
额外提醒
如果目标网站是JavaScript动态渲染的内容(比如滚动加载、异步加载),Invoke-WebRequest可能抓不到完整数据,这时候可以考虑用PowerShell版的Selenium或Playwright模块来模拟浏览器加载页面。
内容的提问来源于stack exchange,提问作者burnersk




