mirror of
https://github.com/lukaszraczylo/mcp-readitall.git
synced 2026-10-12 00:45:33 +00:00
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.
38 lines
1.1 KiB
Go
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
|
|
}
|