В оболочке вы можете анализировать HTML , используя:
hxselect
из html-xml-utils
package vim
/ ex
(который может легко перепрыгнуть между html-тегами ), например: удаление метки стиля с помощью внутреннего кода: $ curl -s http://example.com/ | ex -s +'/
grep
, например: извлечение внешнего html файла H1: $ curl -s http://example.com/ | grep -o '.*
'
Example Domain
извлечение тела: $ curl -s http://example.com/ | tr '\n' ' ' | grep -o '.*'
Example Domain
...
-
html2text
для простого синтаксического анализа текста: например, таблицы синтаксического анализа : $ html2text foo.txt | column -ts'|'
- с использованием
xpath
(XML::XPath
perl-модуля), см. здесь пример - perl или Python (см. пример @Gilles )
- для разбора нескольких файлов одновременно, см. Как разбирать сотню html файлы исходного кода в оболочке?
Связанный (почему вы не должны использовать регулярное выражение):
3
задан PierreDuc 2 February 2017 в 14:33
поделиться
Кто-то застрелит меня, если я ошибаюсь, но, насколько я знаю, вам нужно использовать это, если вы загрузите внешний скрипт после загрузки zone.js
. Это означает, что любые изменения внутри этого скрипта не будут обнаружены обнаружением изменений. Это происходит при загрузке карт Google позже. Может быть ....
В любом случае, если это так, тогда вы должны использовать метод ngZone.run
.
Если вы хотите вручную запускать что-то вне обнаружения изменений, если вы хотите заставить что-то не запускать его, вы должны использовать runOutsideAngular
. Это не ваш прецедент, поэтому вы можете безопасно удалить это.
Наиболее частое использование этой службы заключается в оптимизации производительности при запуске работы, состоящей из одной или нескольких асинхронных задач, t требуется обновление пользовательского интерфейса или обработка ошибок, которые будут обрабатываться с помощью углового устройства. Такие задачи можно запустить с помощью runOutsideAngular, и при необходимости эти задачи могут повторно войти в угловую зону через run.
blockquote>. Но, с другой стороны, вы отмечаете, что привязка данных в dww работаю для вас (
ngModel
). Я думаю, что реальная проблема заключается в том, что вы обновляете свойство на существующем объекте. Это само по себе не вызывает двухстороннее обнаружение изменений и является фактической причиной, по которой работаетngZone.run
. Если это так, тоchangeRef.detectChanges
не будет работать, и вам лучше использоватьApplicationRef
и сделатьtick()
. Или не используйте двустороннюю привязку данных и используйте шаблонdata goes down, events go up
.constructor(private appRef: ApplicationRef){} getLocation(address: string): void { let mygc = new google.maps.Geocoder(); mygc.geocode({ 'address': address }, (results, status) => { let data: any = results[0]; this.myObject.myData = { lat: data.geometry.location.lat(), lng: data.geometry.location.lng() }; this.appRef.tick(); }); }
Это, очевидно, работает, поскольку оно ничем не отличается от
ngZone.run
. Но основная причина, по которой обнаружение изменений не срабатывает, заключается в том, чтоgoogle.maps
использует свои собственные вызовы events / addEventListener. Эти события не называются обезьяной, запятнаннымиzone.js
, и поэтому они не запускаются в угловой зоне, что логически не приведет к циклу обнаружения изменений.Таким образом, вы можете решить это, используя
ngZone.run
илиApplicationRef.tick
. Где я полагаю, чтоngZone.run
имеет наибольший смысл, потому что он позволяет вам (re) войти в угловую зону, что именно вы хотите.Для «хорошего» чтения о
NgZone
вы может проверить api
Я использую просто:
import { NgZone } from '@angular/core';
constructor(
private zone: NgZone
) { super(); }
getLocation(address: string): void {
var mygc = new google.maps.Geocoder();
var self = this;
mygc.geocode({
'address': address
}, (results, status) => {
var data: any = results[0];
self.zone.run(() => {
self.myObject.myData = {
lat: data.geometry.location.lat(),
lng: data.geometry.location.lng()
};
});
});
ApplicationRef
имеет больше смысла. Другой подход может состоять в том, чтобы испустить событиеupdateLocation.emit({data.geometry.location.lat(), data.geometry.location.lon()}
и подписаться на это событие, где вы показываете этот объект :) – PierreDuc 2 February 2017 в 12:27