From dd09fd8adf637c82dccf927bc76708cfe9550cac Mon Sep 17 00:00:00 2001 From: kik0220 Date: Tue, 30 Apr 2019 11:27:29 +0900 Subject: [PATCH 1/2] feat: add japan.zdnet.com custom parser --- fixtures/japan.zdnet.com/1556591023244.html | 874 ++++++++++++++++++ src/extractors/custom/index.js | 1 + .../custom/japan.zdnet.com/index.js | 31 + .../custom/japan.zdnet.com/index.test.js | 111 +++ 4 files changed, 1017 insertions(+) create mode 100644 fixtures/japan.zdnet.com/1556591023244.html create mode 100644 src/extractors/custom/japan.zdnet.com/index.js create mode 100644 src/extractors/custom/japan.zdnet.com/index.test.js diff --git a/fixtures/japan.zdnet.com/1556591023244.html b/fixtures/japan.zdnet.com/1556591023244.html new file mode 100644 index 000000000..8a468efa6 --- /dev/null +++ b/fixtures/japan.zdnet.com/1556591023244.html @@ -0,0 +1,874 @@ + + + + +Raspberry Pi競合--Ubuntuが動く「UP Core」を見る - ZDNet Japan + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + +
+ +
+
+
+ +
+ + +
+ + + +

+ +Raspberry Pi競合--Ubuntuが動く「UP Core」を見る

+ +

+ZDNet Japan Staff 2019年04月28日 08時00分

+ +
    +
  • + +
    + + + + +
  • +
  • +
  • +このエントリーをはてなブックマークに追加 +
  • +
  • + +
  • +
+
    + +
  • 印刷
  • + + + + + + + + + +
    +
+ + +
    +
+
+
+ +

+ 2017年にリリース予定の低価格ポケットサイズコンピュータは、「Android Marshmallow」と「Windows 10」のフルバージョンが動作する。 +

+ 「UP Core」は、「ubilinux(Debian)」や「Ubuntu」「Yocto」など、さまざまなOSが動作するシングルボードコンピュータだ。そして、その性能は「Raspberry Pi 3 Model B」を上回るようだ。 +

+ +

+(本記事は、TechRepublic Japanで2017年6月8日に掲載した記事からの転載です。続きはTechRepublic Japanでお読みいただけます) +

+ + +
+
+ + +
+

ZDNet Japan 記事を毎朝メールでまとめ読み(登録無料)

+ +
+ + + + + +
+
    +
  • +
  • +
  • +
  • +このエントリーをはてなブックマークに追加 +
  • +
  • +
+
+ +
+
+
    +
+ +
+ +

連載

