Проблема заключается в том, что у вас есть двойные кавычки внутри вашей строки, которые сбивают с толку парсер, потому что вы также используете двойные кавычки, чтобы окружить строку. Для иллюстрации:
puts "foo"bar"
# => SyntaxError: unexpected tIDENTIFIER, expecting end-of-input
# puts "foo"bar"
# ^
Вы можете намереваться для этого печатать foo"bar
, но когда анализатор получает второй "
(после foo
) он считает, что строка закончилась, и поэтому материал после него вызывает синтаксис ошибка. (Синтаксис переполнению стека Выделения даже дает вам подсказку-видеть, как на первой линии "foo"
окрашена отличается от bar"
? Хороший подсветку синтаксиса, текстовый редактор будет делать то же самое.)
Одним из решений является использование ОДНОВАЛЮТНУЮ цитата вместо:
puts 'bar"baz'
# => bar"baz
Это устраняет проблему в этом случае, но на самом деле не поможет вам, потому что ваша строка имеет одинарные кавычки внутри него!
Другим решением является побег ваши кавычки, предварив их с \
, например, так:
puts "foo\"bar"
# => foo"bar
... но это становится немного утомительно (и иногда сложно) для длинных строк, как ваша , Лучшим решением является использование особого рода строки называется «Heredoc» (для «здесь документ,» за то, что он стоит):
str = <<-END_OF_HTML
<html> <meta content="text/html; charset=UTF-8"/> <body style='margin:20px'> <p>The following user has registered a device, click on the link below to review the user and make any changes if necessary.</p> <ul style='list-style-type:none; margin:25px 15px;'> <li><b>User name:</b> Test User</li> <li><b>User email:</b> [email protected]</li> <li><b>Identifier:</b> abc123def132afd1213afas</li> <li><b>Description:</b> Tom's iPad</li> <li><b>Model:</b> iPad 3</li> <li><b>Platform:</b> </li> <li><b>App:</b> Test app name</li> <li><b>UserID:</b> </li> </ul> <p>Review user: https://cirrus.app47.com/[email protected]</p> <hr style='height=2px; color:#aaa'/> <p>We hope you enjoy the app store experience!</p> <p style='font-size:18px; color:#999'>Powered by App47</p> <img src='https://cirrus.app47.com/notifications/562506219ac25b1033000904/img' alt=''/></body></html>
END_OF_HTML
html_doc = Nokogiri::HTML(str)
Разделителем «END_OF_HTML
» произвольно. Вы можете использовать EOF
или XYZZY
, или что-то другое, что вам подходит, хотя полезно использовать что-то значимое. (Вы заметите, что подсветка синтаксиса Stack Overflow имеет небольшие проблемы с heredocs, однако большинство редакторов кода отлично справляются с ними.)
Вы можете сделать это немного более компактным, как это:
Nokogiri::HTML <<-END_OF_HTML
<html> <meta content="text/html; charset=UTF-8"/> <body style='margin:20px'> <p>The following user has registered a device, click on the link below to review the user and make any changes if necessary.</p> <ul style='list-style-type:none; margin:25px 15px;'> <li><b>User name:</b> Test User</li> <li><b>User email:</b> [email protected]</li> <li><b>Identifier:</b> abc123def132afd1213afas</li> <li><b>Description:</b> Tom's iPad</li> <li><b>Model:</b> iPad 3</li> <li><b>Platform:</b> </li> <li><b>App:</b> Test app name</li> <li><b>UserID:</b> </li> </ul> <p>Review user: https://cirrus.app47.com/[email protected]</p> <hr style='height=2px; color:#aaa'/> <p>We hope you enjoy the app store experience!</p> <p style='font-size:18px; color:#999'>Powered by App47</p> <img src='https://cirrus.app47.com/notifications/562506219ac25b1033000904/img' alt=''/></body></html>
END_OF_HTML
Или с помощью скобок (это выглядит немного странно, но это работает, и иногда необходимо):
Nokogiri::HTML(<<-END_OF_HTML)
<html> <meta content="text/html; charset=UTF-8"/> <body style='margin:20px'> <p>The following user has registered a device, click on the link below to review the user and make any changes if necessary.</p> <ul style='list-style-type:none; margin:25px 15px;'> <li><b>User name:</b> Test User</li> <li><b>User email:</b> [email protected]</li> <li><b>Identifier:</b> abc123def132afd1213afas</li> <li><b>Description:</b> Tom's iPad</li> <li><b>Model:</b> iPad 3</li> <li><b>Platform:</b> </li> <li><b>App:</b> Test app name</li> <li><b>UserID:</b> </li> </ul> <p>Review user: https://cirrus.app47.com/[email protected]</p> <hr style='height=2px; color:#aaa'/> <p>We hope you enjoy the app store experience!</p> <p style='font-size:18px; color:#999'>Powered by App47</p> <img src='https://cirrus.app47.com/notifications/562506219ac25b1033000904/img' alt=''/></body></html>
END_OF_HTML
Вы можете прочитать больше о heredocs и других способах представления строк в разделе Literals документации Ruby.
использовать одиночные кавычки внутри HTML или одиночные кавычки вне HTML прямо сейчас 'text/html; charset = UTF-8' не является частью строки – engineersmnky