Как читать и анализировать html в Nodejs?

#javascript #html #node.js

#HTML #node.js #синтаксический анализ

Вопрос:

У меня есть простой проект. Мне нужна помощь, это связанный проект. Мне нужно прочитать HTML-файл, а затем преобразовать его в формат JSON. Я хочу получить совпадения в виде кода и текста. Как я этого добиваюсь?

Таким образом, у меня есть два HTML-тега

 <p>In practice, it is usually a bad idea to modify global variables inside the function scope since it often is the cause of confusion and weird errors that are hard to debug.<br />
If you want to modify a global variable via a function, it is recommended to pass it as an argument and reassign the return-value.<br />
For example:</p>

<pre><code class="{python} language-{python}">a_var = 2

def a_func(some_var):
    return 2**3

a_var = a_func(a_var)
print(a_var)
</code></pre>
 

микод:

 const fs = require('fs')
const showdown  = require('showdown')

var read =  fs.readFileSync('./test.md', 'utf8')

function importer(mdFile) {

    var result = []
    let json = {}

    var converter = new showdown.Converter()
    var text      = mdFile
    var html      = converter.makeHtml(text);

    for (var i = 0; i < html.length; i  ) {
        htmlRead = html[i]
        if(html == html.match(/<p>(.*?)</p>/g))
            json.text = html.match(/<p>(.*?)</p>/g)

       if(html == html.match(/<pre>(.*?)</pre>/g))
            json.code = html.match(/<pre>(.*?)</pre>/g

    }

    return html
}
console.log(importer(read))
 

Как мне получить эти совпадения в коде?

новый код: я записываю все теги p в один и тот же json, как записать каждый тег p в разные блоки json?

 $('html').each(function(){
    if ($('p').text != undefined) {
        json.code = $('p').text()
        json.language = "Text"
    }
})
 

Ответ №1:

Я бы рекомендовал использовать Cheerio. Он пытается реализовать функциональность jQuery, чтобы Node.js .

 const cheerio = require('cheerio')

var html = "<p>In practice, it is usually a bad idea to modify global variables inside the function scope since it often be the cause of confusion and weird errors that are hard to debug.<br />If you want to modify a global variable via a function, it is recommended to pass it as an argument and reassign the return-value.<br />For example:</p>"

const $ = cheerio.load(html)
var paragraph = $('p').html(); //Contents of paragraph. You can manipulate this in any other way you like

//...You would do the same for any other element you require
 

Вам следует ознакомиться с Cheerio и ознакомиться с его документацией. Я нахожу это действительно опрятным!

Редактировать: для новой части вашего вопроса

Вы можете выполнить итерацию по каждому элементу и вставить его в массив объектов JSON следующим образом:

 var jsonObject = []; //An array of JSON objects that will hold everything
$('p').each(function() { //Loop for each paragraph
   //Now let's take the content of the paragraph and put it into a json object
    jsonObject.push({"paragraph":$(this).html()}); //Add data to the main jsonObject    
});
 

Таким образом, результирующий массив объектов JSON должен выглядеть примерно так:

 [
  {
    "paragraph": "text"
  },
  {
    "paragraph": "text 2"
  },
  {
    "paragraph": "text 3"
  }
]
 

Я считаю, что вам также следует ознакомиться с JSON и с тем, как он работает.

Комментарии:

1. Да, именно это я и сделал. Но у меня есть вопрос, я пишу все p-теги в одном и том же json, как записать каждый p-тег в разные блоки json? Я обновил вопрос.

2. Кто-нибудь знает единственную альтернативу JS?

Ответ №2:

‘hpq’ не является одной из самых распространенных библиотек синтаксического анализа HTML, но я думаю, что она хорошо подходит для вашего запроса, поскольку описание в 1 строку

Утилита для анализа и запроса HTML в форме объекта.

https://github.com/aduth/hpq

И его функциональность хорошо проиллюстрирована на этой странице Live explorer:

https://aduth.github.io/hpq/

Проблема для вас будет в том, что он был создан для браузера (в качестве входных данных он принимает HTML-строку или элемент DOM), поэтому я не уверен в его использовании с node.