From 6819c674edc473f455d8666ff2de851ae9c867a0 Mon Sep 17 00:00:00 2001 From: Basil Suter Date: Tue, 10 Aug 2021 09:12:58 +0000 Subject: [PATCH 1/2] format content --- CHANGELOG.md | 4 +++ src/Parsers/HtmlParser.php | 40 +++++++++++++++++++++++-- tests/Parsers/HtmlParserExampleTest.php | 2 +- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 252d15d..1ea1991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). In order to read more about upgrading and BC breaks have a look at the [UPGRADE Document](UPGRADE.md). +## 1.7.0. + ++ []() Improve the strip tags for html parser in order to generate a more clean and readable output when `$stripTags` is enabled. + ## 1.6.2 (16. April 2021) + [#18](https://github.com/nadar/crawler/pull/18) Fix issue with pages where utf8 chars are in title tag. diff --git a/src/Parsers/HtmlParser.php b/src/Parsers/HtmlParser.php index 4d7ed46..b629629 100644 --- a/src/Parsers/HtmlParser.php +++ b/src/Parsers/HtmlParser.php @@ -20,7 +20,9 @@ class HtmlParser implements ParserInterface { /** - * @var boolean Whether the HTML tags should be stripped from $result->content variable or not. + * @var boolean Whether the HTML tags should be stripped from $result->content variable or not. Since version 1.7.0 also spaces will be added in certain circumstances. + * For example space boundings `Hello
World` will be `Hello World` instead of `HelloWorld`. In order to recieved the original content from the web request, disable + * $stripTags. The space bounding can also lead to wrong spaces, for example `foobar.` will be `foobar .` instead of `foobar.` as `.` is a normal char. */ public $stripTags = true; @@ -52,7 +54,7 @@ public function run(Job $job, RequestResponse $requestResponse) : ParserResult $content = $this->stripCrawlIgnore($body); - $content = $this->stripTags ? strip_tags($content) : $content; + $content = $this->stripTags ? $this->formatContent($content) : $content; $jobResult = new ParserResult(); $jobResult->content = $jobResult->trim($content); // get only the content between "body" tags @@ -291,4 +293,38 @@ public function getDomLinks(DOMDocument $dom, $ignoreRels = []) unset ($links); return $refs; } + + /** + * Format Content + * + * + Remove tags + * + Remove unneccsary whitespaces (like double whitespaces) + * + make spaces between words when they are seperated by tags (`

foo

bar

