---
title: "⬇️ Скачиваем и парсим HTML на JavaScript"
date: 2023-01-06T12:16:00+03:00
draft: false
tags: [tutorial, javascript]
---

## Fetch API возвращает поток

Напомню, что ответ, который возвращает fetch(), представляет собой `ReadableStream`.

Чаще всего ты используешь метод `json()`
для получения объекта JSON из возвращенного потока.

Например следующий код вернёт последнюю версию Minecraft:

```javascript
let minecraftUrl = 'https://launchermeta.mojang.com/mc/game/version_manifest_v2.json';

fetch(minecraftUrl)
    .then((response) => response.json()) // Вызов API прошел успешно!
    .then((data) => console.log(data.latest.release)) // JSON из ответа
    .catch((err) => console.warn('Something went wrong.', err)); // Ошибка
```

Но как быть, если вместо JSON ты хочешь получить HTML?

## Метод `text()` 

Например, я хочу получить своё имя со своей страницы в Steam.

Хитрость заключается в использовании метода `text()` вместо метода `json()`.  
Метод возвращает текстовую строку HTML.

```javascript
fetch('https://steamcommunity.com/id/_iiiypuk')
    .then((response) => { return response.text(); })
    .then((html) => { console.log(html); })
    .catch((err) => console.warn('Something went wrong.', err));
```

> Примечание: это будет работать только при запуске на https://steamcommunity.com.  
> Ты получишь ошибку CORS, если попытаешься запустить код в другом месте.

## Получение HTML из текстовой строки

Теперь, когда у тебя есть HTML в виде текстовой строки,
ты можешь сделать с ним несколько вещей.

1. Вставить его в элемент с помощью `innerHTML`.
2. Преобразовать в HTML и манипулировать им.

```javascript
fetch('https://steamcommunity.com/id/_iiiypuk')
    .then((response) => { return response.text() })
    .then((html) => {
        let parser = new DOMParser();
        let doc = parser.parseFromString(html, 'text/html');

        const realName = document.getElementsByClassName('header_real_name ellipsis');
        console.log(realName[0].children[0].innerText);
    })
    .catch((err) => console.warn('Something went wrong.', err));
```
