Витяг характеристик зі сторінок товару

Прогін 16.08.2026: ваші три сторінки і ще чотири джерела того самого товару замість закритої. Завантажені як є, без вашого коду і без доступів. Нижче — усе, що читається з кожної, з типом розмітки, селектором вузла і підтвердженням, що значення справді є у збереженому HTML. Ті самі дані таблицею: harakterystyky-3-storinky.xlsx.

3ваші сторінки, з них 2 віддали HTML
39пар «назва: значення» з них
0значень без підтвердження в HTML
91пар ще з 4 джерел на заміну закритому

За якими правилами зібрано

Сам файл теж перевірений окремо: кожен селектор із таблиць нижче застосований заново до збереженого HTML іншим скриптом — усі 130 з 130 знаходять вузол, у якому справді лежить це значення.

дім.укр — Beurer UB 60

https://xn----9sbrgjq0be1d6gc.xn--j1amh/ua/elektroprostiradlo-beurer-ub-60-yes/
HTTP 200розмір 173,883 Бчас 0.51 средиректів 0адреса 2606:4700:3032::6815:21bbпар у файлі 24без підтвердження в HTML 0
Звірка ідентичності товару. модель: «UB 60» (table); артикул: «VDK00196» (json-ld).
  • артикул «VDK00196» не зустрічається в H1 «Електропростирадло Beurer UB 60 ЄС»
НазваЗначенняРозміткаСелектор вузлаСтан
1Назва товаруЕлектропростирадло Beurer UB 60 ЄСJSON-LDhead > script:nth-of-type(10) → $.nameпідтверджено джерелом
точний збіг підрядка в HTML
2Артикул (sku)VDK00196JSON-LDhead > script:nth-of-type(10) → $.skuпідтверджено джерелом
точний збіг підрядка в HTML
3Виробник (brand)BeurerJSON-LDhead > script:nth-of-type(10) → $.brand.nameпідтверджено двома розмітками
точний збіг підрядка в HTML
4Ціна (offers.price)3699JSON-LDhead > script:nth-of-type(10) → $.offers.priceпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
5Валюта (offers)UAHJSON-LDhead > script:nth-of-type(10) → $.offers.priceCurrencyпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
6Наявність (offers)http://schema.org/InStockJSON-LDhead > script:nth-of-type(10) → $.offers.availabilityпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
7ТипЕлектропростирадлотаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
8ВиробникBeurerтаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(2) > td:nth-of-type(2)підтверджено двома розмітками
точний збіг підрядка в HTML
9МодельUB 60таблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(3) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
10КолірБілийтаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(4) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
11БезпекаАвтоматичне відключеннятаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(5) > td:nth-of-type(2) → текстовий вузол 1підтверджено джерелом
точний збіг підрядка в HTML
значення 1 з 2 у цій комірці
12БезпекаЗахист від перегрівутаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(5) > td:nth-of-type(2) → текстовий вузол 2підтверджено джерелом
точний збіг підрядка в HTML
значення 2 з 2 у цій комірці
13Кількість температурних режимів3таблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(6) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
14Матеріал покриттяФлістаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(7) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
15Розмір (ковдри, простирадла)Одинарнийтаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(8) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
16ФункціїШвидке нагріваннятаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(9) > td:nth-of-type(2) → текстовий вузол 1підтверджено джерелом
точний збіг підрядка в HTML
значення 1 з 4 у цій комірці
17ФункціїСвітловий індикатор нагріваннятаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(9) > td:nth-of-type(2) → текстовий вузол 2підтверджено джерелом
точний збіг підрядка в HTML
значення 2 з 4 у цій комірці
18ФункціїПідходить для прання у пральній машинітаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(9) > td:nth-of-type(2) → текстовий вузол 3підтверджено джерелом
точний збіг підрядка в HTML
значення 3 з 4 у цій комірці
19ФункціїПульт керуваннятаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(9) > td:nth-of-type(2) → текстовий вузол 4підтверджено джерелом
точний збіг підрядка в HTML
значення 4 з 4 у цій комірці
20Розміри150 х 80 смтаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(10) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
21Потужність60 Вттаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(11) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
22Система живленняЕлектромережатаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(12) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
23Країна виробникНімеччинатаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(13) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
24Гарантія12 місяцівтаблиця#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(14) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
комерційне поле, не характеристика товару

allo.ua — Beurer UB 68