` will be `foo bar` instead of `foobar`) + * + Ensure no spaces before punctuation marks. + * + * @param string $content The content to format + * @return string The striped and formated content + * @see https://www.php.net/manual/de/function.strip-tags.php#110280 + * @since 1.7.0 + */ + public function formatContent($content) + { + // remove HTML TAGs + $string = preg_replace ('/<[^>]*>/', ' ', $content); + + // remove control characters + $string = str_replace("\r", '', $string); // --- replace with empty space + $string = str_replace("\n", ' ', $string); // --- replace with space + $string = str_replace("\t", ' ', $string); // --- replace with space + + // remove multiple spaces + $string = trim(preg_replace('/ {2,}/', ' ', $string)); + + // handle wrong control char spacings + $string = preg_replace('/(\s)([\!\,\.\?])/', '$2', $string); + + // for security reasons, add strip tags + // https://www.php.net/manual/de/function.strip-tags.php#118183 + return strip_tags($string); + } } diff --git a/tests/Parsers/HtmlParserExampleTest.php b/tests/Parsers/HtmlParserExampleTest.php index 7f82213..8190fcd 100644 --- a/tests/Parsers/HtmlParserExampleTest.php +++ b/tests/Parsers/HtmlParserExampleTest.php @@ -1087,6 +1087,6 @@ public function testCrawlerContent() $parser = new HtmlParser(); $result = $parser->run($job, $requestResponse); - $this->assertSame('Immer wieder leben lernen – Willkommen im foobar Berlin Wir begleiten Menschen mit einer Hirnschädigung und /oder Querschnittlähmung nach Unfall oder Krankheit zurück ins Leben. Das foobar Berlin ist eine hochspezialisierte Klinik für Neurofoobarilitation und Paraplegiologie. Wir haben ein breites stationäres Angebot und bieten Ihnen auch Behandlungen in unserer Tagesklinik und im Ambulatorium an. Ganzheitliche foobarilitation Unsere wichtigsten Ziele bei der foobarilitation sind Ihre grösstmögliche Selbstständigkeit und Lebensqualität. Es geht darum, nach einer Erkrankung oder einem schweren Trauma wieder seinen Platz in der Gesellschaft zu finden.Nach Ihrem stationären Aufenthalt setzen wir uns weiterhin für Sie ein - als kompetente Begleiterin und "Schrittmacherin". Auch dann, wenn es um Ihre berufliche Wiedereingliederung geht. Film "Portrait foobar Berlin" (5 Minuten) Information Corona-Virus Besuchsregelung: Bitte beachten Sie das Schreiben vom 18.02.2021 zu Besuchen. Für Angehörige, Patient*innen und Besucher*innen bleibt das Bistro bis 31. März 2021 geschlossen. Weiterlesen Ambulante Long-COVID Sprechstunde Das foobar Berlin bietet ab sofort eine ambulante Long-COVID Sprechstunde für Betroffene mit Langzeitfolgen einer Covid-19 Infektion an. Weiterlesen 4. SW!SS REHA Forum - Folien Hier finden Sie die Präsentationen des SW!SS REHA Forums vom 5./6. November 2020 Weiterlesen Maskenknigge Sehen Sie hier den Maskenknigge des foobar Berlin. Weiterlesen Fortbildungen Bis Ende März 2021 finden keine medizinischen Fortbildungen statt. Weiterlesen', $result->content); + $this->assertSame('Immer wieder leben lernen – Willkommen im foobar Berlin Wir begleiten Menschen mit einer Hirnschädigung und /oder Querschnittlähmung nach Unfall oder Krankheit zurück ins Leben. Das foobar Berlin ist eine hochspezialisierte Klinik für Neurofoobarilitation und Paraplegiologie. Wir haben ein breites stationäres Angebot und bieten Ihnen auch Behandlungen in unserer Tagesklinik und im Ambulatorium an. Ganzheitliche foobarilitation Unsere wichtigsten Ziele bei der foobarilitation sind Ihre grösstmögliche Selbstständigkeit und Lebensqualität. Es geht darum, nach einer Erkrankung oder einem schweren Trauma wieder seinen Platz in der Gesellschaft zu finden. Nach Ihrem stationären Aufenthalt setzen wir uns weiterhin für Sie ein - als kompetente Begleiterin und "Schrittmacherin". Auch dann, wenn es um Ihre berufliche Wiedereingliederung geht. Film "Portrait foobar Berlin" (5 Minuten) Information Corona-Virus Besuchsregelung: Bitte beachten Sie das Schreiben vom 18.02.2021 zu Besuchen. Für Angehörige, Patient*innen und Besucher*innen bleibt das Bistro bis 31. März 2021 geschlossen. Weiterlesen Ambulante Long-COVID Sprechstunde Das foobar Berlin bietet ab sofort eine ambulante Long-COVID Sprechstunde für Betroffene mit Langzeitfolgen einer Covid-19 Infektion an. Weiterlesen 4. SW!SS REHA Forum - Folien Hier finden Sie die Präsentationen des SW!SS REHA Forums vom 5./6. November 2020 Weiterlesen Maskenknigge Sehen Sie hier den Maskenknigge des foobar Berlin. Weiterlesen Fortbildungen Bis Ende März 2021 finden keine medizinischen Fortbildungen statt. Weiterlesen', $result->content); } } \ No newline at end of file From e5681d03355727dd3539415849a0afdd55c88840 Mon Sep 17 00:00:00 2001 From: Basil Suter Date: Tue, 10 Aug 2021 09:26:25 +0000 Subject: [PATCH 2/2] changelog [skip ci] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ea1991..9ef84d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,9 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). In order to read more about upgrading and BC breaks have a look at the [UPGRADE Document](UPGRADE.md). -## 1.7.0. +## 1.7.0 (10. August 2021) -+ []() Improve the strip tags for html parser in order to generate a more clean and readable output when `$stripTags` is enabled. ++ [#20](https://github.com/nadar/crawler/pull/20) Improve the strip tags for html parser in order to generate a more clean and readable output when `$stripTags` is enabled. Things like `

foo

bar

` are now handled as `foo bar` instead of `foobar`. ## 1.6.2 (16. April 2021)