2015-10-19 2 views
0

Я пытаюсь написать сценарий ruby, который анализирует строку HTML и получает некоторые значения из определенных узлов.Анализ строки HTML с помощью Nokogiri

В настоящее время я борюсь с только чтение строки в документ Nokogiri:

Этот код:

#!/usr/bin/ruby 

html_doc = Nokogiri::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>") 

Производит эту ошибку:

$ ruby emailParser.rb 
emailParser.rb:3: syntax error, unexpected tIDENTIFIER, expecting ')' 
...ML("<html> <meta content="text/html; charset=UTF-8"/> <bod... 
...        ^
emailParser.rb:3: syntax error, unexpected tSTRING_BEG, expecting end-of-input 
...tent="text/html; charset=UTF-8"/> <body style='margin:20px'... 
...        ^

Обратите внимание, что я попробовал решение здесь с тем же результатом:

"syntax error, unexpected tIDENTIFIER, expecting $end"

+1

использовать одиночные кавычки внутри HTML или одиночные кавычки вне HTML прямо сейчас 'text/html; charset = UTF-8' не является частью строки – engineersmnky

ответ

1

Проблема заключается в том, что у вас есть двойные кавычки внутри вашей строки, которые сбивают с толку парсер, потому что вы также используете двойные кавычки, чтобы окружить строку. Для иллюстрации:

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.

1

Вы должны изменить строковые кавычки html с "на" и изменить строковые кавычки внутри html to ". Нечто подобное должно работать:

#!/usr/bin/ruby 

html_doc = Nokogiri::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>') 
Смежные вопросы