dms-scrape 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +70 -0
- package/package.json +9 -5
- package/.gitattributes +0 -2
- package/.vscode/launch.json +0 -18
- package/dms-scrape.d.ts +0 -1
- package/extractfrombrowser.js +0 -12
- package/index.mjs +0 -50
- package/lib/array2String.mjs +0 -5
- package/lib/determineCategory.mjs +0 -18
- package/lib/filterContent.mjs +0 -34
- package/lib/processHTML.mjs +0 -50
- package/lib/sources.mjs +0 -52
- package/sources/T1/CTEE.mjs +0 -32
- package/sources/T1/DIGITIMES.mjs +0 -23
- package/sources/T1/UDNMoney.mjs +0 -46
- package/sources/T2/CHINATIMES.mjs +0 -43
- package/sources/T2/LTN3C.mjs +0 -34
- package/sources/T2/LTNEC.mjs +0 -40
- package/sources/T2/NXTAPPLE.mjs +0 -30
- package/sources/T2/UDN.mjs +0 -26
- package/sources/T3/SETN.mjs +0 -35
- package/sources/T4/CNA.mjs +0 -33
- package/sources/T4/ETDAY.mjs +0 -39
- package/sources/T4/TAISOUNDS.mjs +0 -21
- package/sources/T5/CNYES.mjs +0 -25
- package/sources/T5/COMPOTECHASIA.mjs +0 -30
- package/sources/T5/COOL3C.mjs +0 -26
- package/sources/T5/EPRICE.mjs +0 -19
- package/sources/T5/INSIDE.mjs +0 -15
- package/sources/T5/KOCPC.mjs +0 -28
- package/sources/T5/MASHDIGI.mjs +0 -27
- package/sources/T5/SAYDIGI.mjs +0 -22
- package/sources/T5/SOGI.mjs +0 -46
- package/sources/T5/TECHBANG.mjs +0 -20
- package/sources/T5/TECHNEWS.mjs +0 -17
- package/sources/T5/TECHORANGE.mjs +0 -26
- package/sources/T5/XF.mjs +0 -28
- package/test/cnyestest.js +0 -814
- package/test/compotechtest.js +0 -561
- package/test/insidetest.js +0 -1399
- package/test/saydigitest.js +0 -1000
- package/test/techbangtest.js +0 -1109
- package/test/techrangetest.js +0 -3101
- package/test/tested/chinatest.js +0 -4761
- package/test/tested/cteetest.js +0 -1406
- package/test/tested/digitest.js +0 -1664
- package/test/tested/digitimes3.html +0 -2598
- package/test/tested/digitimes4.html +0 -2614
- package/test/tested/nextapple.js +0 -1546
- package/test/tested/setntest.js +0 -2728
- package/test.mjs +0 -108
package/sources/T4/TAISOUNDS.mjs
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function TAISOUNDS($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
date: [
|
|
4
|
-
{
|
|
5
|
-
selector: "div.publish",
|
|
6
|
-
value: (el, key) => {
|
|
7
|
-
const eachValue = $(el).text().trim();
|
|
8
|
-
if (eachValue !== "") {
|
|
9
|
-
return eachValue.slice(0, 10);
|
|
10
|
-
}
|
|
11
|
-
},
|
|
12
|
-
},
|
|
13
|
-
],
|
|
14
|
-
|
|
15
|
-
});
|
|
16
|
-
data["title"] = $("div.news-box h1").text();
|
|
17
|
-
data["source"] = "太報";
|
|
18
|
-
data["author"] = $("a[href^='/more/reporternews']").text();
|
|
19
|
-
data["content"] = $("div.news-box-text.border").html().split("\n").filter((item) => item.includes("<br>")).toString().split(/<\/?[^>]+>/).filter((item)=> item != '')
|
|
20
|
-
return data;
|
|
21
|
-
}
|
package/sources/T5/CNYES.mjs
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export function CNYES($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [{ selector: "title", value: (el) => $(el).text().trim() }],
|
|
4
|
-
date: [
|
|
5
|
-
{
|
|
6
|
-
selector: "p:contains('2024'):first",
|
|
7
|
-
value: (el) => $(el).text().split(" ")[1].split(" ")[0],
|
|
8
|
-
},
|
|
9
|
-
],
|
|
10
|
-
author: [
|
|
11
|
-
{
|
|
12
|
-
selector: "p:contains('2024'):first",
|
|
13
|
-
value: (el) => $(el).text().split(" ")[0].replace(" ", ""),
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
content: [
|
|
17
|
-
{
|
|
18
|
-
selector: "main#article-container section p",
|
|
19
|
-
value: (el) => $(el).text().trim(),
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
});
|
|
23
|
-
data["source"] = "鉅亨網"
|
|
24
|
-
return data;
|
|
25
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export function COMPOTECHASIA($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [
|
|
4
|
-
{
|
|
5
|
-
selector: "title",
|
|
6
|
-
value: (el) => $(el).text().trim().replace("_COMPOTECH ASIA", ""),
|
|
7
|
-
},
|
|
8
|
-
],
|
|
9
|
-
date: [
|
|
10
|
-
{
|
|
11
|
-
selector: "span.deta",
|
|
12
|
-
value: (el) => $(el).text().split(" ")[0]
|
|
13
|
-
}
|
|
14
|
-
],
|
|
15
|
-
author: [
|
|
16
|
-
{
|
|
17
|
-
selector: "span:contains('本文作者:') > a",
|
|
18
|
-
value: (el) => $(el).text().trim()
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
content: [
|
|
22
|
-
{
|
|
23
|
-
selector: "div.article_wz_text div",
|
|
24
|
-
value: (el) => $(el).text()
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
});
|
|
28
|
-
data["source"] = "智慧電子解決方案設計平台"
|
|
29
|
-
return data
|
|
30
|
-
}
|
package/sources/T5/COOL3C.mjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function COOL3C($) {
|
|
2
|
-
let data = {};
|
|
3
|
-
data["title"] = $("li.breadcrumb-item.active")
|
|
4
|
-
.text()
|
|
5
|
-
.trim()
|
|
6
|
-
.replace("\n", "");
|
|
7
|
-
data["date"] = $("div.created.slacken span")
|
|
8
|
-
.eq(1)
|
|
9
|
-
.text()
|
|
10
|
-
.trim()
|
|
11
|
-
.split(" ")[0]
|
|
12
|
-
.replace(/\./g, "-");
|
|
13
|
-
data["author"] = $("div.author a").text().trim();
|
|
14
|
-
|
|
15
|
-
data["content"] = [];
|
|
16
|
-
$("div.row.content div p").each(function () {
|
|
17
|
-
const text = $(this).html().trim();
|
|
18
|
-
if (text.startsWith("<img") || text.startsWith("▲")) {
|
|
19
|
-
return;
|
|
20
|
-
} else {
|
|
21
|
-
data["content"].push(text.replace("undefined", "").trim());
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
data["source"] = "Cool3c";
|
|
25
|
-
return data;
|
|
26
|
-
}
|
package/sources/T5/EPRICE.mjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export function EPRICE($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
headline: "h1.title",
|
|
4
|
-
});
|
|
5
|
-
data["date"] = $("span.date")
|
|
6
|
-
.first()
|
|
7
|
-
.text()
|
|
8
|
-
.replace(/.*?(\d{4}-\d{2}-\d{2}).*/, "$1");
|
|
9
|
-
data["author"] = $("a.nickname").first().attr("title");
|
|
10
|
-
|
|
11
|
-
data["content"] = $("div.user-comment-block")
|
|
12
|
-
.first()
|
|
13
|
-
.html() // Get inner HTML of the div
|
|
14
|
-
.split(/<br\s*\/?>\s*<br\s*\/?>/i) // Split by two consecutive <br> tags
|
|
15
|
-
.map((line) => line.trim()) // Trim whitespace from each line
|
|
16
|
-
.filter((line) => line.length > 0);
|
|
17
|
-
data["source"] = "ePrice"
|
|
18
|
-
return data;
|
|
19
|
-
}
|
package/sources/T5/INSIDE.mjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export function INSIDE($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [{ selector: "title", value: (el) => $(el).text().trim() }],
|
|
4
|
-
author: "a.author.url.fn",
|
|
5
|
-
date: [
|
|
6
|
-
{
|
|
7
|
-
selector: "li.post_date:first span",
|
|
8
|
-
value: (el) => $(el).text().replace(/\//g, "-"),
|
|
9
|
-
},
|
|
10
|
-
],
|
|
11
|
-
content: [{ selector: "section.js-article-content-body p" }],
|
|
12
|
-
});
|
|
13
|
-
data["source"] = "Inside"
|
|
14
|
-
return data;
|
|
15
|
-
}
|
package/sources/T5/KOCPC.mjs
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export function KOCPC($) {
|
|
2
|
-
let data = {};
|
|
3
|
-
|
|
4
|
-
data["title"] = $("h1.jeg_post_title").text();
|
|
5
|
-
data["date"] = $('div.jeg_meta_date > a')
|
|
6
|
-
.text()
|
|
7
|
-
.replace(/(\d{4}) 年 (\d{2}) 月 (\d{2}) 日/, "$1-$2-$3");
|
|
8
|
-
data["source"] = "電腦王阿達";
|
|
9
|
-
data["author"] = $("div.jeg_meta_author a").text();
|
|
10
|
-
data["content"] = [];
|
|
11
|
-
// data['category'] = $("meta")
|
|
12
|
-
//Zi_ad_ar_iR
|
|
13
|
-
|
|
14
|
-
$("div.Zi_ad_ar_iR p").each((index, element) => {
|
|
15
|
-
if (
|
|
16
|
-
!$(element).text().trim() == "" &&
|
|
17
|
-
!$(element).text().startsWith("<img")
|
|
18
|
-
) {
|
|
19
|
-
data["content"].push(
|
|
20
|
-
$(element)
|
|
21
|
-
.text()
|
|
22
|
-
.trim()
|
|
23
|
-
.replace(/<[^>]*>/g, "")
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return data;
|
|
28
|
-
}
|
package/sources/T5/MASHDIGI.mjs
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export function MASHDIGI($) {
|
|
2
|
-
let data = {};
|
|
3
|
-
const link = $('link[rel="canonical"]').attr('href')
|
|
4
|
-
data["title"] = $("h1.entry-title").text().trim();
|
|
5
|
-
data["date"] = $('[href="' + link + '"] > time.entry-date.published').text();
|
|
6
|
-
data["author"] = $("div.entry-meta span.author.vcard")
|
|
7
|
-
.text()
|
|
8
|
-
.replace(" (Mash Yang)", "");
|
|
9
|
-
|
|
10
|
-
data["content"] = [];
|
|
11
|
-
$("div.bialty-container p").each(function () {
|
|
12
|
-
const htmlContent = $(this).html().trim();
|
|
13
|
-
const textContent = $(this).text().trim();
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
htmlContent.includes("<img") ||
|
|
17
|
-
textContent.startsWith("▲") ||
|
|
18
|
-
textContent === ""
|
|
19
|
-
) {
|
|
20
|
-
return;
|
|
21
|
-
} else {
|
|
22
|
-
data["content"].push(textContent.replace("undefined", "").trim());
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
data["source"] = "Mashdigi";
|
|
26
|
-
return data;
|
|
27
|
-
}
|
package/sources/T5/SAYDIGI.mjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export function SAYDIGI($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [{ selector: "title", value: (el) => $(el).text().trim() }],
|
|
4
|
-
date: [
|
|
5
|
-
{
|
|
6
|
-
selector: "meta[property=article:modified_time]",
|
|
7
|
-
value: (el) => $(el).attr("content").split("T")[0],
|
|
8
|
-
},
|
|
9
|
-
],
|
|
10
|
-
author: [
|
|
11
|
-
{ selector: "meta[name=author]", value: (el) => $(el).attr("content") },
|
|
12
|
-
],
|
|
13
|
-
content: [
|
|
14
|
-
{
|
|
15
|
-
selector: "div.cttt > p",
|
|
16
|
-
value: (el) => $(el).text().trim(),
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
});
|
|
20
|
-
data["source"] = "點子生活"
|
|
21
|
-
return data;
|
|
22
|
-
}
|
package/sources/T5/SOGI.mjs
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
export function SOGI($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: "h1.h1",
|
|
4
|
-
author: [
|
|
5
|
-
{
|
|
6
|
-
selector: "div.d-inline-block.mr-3",
|
|
7
|
-
value: function (el, key) {
|
|
8
|
-
let cleanedText = $(el)
|
|
9
|
-
.text()
|
|
10
|
-
.trim()
|
|
11
|
-
.replace(/[\n\s]/g, "");
|
|
12
|
-
if (cleanedText.includes("特約編輯")) {
|
|
13
|
-
var match = cleanedText.match(/by(.*?)特約編輯/);
|
|
14
|
-
} else if (cleanedText.includes("編輯")) {
|
|
15
|
-
var match = cleanedText.match(/by(.*?)編輯/);
|
|
16
|
-
} else {
|
|
17
|
-
var match = null;
|
|
18
|
-
}
|
|
19
|
-
if (match) {
|
|
20
|
-
let result = match[1]; // This will give you the text between "by" and "特約編輯"
|
|
21
|
-
return result.trim(); // Trimming in case there are extra spaces
|
|
22
|
-
} else {
|
|
23
|
-
console.log("No match found");
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
data["date"] = $("div.d-inline-block.mr-3")
|
|
31
|
-
.first()
|
|
32
|
-
.text()
|
|
33
|
-
.replace("\n", "")
|
|
34
|
-
.trim()
|
|
35
|
-
.replace(/\//g, "-");
|
|
36
|
-
|
|
37
|
-
data["content"] = $("div.editable.my-2")
|
|
38
|
-
.html() // Get inner HTML of the div
|
|
39
|
-
.split(/<br\s*\/?>\s*<br\s*\/?>/i) // Split by two consecutive <br> tags
|
|
40
|
-
.map((line) => line.trim()) // Trim whitespace from each line
|
|
41
|
-
.filter((line) => line.length > 0);
|
|
42
|
-
|
|
43
|
-
data["source"] = "手機王"
|
|
44
|
-
|
|
45
|
-
return data;
|
|
46
|
-
}
|
package/sources/T5/TECHBANG.mjs
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export function TECHBANG($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [{ selector: "title", value: (el) => $(el).text().trim() }],
|
|
4
|
-
date: [
|
|
5
|
-
{
|
|
6
|
-
selector: "meta[property=article:published_time]",
|
|
7
|
-
value: (el) => $(el).attr("content").split("T")[0],
|
|
8
|
-
},
|
|
9
|
-
],
|
|
10
|
-
author: "a.nickname:first",
|
|
11
|
-
content: [
|
|
12
|
-
{
|
|
13
|
-
selector: "div.article-content > p",
|
|
14
|
-
value: (el) => $(el).text().trim(),
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
});
|
|
18
|
-
data["source"] = "T客邦"
|
|
19
|
-
return data;
|
|
20
|
-
}
|
package/sources/T5/TECHNEWS.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export function TECHNEWS($) {
|
|
2
|
-
let data = {};
|
|
3
|
-
data["title"] = $("h1.entry-title").text();
|
|
4
|
-
data["content"] = [];
|
|
5
|
-
let dateParts = $("span.body:nth-of-type(4)")
|
|
6
|
-
.text()
|
|
7
|
-
.match(/(\d{4}) 年 (\d{2}) 月 (\d{2}) 日/);
|
|
8
|
-
data["date"] = `${dateParts[1]}-${dateParts[2]}-${dateParts[3]}`;
|
|
9
|
-
data["source"] = "科技新報";
|
|
10
|
-
data["author"] = $("[rel=author]").text().replace(" ", "");
|
|
11
|
-
|
|
12
|
-
$("div.indent p").each((i, element) => {
|
|
13
|
-
data["content"].push($(element).text().trim());
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
return data;
|
|
17
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function TECHORANGE($) {
|
|
2
|
-
const data = $.extract({
|
|
3
|
-
title: [{ selector: "title", value: (el) => $(el).text().trim() }],
|
|
4
|
-
|
|
5
|
-
date: [
|
|
6
|
-
{
|
|
7
|
-
selector: "meta[property=article:modified_time]",
|
|
8
|
-
value: (el) => $(el).attr("content").split("T")[0],
|
|
9
|
-
},
|
|
10
|
-
],
|
|
11
|
-
author: [
|
|
12
|
-
{
|
|
13
|
-
selector: "meta[name=twitter:data1]",
|
|
14
|
-
value: (el) => $(el).attr('content'),
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
content: [
|
|
18
|
-
{
|
|
19
|
-
selector: "div.elementor-widget-container > p",
|
|
20
|
-
value: (el) => $(el).text().trim(),
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
});
|
|
24
|
-
data["source"] = "科技報橘"
|
|
25
|
-
return data;
|
|
26
|
-
}
|
package/sources/T5/XF.mjs
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export function XF($) {
|
|
2
|
-
let data = {};
|
|
3
|
-
data["title"] = $("span#thread_subject").text();
|
|
4
|
-
|
|
5
|
-
const input = $('em[id^="authorposton"]').text();
|
|
6
|
-
|
|
7
|
-
// Regular expression to match the date part and capture the year, month, and day
|
|
8
|
-
const regex = /發表於 (\d{4})-(\d{1,2})-(\d{1,2})/;
|
|
9
|
-
|
|
10
|
-
// Replace the matched date with the desired format
|
|
11
|
-
const formattedDate = input.replace(regex, (match, year, month, day) => {
|
|
12
|
-
// Ensure month and day are zero-padded to two digits
|
|
13
|
-
const paddedMonth = month.padStart(2, "0");
|
|
14
|
-
const paddedDay = day.padStart(2, "0");
|
|
15
|
-
return `${year}-${paddedMonth}-${paddedDay}`;
|
|
16
|
-
});
|
|
17
|
-
data["date"] = formattedDate.slice(0, 10);
|
|
18
|
-
data["source"] = "XFastest";
|
|
19
|
-
data["author"] = $("a[href^='space-uid']").last().text();
|
|
20
|
-
$('td[id^="post"]').each((index, element) => {
|
|
21
|
-
let content = $(element)
|
|
22
|
-
.html()
|
|
23
|
-
.split(/<\/?[^>]+>/)
|
|
24
|
-
.map((item) => item.trim()); // Trim all elements
|
|
25
|
-
data["content"] = content;
|
|
26
|
-
});
|
|
27
|
-
return data;
|
|
28
|
-
}
|