Если я правильно вас понимаю, вы пытаетесь эвристически извлечь URL-адреса из файлов HTML, как из атрибутов (например, "href"), так и из текста.
- Вы хотите, чтобы он работал с искаженным HTML
- Вы хотите, чтобы он работал с некорректными URL; например URL-адреса, содержащие пробелы
- Вы не хотите, чтобы он делал ошибки; например твой пример.
Я говорю вам, что ваши требования невозможны. Например, что следует извлечь из следующего текста:
Go to the URL http://example.com/ this and that. And if that doesn't work,
I recommend that you go read the http specification.
Предполагается, что "это и то" является частью URL или нет? И как ваше программное обеспечение должно это выяснить? А что, если автор документа имел в виду противоположное тому, что говорит ваша эвристика? А что насчет "спецификации http" ... которая явно НЕ является URL.
А вот еще один, чуть более тонкий пример:
First, go to the URL http://example.com/index.html.
Then click on the "login" link.
Если ваше программное обеспечение извлекает "http://example.com/index.html." или" http://example.com/index.html"? В соответствии со спецификацией URL, оба являются действительными URL. Ваше программное обеспечение, вероятно, скинет финальный "." потому что это, скорее всего, пунктуация, но может быть неправильным.
Мой совет:
- Не думайте, что вы можете сделать лучше, чем существующий разрешительный анализатор HTML. Откуда вы приехали, шансы, что вы можете, близки к нулю.
- Не думайте, что ваше программное обеспечение не будет ошибаться. Точность 100% требует, чтобы ваше программное обеспечение могло читать мысли человека, создавшего файл. (И, возможно, даже этого недостаточно.)
- Обратите внимание на контекст, в котором появляются URL. Вам нужно использовать разные эвристики для извлечения URL-адресов из атрибутов и текста HTML.
- Обратите внимание, что именно, а что не является допустимым URL.
- Полностью прочитайте и поймите все соответствующие части спецификаций HTML и URL / URI. Хотя делать ошибки с искаженными документами - это нормально, было бы непростительно не извлечь правильно сформированные URL-адреса из атрибутов правильно сформированных документов HTML.