+
+ + + +
CIO
+
+ 月刊 Windows 10移行の心・技・体 +
+
+ ITアナリストが知る日本企業の「ITの盲点」 +
+
+ シェアリングエコノミーの衝撃 +
+
+ デジタル“失敗学” +
+
+ コンサルティング現場のカラクリ +
+
+ Rethink Internet:インターネット再考 +
+
+ インシデントをもたらすヒューマンエラー +
+
+ トランザクションの今昔物語 +
+
+ エリック松永のデジタルIQ道場 +
+
+ 研究現場から見たAI +
+
+ Fintechの正体 +
+
+ 米ZDNet編集長Larryの独り言 +
+
+ 大木豊成「仕事で使うアップルのトリセツ」 +
+
+ 山本雅史「ハードから読み解くITトレンド放談」 +
+
+ 田中克己「展望2020年のIT企業」 +
+
+ 松岡功「一言もの申す」 +
+
+ 松岡功「今週の明言」 +
+
+ 内山悟志「IT部門はどこに向かうのか」 +
+
+ 林 雅之「デジタル未来からの手紙」 +
+
+ 谷川耕一「エンプラITならこれは知っとけ」 +
+
+ 大河原克行「エンプラ徒然」 +
+
+ 内製化とユーザー体験の関係 +
+
+ 「プロジェクトマネジメント」の解き方 +
+
+ ITは「ひみつ道具」の夢を見る +
+ + + + + + +
セキュリティ
+
+ セキュリティインシデント対応の現場 +
+
+ エンドポイントセキュリティの4つの「基礎」 +
+
+ 企業セキュリティの歩き方 +
+
+ サイバーセキュリティ未来考 +
+
+ ネットワークセキュリティの要諦 +
+
+ セキュリティの論点 +
+ + + + + + +
スペシャル
+
+ エンタープライズAIの隆盛 +
+
+ インシュアテックで変わる保険業界 +
+
+ 顧客は勝手に育たない--MAツール導入の心得 +
+
+ 「ひとり情シス」の本当のところ +
+
+ ざっくり解決!SNS担当者お悩み相談室 +
+
+ 生産性向上に効くビジネスITツール最前線 +
+
+ ざっくりわかるSNSマーケティング入門 +
+
+ 課題解決のためのUI/UX +
+
+ 誰もが開発者になる時代 ~業務システム開発の現場を行く~ +
+
+ 「Windows 10」法人導入の手引き +
+
+ ソフトウェア開発パラダイムの進化 +
+
+ エンタープライズトレンド +
+
+ 10の事情 +
+
+ 座談会@ZDNet +
+
+ Dr.津田のクラウドトップガン対談 +
+
+ Gartner Symposium +
+
+ IBM World of Watson +
+
+ de:code +
+
+ Sapphire Now +
+
+ VMworld +
+
+ Microsoft WPC +
+
+ Microsoft Connect() +
+
+ HPE Discover +
+
+ Oracle OpenWorld +
+
+ Dell Technologies World +
+
+ AWS re:Invent +
+
+ AWS Summit +
+
+ PTC LiveWorx +
+
+ 吉田行男「より賢く活用するためのOSS最新動向」 +
+
+ 古賀政純「Dockerがもたらすビジネス変革」 +
+
+ 中国ビジネス四方山話 +
+
+ ベトナムでビジネス +
+
+ 日本株展望 +
+
+ 企業決算 +
+ + +
+
+ +
+ + +
+ + + + +
+ +
+ +
+ + +
+
+ +
+ + +
+
+ このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 + これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
+ Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
+ [ 閉じる ] +
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/src/extractors/custom/index.js b/src/extractors/custom/index.js index 7a361e727..78c73860a 100644 --- a/src/extractors/custom/index.js +++ b/src/extractors/custom/index.js @@ -121,3 +121,4 @@ export * from './www.lifehacker.jp'; export * from './sect.iij.ad.jp'; export * from './www.oreilly.co.jp'; export * from './www.ipa.go.jp'; +export * from './japan.zdnet.com'; diff --git a/src/extractors/custom/japan.zdnet.com/index.js b/src/extractors/custom/japan.zdnet.com/index.js new file mode 100644 index 000000000..6041521b1 --- /dev/null +++ b/src/extractors/custom/japan.zdnet.com/index.js @@ -0,0 +1,31 @@ +export const JapanZdnetComExtractor = { + domain: 'japan.zdnet.com', + + title: { + selectors: ['h1'], + }, + + author: { + selectors: ['.author'], + }, + + date_published: { + selectors: ['.author'], + format: 'YYYY年MM月DD日 HH時mm分', + timezone: 'Asia/Tokyo', + }, + + dek: null, + + lead_image_url: { + selectors: [['meta[name="og:image"]', 'value']], + }, + + content: { + selectors: ['div.article_body'], + + transforms: {}, + + clean: [], + }, +}; diff --git a/src/extractors/custom/japan.zdnet.com/index.test.js b/src/extractors/custom/japan.zdnet.com/index.test.js new file mode 100644 index 000000000..aeeade69d --- /dev/null +++ b/src/extractors/custom/japan.zdnet.com/index.test.js @@ -0,0 +1,111 @@ +import assert from 'assert'; +import URL from 'url'; +import cheerio from 'cheerio'; + +import Mercury from 'mercury'; +import getExtractor from 'extractors/get-extractor'; +import { excerptContent } from 'utils/text'; + +const fs = require('fs'); + +describe('JapanZdnetComExtractor', () => { + describe('initial test case', () => { + let result; + let url; + beforeAll(() => { + url = 'https://japan.zdnet.com/article/35136396/'; + const html = fs.readFileSync( + './fixtures/japan.zdnet.com/1556591023244.html' + ); + result = Mercury.parse(url, { + html, + fallback: false, + }); + }); + + it('is selected properly', () => { + // This test should be passing by default. + // It sanity checks that the correct parser + // is being selected for URLs from this domain + const extractor = getExtractor(url); + assert.equal(extractor.domain, URL.parse(url).hostname); + }); + + it('returns the title', async () => { + // To pass this test, fill out the title selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + const { title } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(title, `Raspberry Pi競合--Ubuntuが動く「UP Core」を見る`); + }); + + it('returns the author', async () => { + // To pass this test, fill out the author selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + const { author } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(author, `ZDNet Japan Staff 2019年04月28日 08時00分`); + }); + + it('returns the date_published', async () => { + // To pass this test, fill out the date_published selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + const { date_published } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(date_published, `2019-04-27T23:00:00.000Z`); + }); + + it('returns the dek', async () => { + // To pass this test, fill out the dek selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + const { dek } = await result; + + // Update these values with the expected values from + // the article. + assert.equal(dek, null); + }); + + it('returns the lead_image_url', async () => { + // To pass this test, fill out the lead_image_url selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + const { lead_image_url } = await result; + + // Update these values with the expected values from + // the article. + assert.equal( + lead_image_url, + `https://japan.zdnet.com/storage/2019/04/26/97670c9f883bf3f9e11a492df245717c/190426_original_1280x960.jpg` + ); + }); + + it('returns the content', async () => { + // To pass this test, fill out the content selector + // in ./src/extractors/custom/japan.zdnet.com/index.js. + // You may also want to make use of the clean and transform + // options. + const { content } = await result; + + const $ = cheerio.load(content || ''); + + const first13 = excerptContent( + $('*') + .first() + .text(), + 1 + ); + + // Update these values with the expected values from + // the article. + assert.equal( + first13, + '2017年にリリース予定の低価格ポケットサイズコンピュータは、「Android' + ); + }); + }); +}); From 14b66e26fb67c57b134a8ff1462f7cab4c306b47 Mon Sep 17 00:00:00 2001 From: kik0220 Date: Wed, 8 May 2019 06:07:38 +0900 Subject: [PATCH 2/2] fix: author and date_published selector --- src/extractors/custom/japan.zdnet.com/index.js | 6 ++---- src/extractors/custom/japan.zdnet.com/index.test.js | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/extractors/custom/japan.zdnet.com/index.js b/src/extractors/custom/japan.zdnet.com/index.js index 6041521b1..450b865b7 100644 --- a/src/extractors/custom/japan.zdnet.com/index.js +++ b/src/extractors/custom/japan.zdnet.com/index.js @@ -6,13 +6,11 @@ export const JapanZdnetComExtractor = { }, author: { - selectors: ['.author'], + selectors: [['meta[name="cXenseParse:author"]', 'value']], }, date_published: { - selectors: ['.author'], - format: 'YYYY年MM月DD日 HH時mm分', - timezone: 'Asia/Tokyo', + selectors: [['meta[name="article:published_time"]', 'value']], }, dek: null, diff --git a/src/extractors/custom/japan.zdnet.com/index.test.js b/src/extractors/custom/japan.zdnet.com/index.test.js index aeeade69d..9e86f94ea 100644 --- a/src/extractors/custom/japan.zdnet.com/index.test.js +++ b/src/extractors/custom/japan.zdnet.com/index.test.js @@ -48,7 +48,7 @@ describe('JapanZdnetComExtractor', () => { // Update these values with the expected values from // the article. - assert.equal(author, `ZDNet Japan Staff 2019年04月28日 08時00分`); + assert.equal(author, `ZDNet Japan Staff`); }); it('returns the date_published', async () => {