Ваша основная проблема в том, что вы не понимаете XPath.(Вы находитесь в хорошей компании; XPath довольно запутанный.) Ваши селекторы просто не соответствуют тому, что, по вашему мнению, они соответствуют.В частности, тот, который взорвется
*/img
должен быть
//img
или что-то в этом роде.
Теперь, , потому что xpathселектор ничего не соответствует, значение этого оператора Ruby
block.at_xpath("*/img")
равно нулю.И nil не поддерживает []
, поэтому, когда вы пытаетесь вызвать ["width"]
, Ruby жалуется с ошибкой undefined method [] for nil:NilClass
.
А что касается того, почему он взрывается, только когда вы присваиваете его переменной ... да, на самом деле это не то, что происходит.Вы, вероятно, тоже изменили что-то еще.
А теперь, позвольте мне сделать несколько других, надеюсь, конструктивных критических замечаний по коду:
Ваш вопрос, очевидно, был разработан, чтобы сделатьтрудно ответить.В будущем, пожалуйста, выделите код, о котором идет речь, а не просто вставляйте все домашнее задание (или для чего предназначен этот скребок для экрана).
Было бы очень здорово, если бы выпревратили его в один исполняемый файл Ruby, который мы можем дословно выполнить на наших компьютерах, например:
.
require "nokogiri"
doc = Nokogiri.parse <<-HTML
<tr>
<td><img src="http://ycombinator.com/images/s.gif" height="1" width="0"></td>
<td valign="top"><center>
<a id="up_3004849" href="vote?for=3004849&dir=up&whence=%2f%78%3f%66%6e%69%64%3d%34%6b%56%68%71%6f%52%4d%38%44"><img src="http://ycombinator.com/images/grayarrow.gif" border="0" vspace="3" hspace="2"></a><span id="down_3004849"></span>
</center></td>
<td class="default">
<div style="margin-top:2px; margin-bottom:-10px; ">
<span class="comhead">
<a href="user?id=patio11">patio11</a> 12 days ago | <a href="item?id=3004849">link</a> | <a href="item?id=3004793">parent</a> | on: <a href="item?id=3004471">Ask HN: What % of your job interviewees pass FizzB...</a>
</span>
</div>
<br><span class="comment"><font color="#000000">Every time FizzBuzz problems come up among engineers, people race to solve them and post their answers, then compete to see who can write increasingly more nifty answers for a question which does not seek niftiness at all.<p>I'm all for intellectual gamesmanship, but these are our professional equivalent of a doctor being asked to identify the difference between blood and water. You can do it. <i>We know</i>. Demonstrating that you can do it is not the point of the exercise. We do it to have a cheap-to-administer test to exclude people-who-cannot-actually-program-despite-previous-job-titles from the expensive portions of the hiring process.</p></font></span><p><font size="1"><u><a href="reply?id=3004849&whence=%2f%78%3f%66%6e%69%64%3d%34%6b%56%68%71%6f%52%4d%38%44">reply</a></u></font></p>
</td>
</tr>
HTML
width = doc.at_xpath("*/img")["width"].to_i
Таким образом, мы сможем отладить наши компьютеры,не только в наших мыслях.
Вы пишете Ruby сейчас, а не на Java, так что соблюдайте соглашения о пробелах и именах Ruby : имена файлов - snake_case, отступы -2 пробела, без вкладок и т. Д. Действительно трудно прочитать код, который отформатирован неправильно - где «неправильно» означает «нестандартный».
Везде, где есть один из этих описательныхкомментарии (### Date and Time ###
) - это возможность извлечь метод (def date_and_time(array)
) и сделать ваш код чище и проще для отладки.