https://allo.ua/ua/prostyni-i-pododejal-niki/jelektricheskaja-prostyn-beurer-ub-68.html
Сторінка не віддала HTML: 403 і перевірка Cloudflare.
Замість товару приходить сторінка-заглушка «Just a moment…», яка вимагає виконати скрипт і поставити cookie. Це той самий випадок, що у вашому ТЗ винесений за межі задачі: майданчики за Cloudflare-челенджами. Витягати з неї нічого — у відповіді немає ні характеристик, ні назви товару.
розмір відповіді 5,952 Бчас 0.13 средиректів 0

Перевірив і повним браузером з цієї ж адреси — та сама стіна, знімок нижче. У вас на комп'ютері сторінка, найпевніше, відкривається: Cloudflare дивиться на репутацію адреси, з якої прийшов запит, а не на саму сторінку.

Сторінка allo.ua з перевіркою Cloudflare

Що з цим роблю в системі: сторінка отримує статус «джерело недоступне», картка за нею не формується і не заповнюється наполовину. Мовчазної порожньої картки, як зараз, не буде.

electros.com.ua — Beurer UB 68 XXL

https://electros.com.ua/8964
HTTP 200розмір 136,388 Бчас 0.67 средиректів 0адреса 91.239.234.99пар у файлі 15без підтвердження в HTML 0
Звірка ідентичності товару. модель: «8964» (json-ld); артикул: «UB 68 XXL» (json-ld).
  • модель «8964» не зустрічається в H1 «Електропростирадло двоспальне Beurer UB 68 XXL»
НазваЗначенняРозміткаСелектор вузлаСтан
1Назва товаруЕлектропростирадло двоспальне Beurer UB 68 XXLJSON-LDbody > script:nth-of-type(14) → $.nameпідтверджено джерелом
точний збіг підрядка в HTML
2Артикул (sku)UB 68 XXLJSON-LDbody > script:nth-of-type(14) → $.skuпідтверджено джерелом
точний збіг підрядка в HTML
3Модель8964JSON-LDbody > script:nth-of-type(14) → $.modelпідтверджено джерелом
точний збіг підрядка в HTML
4Виробник (brand)BeurerJSON-LDbody > script:nth-of-type(14) → $.brand.nameпідтверджено джерелом
точний збіг підрядка в HTML
5Ціна (offers.price)5799.90JSON-LDbody > script:nth-of-type(14) → $.offers.priceпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
6Валюта (offers)UAHJSON-LDbody > script:nth-of-type(14) → $.offers.priceCurrencyпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
7Наявність (offers)https://schema.org/InStockJSON-LDbody > script:nth-of-type(14) → $.offers.availabilityпідтверджено джерелом
точний збіг підрядка в HTML
службове поле, не характеристика
8Вихідна потужність у ватах2 х 60таблиця#tab-description > table > tbody > tr:nth-of-type(1) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
9Можна прати в машинітактаблиця#tab-description > table > tbody > tr:nth-of-type(2) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
10Матеріал верхньої сторониМ'який флістаблиця#tab-description > table > tbody > tr:nth-of-type(3) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
11Матеріал нижньої частиниФлістаблиця#tab-description > table > tbody > tr:nth-of-type(4) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
12Сертифіковано згідно OEKO-TEXтактаблиця#tab-description > table > tbody > tr:nth-of-type(5) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
13Автоматичне перемикання назадчерез 3 години від рівня 4/3 до рівня 2таблиця#tab-description > table > tbody > tr:nth-of-type(6) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
14Налаштування температури2 х 4таблиця#tab-description > table > tbody > tr:nth-of-type(7) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML
15Розміри виробу150 х 160 смтаблиця#tab-description > table > tbody > tr:nth-of-type(8) > td:nth-of-type(2)підтверджено джерелом
точний збіг підрядка в HTML

Конфлікти значень

На цих трьох сторінках однієї й тієї самої характеристики у двох розмітках одночасно не трапилось, тому жорсткого конфлікту тут немає. Найближче до нього — поле model у JSON-LD сторінки electros.com.ua: там стоїть 8964, тобто внутрішній номер сторінки, а не модель (модель — UB 68 XXL, вона в sku і в заголовку). Якби система звіряла товар за model, вона зчепила б картку не з тим товаром і не помітила б цього.

І ще одне: ваші три посилання — це не один товар. На першій UB 60, на другій і третій UB 68, який половина магазинів пише як «UB 68», а половина як «UB 68 XXL» (навіть сайт виробника називає його обома способами). Тобто звірка має вміти і зупинити чуже (UB 60 проти UB 68), і не заблокувати своє через різне написання тієї самої моделі.

Перевірка механізму на вашій же сторінці

Щоб показати, що робиться з розбіжністю, я взяв збережену копію першої сторінки і дописав у її JSON-LD характеристику «Потужність: 65 Вт», тоді як у таблиці на тій самій сторінці стоїть 60 Вт. Сама сторінка не змінювалась — правилась локальна копія. Ось що вийшло:

