You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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版的SeleniumPlaywright模块来模拟浏览器加载页面。

内容的提问来源于stack exchange,提问作者burnersk

火山引擎 最新活动