#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 в форме объекта.
И его функциональность хорошо проиллюстрирована на этой странице Live explorer:
Проблема для вас будет в том, что он был создан для браузера (в качестве входных данных он принимает HTML-строку или элемент DOM), поэтому я не уверен в его использовании с node.