HTML Form Field Map avatar

HTML Form Field Map

Pricing

$1.00 / 1,000 results

Go to Apify Store
HTML Form Field Map

HTML Form Field Map

Map native HTML form controls to their actual static form, labels, fieldsets and ordered choice labels from exact public pages.

Pricing

$1.00 / 1,000 results

Rating

0.0

(0)

Developer

Roman V

Roman V

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Turn exact public HTML pages into a field-mapping worksheet. Each dataset row is one native control, connected to its form, associated labels, physical fieldsets and ordered choice labels. This can help when documenting or migrating a static form without manually joining separate text extracts.

Use the live listing to check availability, the current build and active pricing.

Input

{
"pageUrls": ["https://httpbin.org/forms/post"],
"formSelector": "form",
"maxFields": 20
}

The default and an empty object use HTTPBin's public pizza-form demonstration. The Actor only retrieves HTML and robots.txt. It never follows the form's submission action. Provide only public URLs you are authorized to read, after checking the site's terms. robots.txt is enforced; it does not replace authorization or terms review.

pageUrls accepts one to ten exact HTTP(S) URLs on default ports. Duplicates, including fragment variants, are fetched once. formSelector accepts form, #id, form#id, .class or form.class; identifiers use ASCII letters, digits, underscores and hyphens, starting with a letter or underscore. It chooses native forms only. Externally associated controls are retained. maxFields defaults to 20 and accepts 0 through 500. Zero produces no source reads.

Dataset rows

Rows preserve document order, including distinct controls with the same name or label. pageId, formId and controlId are deterministic for the same source URL and static element positions. They are not durable identifiers across HTML edits. pageIndex and formIndex are zero-based. controlIndex counts native input/select/textarea/button elements in source order, including excluded hidden and unowned controls. Template, script and foreign-content subtrees are outside the static native tree.

  • sourceUrl, formHtmlId, controlHtmlId, tag, declared type and name describe provenance and structure. Missing attributes remain null.
  • ownership distinguishes an explicit form attribute from ancestor ownership. A missing or ambiguous explicit owner never falls back to an ancestor.
  • labels preserves each explicit or enclosing association, label index, optional HTML ID and normalized text. Empty labels remain empty. Nearby text, placeholders and button text do not become invented labels.
  • fieldsets records physical ancestors from outermost to innermost, each first direct legend and the fieldset's own disabled declaration. Physical ancestry can differ from form ownership.
  • flags reports the presence and raw spelling of disabled, required and readonly. A raw value of false still means the attribute is declared. These are not browser-effective validity, visibility or disabled-state results.
  • constraints preserves declared min/max/step, length, pattern, accept, size, rows and cols strings. multipleDeclared is structural metadata.
  • optgroups has ordered numeric group identities, labels and each group's own disabled declaration. options has source order, permitted display label, numeric group identity and each option's own disabled declaration. Repeated labels and groups remain distinct.

The full machine-readable row contract is field_schema.json.

Exclusions and qualified outcomes

No values are emitted: input defaults, textarea contents, password values, hidden fields/tokens, checked or selected state, option submission values, form-action URLs and embedded scripts are excluded. Password fields may retain structural metadata. No browser, JavaScript, shadow DOM, login, cookie store, CAPTCHA, typing, submission, form-action probing, crawl or per-site rules are used.

This is a bounded static mapper, not a browser parser, accessibility-name algorithm, submission simulator or certification tool. Duplicate IDs qualify associations instead of guessing them. Nested/unclosed forms or labels, duplicate attributes and form placement requiring table/select repair are unsupported. Custom widgets are outside scope. Absence from static HTML does not prove that the rendered page has no form.

OUTPUT contains aggregate page outcomes, limits and the delivery receipt, with no free field inventory. Pages report USEFUL, EMPTY, PARTIAL, UNSUPPORTED, FAILED or NOT_FETCHED. A healthy sibling's complete rows survive another page's failure. An oversized field is omitted whole and counted, never silently truncated.

Limits and delivery

One page is processed at a time. Limits are 3 redirects per page, 40 HTTP attempts including robots and failures, 15 seconds per request and 120 seconds for the runtime workflow. Source work stops with 20 seconds reserved for the append and receipts. SDK startup and shutdown also need the hosted platform's execution timeout, which remains a qualification gate. Redirects remain on the same exact host, never downgrade HTTPS, and pass the same public-address checks. DNS answers are checked and the connection is pinned to a checked address. The transport does not use environment proxies, cookies or retries.

Each response is limited to 2 MiB encoded and 2 MiB decoded, with 12 MiB aggregate limits for each. Application-read framing bytes count toward encoded usage; headers have a separate 16 KiB per-response cap. gzip and zlib-wrapped deflate are supported. Brotli, concatenated gzip members and trailing compressed data are rejected. Failed reads retain byte counts; decompression errors expose a known lower bound and conservative reserved upper bound. These are not TLS/socket-overhead measurements.

The static cap is 30,000 elements, 20 forms and 100 native controls per page, 500 controls per run, 100 options per control and 2,000 delivered options per run. Complete serialized field rows are at most 8 KiB; label and context accumulation is bounded during construction, before the final row check. The one dataset append is at most 512 KiB using the pinned SDK's serializer. Limits can omit rows; receipts identify the outcome.

When enabled on the live listing, the planned pay-per-event tariff is $0.001 per delivered complete control, including its labels and options, through the automatic dataset item event. At most 500 field events cost $0.50; the default 20-field input limits field events to $0.02. A supported positive platform event cap reduces selection to the number of whole controls it can fund. For zero source reads and delivery, set maxFields=0. Local SDK tests cover zero and fractional capacities, but the hosted API may ignore a literal zero or reject a cap below one event. Do not use maxTotalChargeUsd=0 as a no-spend guarantee. Check the live listing for the active price. Owner runs can be exempt from consumer event charges and still incur platform compute, storage and transfer costs. An event cap does not cap those platform costs.

The runtime makes at most one dataset append and never retries it automatically. Confirmed transport counts survive later SDK bookkeeping failures; uncertain delivery or charging stays unknown. A completed invocation can replay its receipt without fetching or appending. An incomplete or corrupt journal fails closed and requires inspection of the actual dataset and platform events. The Actor does not claim a safe automatic retry when it cannot prove one.

Local package

Python 3.12, Apify SDK 4.0.0 and Apify client 3.2.0 are pinned with hashed dependencies. The dataset transport seam depends on those versions and needs review before an SDK upgrade. The package configures 256 MiB of memory. This is the allocation setting; actual peak memory and execution cost depend on the run.

Native association references: form ownership and labels. These define the supported relationships; this prototype does not implement the full browser processing model.