Hướng dẫn parse innerhtml javascript - phân tích cú pháp nội bộ javascript

Tôi có một trang HTML chứa đầy dữ liệu được phân tách bằng dấu phẩy và mỗi hàng kết thúc trong thẻ (br /). Trong JavaScript, tôi có thể nhận được điều này từ DOM bằng cách yêu cầu bên trong của phần tử chứa dữ liệu.

Câu hỏi của tôi là làm thế nào để phân tích bên trong để lấy dữ liệu từ giữa dấu phẩy và bắt đầu trên dòng tiếp theo khi nó nhấn vào thẻ (BR /)?

Bạn có thể bỏ qua phần còn lại vì đó là câu hỏi của tôi ở trên.

Khi tôi phân tích từng dòng, tôi sẽ bắt đầu một đối tượng mới và đặt dữ liệu vào đó. Tôi chỉ không chắc chắn phải làm gì với bên trong!

Tôi đã đặt dữ liệu thông qua hàm CSVTOarray mà tôi tìm thấy nhưng cuối cùng đã kết thúc với một mảng của một mảng lớn thay vì một mảng mảng cho mỗi dòng. Tôi có thể làm việc theo cách của mình thông qua mảng này tạo các đối tượng từ dữ liệu trên đường đi nhưng biến bên trong thành một mảng duy nhất có vẻ là một bước không cần thiết khi tôi có thể phân tích dữ liệu thẳng vào đối tượng.

Dữ liệu được đặt ở đó thông qua Ajax. Tôi có thể thay đổi định dạng mà dữ liệu xuất hiện. Như tôi đã nói rằng tôi có nó phân tách dữ liệu với dấu phẩy và thẻ (BR /) ở cuối dòng. Tôi không biết điều này có ngu ngốc hay không.

Khi được hỏi ngày 10 tháng 5 năm 2012 lúc 17:11May 10, 2012 at 17:11

Hướng dẫn parse innerhtml javascript - phân tích cú pháp nội bộ javascript

Peter Bushnellpeter BushnellPeter Bushnell

8981 Huy hiệu vàng13 Huy hiệu bạc28 Huy hiệu đồng1 gold badge13 silver badges28 bronze badges

3

Vì vậy, bạn muốn CSV-Parse một tệp trong đó các dòng mới được chỉ định bằng

yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 
0 thay vì
yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 
1? Chỉ cần sử dụng dấu phân cách đó trong CSV-Parser của bạn sau đó. Phiên bản đơn giản:

