Files
mcp-readitall/internal/reader/extract.go
T
lukaszraczylo 956aa3c0cb fix(deps): migrate to chromedp 0.19 and drop the cdproto replace
Update chromedp to v0.19.1 and cdproto to v0.157.4, port the browser, reader and login code to the generic Action API, group both modules in Renovate, and move the Docker build to Go 1.27.
2026-10-05 10:32:22 +01:00

38 lines
1.1 KiB
Go

package reader
import (
"context"
"fmt"
"github.com/chromedp/chromedp"
)
// extractHTML returns the outer HTML of the first element matching
// selector, or the full document HTML when selector is empty. It runs as
// a separate chromedp.Run so a slow extraction does not re-do navigation.
func (r *Reader) extractHTML(ctx context.Context, selector string) (string, error) {
if selector == "" {
html, err := chromedp.Run(ctx, chromedp.OuterHTML(chromedp.CSS("html")))
if err != nil {
return "", fmt.Errorf("read document: %w", err)
}
return html, nil
}
// Verify the selector matches at least one node; an empty result is
// almost always a caller mistake, not an empty page.
nodes, err := chromedp.Run(ctx, chromedp.Nodes(chromedp.CSS(selector)))
if err != nil {
return "", fmt.Errorf("locate %q: %w", selector, err)
}
if len(nodes) == 0 {
return "", fmt.Errorf("selector %q matched no elements", selector)
}
html, err := chromedp.Run(ctx, chromedp.OuterHTML(chromedp.CSS(selector)))
if err != nil {
return "", fmt.Errorf("extract %q: %w", selector, err)
}
return html, nil
}