РозміткаЗначенняСелекторКонфлікт з
JSON-LD65 Втhead > script:nth-of-type(10) → $.additionalProperty[1]table: 60 Вт
таблиця60 Вт#characteristic_reviews > div > div > div > div:nth-of-type(1) > table > tbody > tr:nth-of-type(11) > td:nth-of-type(2)json-ld: 65 Вт
Що система робить далі. Обидва значення лишаються в базі зі своїми джерелами, поле отримує стан «неузгоджене» і у вихідний файл не потрапляє жодне з них. Вибирає оператор у редакторі, і його вибір запам'ятовується для цього домену: наступного разу така сама пара з цього сайту вже не питається. Якщо вибирати без оператора, пріоритет у видимої таблиці — JSON-LD частіше генерує CMS, і він відстає від сторінки.

Коли джерело недоступне

allo.ua закрита перевіркою, але товар від цього нікуди не дівається: він є на інших сайтах, і картку можна зібрати звідти. Прогнав чотири джерела того самого простирадла тим самим кодом. Повні переліки пар з них — у xlsx, тут тільки підсумок.

ДжерелоЩо віддалоПарМодель / артикул на сторінці
ortoservis.com.ua — Beurer UB 68прочитано34модель: 11019; артикул: 11019
beurer.com.ua, сайт виробника — UB 68прочитано34модель: Матрац з обігрівом UB 68; артикул: 31805
ttt.ua — Beurer UB 68 XXLпрочитано23артикул: 98513
comfy.ua — Beurer UB 68HTTP 200, але характеристик у HTML немає: їх домальовує скрипт уже в браузері0
Найкорисніше тут — ortoservis.com.ua. На цій сторінці ті самі характеристики лежать одразу у двох розмітках: у JSON-LD і у видимій таблиці. Значення збіглися до символа, і 26 пар отримали стан «підтверджено двома розмітками» — це найсильніше, що взагалі буває з полем: два незалежних місця на сторінці кажуть одне й те саме.

А ось де джерела не сходяться

Це вже не розбіжність усередині сторінки, а зведення картки з кількох джерел. Тут видно, чому не можна просто взяти «перше, що знайшлось»:

ХарактеристикаЩо каже кожне джерело
Назва товаруortoservis: Електричне простирадло Beurer UB 68
beurer: Матрац з обігрівом UB 68
ttt: Електропростирадло BEURER UB 68 XXL
Артикул (sku)ortoservis: 11019
beurer: 31805
ttt: 98513
Модельortoservis: 11019
beurer: Матрац з обігрівом UB 68
Виробник (brand)ortoservis: Beurer (Німеччина)
ttt: Beurer
Типortoservis: Електрична грілка
ttt: Простирадло з обігрівом
Потужністьortoservis: 2 x 60 Вт
beurer: 2 x 60 Вт
ttt: 100 Вт
Матеріалortoservis: Фліс
beurer: Фліс
ttt: Мікроволоконний фліс
Особливостіortoservis: Два інноваційних світлодіодних кнопкових контролера для двох зон обігріву з індивідуальним регулюванням; Дві зони і чотири температурні режими для кожного користувача; Відображення температури з підсвічуванням
ttt: Знімний шнур живлення , Індикатор температурних режимів з підсвіткою
Гарантіяortoservis: 12 місяців
ttt: Гарантія: 12 місяців від виробника
Ціна (offers.price)ortoservis: 10529
beurer: 10529.00
ttt: 9616
Кількість температурних режимівbeurer: 2 x 4
ttt: 4
Три магазини — три різні артикули одного товару (11019, 31805, 98513), і потужність у двох джерел «2 x 60 Вт», а в третього «100 Вт». Тому звірка ідентичності не може спиратися на поле артикула: вона йде за моделлю в назві (UB 68) плюс підтвердження оператора, а поля, що розійшлися, лишаються неузгодженими і у файл не йдуть.

Що фільтр викинув і де він помилявся

Два промахи фільтра я зловив на ваших же сторінках, поки збирав цей файл:

Окремо прогнав electros.com.ua ще й через браузер, з готовим DOM: там скрипт домальовує на сторінку таблицю відгуків, і в ній рядок «Алла — 22.03.2026» виглядає точно як характеристика. Пари вийшли ті самі, 15 із 15, а цей рядок відсіявся як відгук (id=review).

Це рівно та причина, через яку такі речі перевіряються на живих сторінках, а не на тестах: обидві помилки були б «зеленими» у будь-якому юніт-тесті.