text.split("<br />".map(function(line){ return line.split(","); })

Bạn cũng có thể chia tách bằng các biểu thức thông thường, như

text.split(/\s*<br ?\/>\s*/)...

Nếu bạn thực sự sử dụng dữ liệu CSV trong một DOM, bạn có thể xóa tất cả các yếu tố BR và sử dụng các nút (văn bản) còn lại làm mảng dòng.

Đã trả lời ngày 10 tháng 5 năm 2012 lúc 17:17May 10, 2012 at 17:17

Bạn đề cập rằng bạn có quyền kiểm soát dữ liệu bạn nhận được thông qua AJAX và bạn đúng rằng cách tiếp cận hiện tại của bạn không phải là ý tưởng tốt nhất. Trước hết, bạn không bao giờ nên cố gắng tự phân tích HTML, ngay cả khi bạn nghĩ rằng nó "đơn giản" - các trình duyệt khác nhau sẽ cung cấp cho bạn

yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 
2 khác nhau cho cùng một nội dung. Thay vào đó, hãy sử dụng DOM để tìm thông tin bạn đang tìm kiếm.

Điều đó nói rằng, cách tiếp cận chính xác ở đây chỉ là trả lại một đối tượng JSON từ máy chủ; Sau đó, bạn sẽ có quyền truy cập trực tiếp vào dữ liệu của bạn. Gần như mọi ngôn ngữ phía máy chủ đều có một số loại cơ sở để xuất JSON và JavaScript có thể phân tích chuỗi JSON nguyên bản1 với

yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 
3.

Từ máy chủ, trở lại:

{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}

Trên máy khách (giả sử jQuery),

$.getJSON('/path-to-script/', function(d) {
    for (var i = 0; i < d.items.length; i++) {
        d.items[i].id;
    }
});

1 - Trong các trình duyệt hiện đại

Đã trả lời ngày 10 tháng 5 năm 2012 lúc 17:28May 10, 2012 at 17:28

Hướng dẫn parse innerhtml javascript - phân tích cú pháp nội bộ javascript

josh3736josh3736josh3736

134K30 Huy hiệu vàng211 Huy hiệu bạc256 Huy hiệu Đồng30 gold badges211 silver badges256 bronze badges

1

Bạn có thể chỉ cần làm điều này nếu bạn chỉ muốn "lấy dữ liệu từ giữa dấu phẩy":

yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 

Hoặc nếu bạn chỉ muốn một mảng dòng:

var lines = yourElem.innerHTML.split(",");

Điều đó sẽ trả về một mảng các dòng với các yếu tố

yourElem.innerHTML = yourElem.innerHTML.split(",").join(""); 
4 còn nguyên vẹn. Tuy nhiên, không rõ liệu đó có phải là điều bạn muốn không.

Đã trả lời ngày 10 tháng 5 năm 2012 lúc 17:22May 10, 2012 at 17:22

Hướng dẫn parse innerhtml javascript - phân tích cú pháp nội bộ javascript

Elliot Bonevilleelliot BonevilleElliot Bonneville

50.1K23 Huy hiệu vàng93 Huy hiệu bạc123 Huy hiệu Đồng23 gold badges93 silver badges123 bronze badges

Cập nhật tháng 11 năm 2020

Tôi đã tìm kiếm các thư viện trình phân tích cú pháp NodeJS HTML hàng đầu.

Nội dung chính

  • Cập nhật tháng 11 năm 2020
  • Tôi đã tìm kiếm các thư viện trình phân tích cú pháp NodeJS HTML hàng đầu.
  • Nội dung chính
  • Bắt đầu và thiết lập các phụ thuộc
  • Sử dụng phải lấy dữ liệu để sử dụng với JSdom
  • Sử dụng bộ chọn CSS với JSdom
  • Lọc qua các phần tử HTML
  • Tải xuống các tệp MIDI mà chúng tôi muốn từ trang web
  • Mở rộng rộng lớn của World Wide Web
  • Làm thế nào để bạn phân tích HTML?
  • Làm cách nào để gửi nội dung HTML trong Node JS?

Trong nút.Các ứng dụng JS và Express, Res.SendFile () có thể được sử dụng để cung cấp các tệp.Việc cung cấp các tệp HTML bằng cách sử dụng Express có thể hữu ích khi bạn cần một giải pháp để phục vụ các trang tĩnh.res.sendFile() can be used to deliver files. Delivering HTML files using Express can be useful when you need a solution for serving static pages.

Cập nhật tháng 11 năm 2020

Tôi đã tìm kiếm các thư viện trình phân tích cú pháp NodeJS HTML hàng đầu..

Nội dung chính

Bắt đầu và thiết lập các phụ thuộc

Sử dụng phải lấy dữ liệu để sử dụng với JSdom

Sử dụng bộ chọn CSS với JSdom

Lọc qua các phần tử HTML

Tải xuống các tệp MIDI mà chúng tôi muốn từ trang web

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
0.

HTML-parse-Stringify-

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
1.

Node-HTML-Parser-

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
2.

Mở rộng rộng lớn của World Wide Web

Làm cách nào để phân tích một trang HTML trong Node JS?

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
3.

Làm cách nào để loại bỏ nút html js?

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
4.

Vì các trường hợp sử dụng của tôi không yêu cầu thư viện có nhiều tính năng, tôi có thể tập trung vào sự ổn định và hiệu suất.

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
5.

DRAFTJS-TO-HTML-

const fs = require('fs');
const got = require('got');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const vgmUrl= 'https://www.vgmusic.com/music/console/nintendo/nes';

got(vgmUrl).then(response => {
  const dom = new JSDOM(response.body);
  console.log(dom.window.document.querySelector('title').textContent);
}).catch(err => {
  console.log(err);
});
6.

Theo sự ổn định, tôi có nghĩa là tôi muốn thư viện được cộng đồng sử dụng đủ lâu để tìm lỗi và nó vẫn sẽ được duy trì và các vấn đề mở sẽ bị đóng lại.

Thật khó để hiểu được tương lai của một thư viện nguồn mở, nhưng tôi đã thực hiện một bản tóm tắt nhỏ dựa trên 10 thư viện hàng đầu trong OpenBase..

Thật khó để hiểu được tương lai của một thư viện nguồn mở, nhưng tôi đã thực hiện một bản tóm tắt nhỏ dựa trên 10 thư viện hàng đầu trong OpenBase..

Tôi chia thành 2 nhóm theo cam kết cuối cùng (và trên mỗi nhóm, đơn đặt hàng theo GitHub bắt đầu):

Cam kết cuối cùng là trong 6 tháng qua:

Tôi đã tìm kiếm các thư viện trình phân tích cú pháp NodeJS HTML hàng đầu.

Nội dung chính

Bắt đầu và thiết lập các phụ thuộc

Sử dụng phải lấy dữ liệu để sử dụng với JSdom

Sử dụng bộ chọn CSS với JSdom

Lọc qua các phần tử HTML

Tải xuống các tệp MIDI mà chúng tôi muốn từ trang web

text.split(/\s*<br ?\/>\s*/)...
4

Mở rộng rộng lớn của World Wide Web

Nội dung chính

Bắt đầu và thiết lập các phụ thuộc

Sử dụng phải lấy dữ liệu để sử dụng với JSdom

Sử dụng bộ chọn CSS với JSdom

Lọc qua các phần tử HTML

Ví dụ:

text.split(/\s*<br ?\/>\s*/)...
82 sẽ đưa cho bạn văn bản bên trong thẻ
text.split(/\s*<br ?\/>\s*/)...
83 trên trang. Nếu bạn lưu mã này vào một tệp có tên
text.split(/\s*<br ?\/>\s*/)...
84 và chạy nó bằng lệnh
text.split(/\s*<br ?\/>\s*/)...
85, nó sẽ ghi lại tiêu đề của trang web vào bảng điều khiển.

Sử dụng bộ chọn CSS với JSdom

Nếu bạn muốn nhận được cụ thể hơn trong truy vấn của mình, có nhiều bộ chọn bạn có thể sử dụng để phân tích thông qua HTML. Hai trong số những cái phổ biến nhất là tìm kiếm các yếu tố theo lớp hoặc ID. Nếu bạn muốn có được một Div với ID của "Menu", bạn sẽ sử dụng

text.split(/\s*<br ?\/>\s*/)...
86 và nếu bạn muốn tất cả các cột tiêu đề trong bảng của VGM MIDIS, bạn sẽ làm
text.split(/\s*<br ?\/>\s*/)...
87

Những gì chúng tôi muốn trên trang này là các siêu liên kết cho tất cả các tệp MIDI chúng tôi cần tải xuống. Chúng tôi có thể bắt đầu bằng cách nhận mọi liên kết trên trang bằng cách sử dụng

text.split(/\s*<br ?\/>\s*/)...
88. Thêm phần sau vào mã của bạn trong
text.split(/\s*<br ?\/>\s*/)...
84:
text.split(/\s*<br ?\/>\s*/)...
8

Mã này ghi lại URL của mọi liên kết trên trang. Chúng tôi có thể xem qua tất cả các yếu tố từ một bộ chọn nhất định bằng hàm

{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
90. Lặp lại thông qua mọi liên kết trên trang là tuyệt vời, nhưng chúng tôi sẽ cần phải có một chút cụ thể hơn một chút nếu chúng tôi muốn tải xuống tất cả các tệp MIDI.

Lọc qua các phần tử HTML

Trước khi viết thêm mã để phân tích nội dung mà chúng tôi muốn, trước tiên, hãy để xem HTML mà trình duyệt được trình duyệt hiển thị. Mỗi trang web là khác nhau và đôi khi nhận được dữ liệu phù hợp trong số chúng đòi hỏi một chút sáng tạo, nhận dạng mẫu và thử nghiệm.

Mục tiêu của chúng tôi là tải xuống một loạt các tệp MIDI, nhưng có rất nhiều bản nhạc trùng lặp trên trang web này, cũng như các bản phối lại của các bài hát. Chúng tôi chỉ muốn một trong mỗi bài hát và vì mục tiêu cuối cùng của chúng tôi là sử dụng dữ liệu này để đào tạo một mạng lưới thần kinh để tạo ra âm nhạc Nintendo chính xác, chúng tôi sẽ không muốn đào tạo nó trên các bản phối lại do người dùng tạo.

Khi bạn viết mã để phân tích thông qua một trang web, thường sẽ hữu ích khi sử dụng các công cụ nhà phát triển có sẵn cho bạn trong hầu hết các trình duyệt hiện đại. Nếu bạn nhấp chuột phải vào yếu tố bạn quan tâm, bạn có thể kiểm tra HTML đằng sau yếu tố đó để hiểu rõ hơn.

Bạn có thể viết các chức năng bộ lọc để tinh chỉnh dữ liệu bạn muốn từ các bộ chọn của mình. Đây là các hàm lặp qua tất cả các yếu tố cho một bộ chọn nhất định và trả về đúng hay sai dựa trên việc chúng có nên được đưa vào tập hợp hay không.

Nếu bạn đã xem qua dữ liệu được đăng nhập vào bước trước, bạn có thể nhận thấy rằng có khá nhiều liên kết trên trang không có thuộc tính

{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
91 và do đó không dẫn đến đâu. Chúng tôi có thể chắc chắn rằng đó không phải là MIDI mà chúng tôi đang tìm kiếm, vì vậy hãy viết một hàm ngắn để lọc các phần tử cũng như các phần tử chứa phần tử
{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
91 dẫn đến tệp
{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
93:
{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
9

Bây giờ chúng tôi có vấn đề không muốn tải xuống các bản sao hoặc bản phối được tạo của người dùng. Đối với điều này, chúng tôi có thể sử dụng các biểu thức thông thường để đảm bảo rằng chúng tôi chỉ nhận được các liên kết mà văn bản không có dấu ngoặc đơn, vì chỉ các bản sao và phối lại chứa dấu ngoặc đơn:

$.getJSON('/path-to-script/', function(d) {
    for (var i = 0; i < d.items.length; i++) {
        d.items[i].id;
    }
});
4

Hãy thử thêm chúng vào mã của bạn trong

text.split(/\s*<br ?\/>\s*/)...
84 bằng cách tạo một mảng trong bộ sưu tập các nút phần tử HTML được trả về từ
{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
95 và áp dụng các chức năng bộ lọc của chúng tôi cho nó:
$.getJSON('/path-to-script/', function(d) {
    for (var i = 0; i < d.items.length; i++) {
        d.items[i].id;
    }
});
7

Chạy lại mã này và nó chỉ nên in các tệp

{items: [
    { id: 0, name: '...' },
    { id: 1, name: '...' },
    ...
]}
93 mà không sao chép bất kỳ bài hát cụ thể nào.

Tải xuống các tệp MIDI mà chúng tôi muốn từ trang web

Bây giờ chúng tôi có mã hoạt động để lặp qua mỗi tệp MIDI mà chúng tôi muốn, chúng tôi phải viết mã để tải xuống tất cả chúng.

Trong chức năng gọi lại để lặp qua tất cả các liên kết MIDI, hãy thêm mã này để truyền tải tải xuống MIDI vào một tệp cục bộ, hoàn thành với việc kiểm tra lỗi:

$.getJSON('/path-to-script/', function(d) {
    for (var i = 0; i < d.items.length; i++) {
        d.items[i].id;
    }
});
9

Chạy mã này từ một thư mục mà bạn muốn lưu tất cả các tệp MIDI và xem màn hình thiết bị đầu cuối của bạn hiển thị tất cả 2230 tệp MIDI mà bạn đã tải xuống (tại thời điểm viết bài này). Với điều đó, chúng ta nên hoàn thành việc cạo tất cả các tệp MIDI mà chúng ta cần.

Đi qua và lắng nghe họ và thưởng thức một số nhạc Nintendo!

Mở rộng rộng lớn của World Wide Web

Bây giờ bạn có thể lập trình lấy mọi thứ từ các trang web, bạn có quyền truy cập vào một nguồn dữ liệu lớn cho bất kỳ dự án nào của bạn cần. Một điều cần lưu ý là các thay đổi đối với trang web HT HTML có thể phá vỡ mã của bạn, vì vậy hãy đảm bảo cập nhật mọi thứ nếu bạn đang xây dựng các ứng dụng trên hết. Bạn cũng có thể muốn thử so sánh chức năng của thư viện JSDOM với các giải pháp khác bằng cách làm theo các hướng dẫn để lấy web bằng cách sử dụng kịch bản trình duyệt Cheerio và không đầu bằng cách sử dụng Puppeteer hoặc một thư viện tương tự có tên là Nhà viết kịch.

Nếu bạn đang tìm kiếm một cái gì đó để làm với dữ liệu bạn vừa lấy từ kho lưu trữ nhạc trò chơi video, bạn có thể thử sử dụng các thư viện Python như Magenta để đào tạo mạng lưới thần kinh với nó.

Tôi mong muốn được xem những gì bạn xây dựng. Hãy tiếp cận và chia sẻ kinh nghiệm của bạn hoặc hỏi bất kỳ câu hỏi nào.

  • E-mail:
  • Twitter: @sagnewshreds
  • GitHub: Sagnew
  • Twitch (Mã trực tiếp phát trực tuyến): Sagnewshreds

Làm cách nào để phân tích một trang HTML trong Node JS?

Bạn có thể sử dụng các mô -đun NPM JSDOM và HTMLPARSER để tạo và phân tích DOM trong nút. JS ....

Đẹp cho Python ..

Bạn có thể chuyển đổi HTML của bạn thành XHTML và sử dụng XSLT ..

HTMLagilityPack cho. ....

CSQuery cho ..

Làm cách nào để loại bỏ nút html js?

Cách cạo một trang web trong nút bằng cách sử dụng Cheerio...

Bước 1 - Tạo một thư mục làm việc.....

Bước 2 - Khởi tạo dự án.....

Bước 3 - Cài đặt phụ thuộc.....

Bước 4 - Kiểm tra trang web bạn muốn cạo.....

Bước 5 - Viết mã để xóa dữ liệu ..

Làm thế nào để bạn phân tích HTML?

Phân tích cú pháp HTML liên quan đến việc xây dựng mã thông báo và xây dựng cây.Mã thông báo HTML bao gồm các thẻ bắt đầu và kết thúc, cũng như tên và giá trị thuộc tính.Nếu tài liệu được hình thành tốt, phân tích cú pháp thì đơn giản và nhanh hơn.Trình phân tích cú pháp phân tích cú pháp đầu vào vào tài liệu, xây dựng cây tài liệu.tokenization and tree construction. HTML tokens include start and end tags, as well as attribute names and values. If the document is well-formed, parsing it is straightforward and faster. The parser parses tokenized input into the document, building up the document tree.tokenization and tree construction. HTML tokens include start and end tags, as well as attribute names and values. If the document is well-formed, parsing it is straightforward and faster. The parser parses tokenized input into the document, building up the document tree.

Làm cách nào để gửi nội dung HTML trong Node JS?

Trong nút.Các ứng dụng JS và Express, Res.SendFile () có thể được sử dụng để cung cấp các tệp.Việc cung cấp các tệp HTML bằng cách sử dụng Express có thể hữu ích khi bạn cần một giải pháp để phục vụ các trang tĩnh.res.sendFile() can be used to deliver files. Delivering HTML files using Express can be useful when you need a solution for serving static pages.res. sendFile() can be used to deliver files. Delivering HTML files using Express can be useful when you need a solution for serving static pages.