DOMParser() źle parsuje string

DOMParser() źle parsuje string
aurel
Moderator
  • Rejestracja:około 15 lat
  • Ostatnio:2 minuty
0

Używam takiego kodu do tworzenia elementów DOM na podstawie stringa:

Kopiuj
function getDOMElementFromString(s) {
    let element = new DOMParser().parseFromString(s, 'text/html');
    return element.body.firstChild;
}

Na wejściu podaję:

Kopiuj
<p style="text-align: left;">
	<a href="/images/fx/max/295647" class="swipebox" rel="gallery-0" style="vertical-align: middle; margin: auto; display: block; clear: both;">
		<img class="internal-image aligncenter" style="vertical-align: middle; margin: auto; display: block;" title="Split payment - przebieg zapłaty" src="/images/fx/max,590,0/295647" alt="Split payment - na czym polega?" data-image-id="274609">
		<div class="image-overlay" style="height: 308px;">
			<div>
				<i class="fa fa-search"/>
			</div>
		</div>
	</a>
</p>

Ale niestety jako element otrzymuję:

Kopiuj
<p style="text-align: left;">
	<a href="/images/fx/max/295647" class="swipebox" rel="gallery-0" style="vertical-align: middle; margin: auto; display: block; clear: both;">
	<img class="internal-image aligncenter" style="vertical-align: middle; margin: auto; display: block;" title="Split payment - przebieg zapłaty" src="/images/fx/max,590,0/295647" alt="Split payment - na czym polega?" data-image-id="274609">
	</a>
</p>

Czyli obcina mi diva pod obrazkiem. Dlaczego? Jak temu zaradzić?

Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
2

Podobny efekt jest w inspektorze.

Masz:

  • niedomknięty tag I,
  • DIV-y jako dzieci P (to podobno niepoprawne), zamień na SPAN-y.

Zobacz pozostałe 2 komentarze
Freja Draco
Freja Draco
@aurel: No to zostaje chyba odpuścić sobie parsowanie DOM i analizować całą zawartość html jako string :/
LukeJL
oo! udało się. Zmiana na <i></i> oraz zamiana <p> na <div> pomogła.
aurel
Nie no zajebię się :D Mam gotowe algorytmy latające po dzieciach elementu rekurencyjnie. Potrzebuję tego jako element, a wiem, że jest to możliwe, bo przecież odczytuję taki element z treści strony... Eh, masakra, w najgorszym wypadku dam wyjątek, że na stronach z błędami DOM nie działam :P
LukeJL
ew. możesz spróbować biblioteki cheerio, może ona inaczej sparsuje.
LukeJL
albo wstępna zamiana regexpami danego HTMLa jeszcze przed parsowaniem (i np. poprawienie regexpami tego, co byś ręcznie poprawiała. Trochę brudna robota, ale jeśli to i tak jedna wielka hakerka, bo istniejący kod...
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8423
0

wrzuciłem to w dev toolsy w Chrome i się bawię i u mnie są jeszcze większe cuda. Podwójne a.

kurczę, przypuszczam, że może to być kwestia specyfikacji czy to HTMLa, czy to samego parsera, że parsuje to w specyficzny sposób. Na Firefoksie podobny output jest.

Ale czemu tak się dzieje? Próbowałem modyfikować lekko ten kod, ale i tak czy siak, kończyło się na czymś podobnym do tego (ew. jak zamieniłem testowo a na article, to parsowało się tak, jak w kodzie).

screenshot-20200605142633.png


edytowany 1x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.