2013-02-25 5 views
1

Nokogiri, Mechanize 및 XPath를 사용하여 페이지를 구문 분석하려고하지만, 시도 할 때마다 빈 배열이 나타납니다. Nokogiri를 사용하여 빈 배열을 반환하는 XPath

Page I'm trying to Parse.

나는 크롬에서 그것을 검사하고 XPath를 가지고, 다음의 구문을 분석하기 위해 여러 가지 방법을 시도했지만 항상 빈 배열을 받았다.

내가 시도 :

puts page.search('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 

puts post_page.parser.xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 

puts post_page.parser.at_xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 

모두 "/ 텍스트"

와 후행하지 않고이 내가 긁어하기 위해 노력하고있어 페이지의 소스입니다 :

<SCRIPT language="JavaScript"> 
<!-- 
document.cookie = "IV_JCT=%2FMPIS; path=/"; 
//--> 
</SCRIPT> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 

    <head> 
    <title>My Schedule</title> 

    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="-1">  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my schedule"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 

    </head> 

    <body> 
    <div align="center"> 
    <strong>My Schedule</strong><br>as of Sun Feb 24 2013 06:43:09 PM CST<br><br> 
    <div align="left"><pre><br>Employee Name: Johnson Appleseed  
Unit = 12345</pre>  
    <br> 
    </div> 

    <table border="0" cellpadding="0" cellspacing="0" width="100%"> 
    <tr> 
    <td colspan="8" align="center"><b><font size="+1">Schedules may be subject to change based on business needs or demand</font></b></td> 
    </tr> 

     <tr><td> 
     <table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%"> 
     <tr bgcolor="#7C9BCF"> 
     <td width="12%" align="center"><b>Sunday</b></td> 
     <td width="12%" align="center"><b>Monday</b></td> 
     <td width="12%" align="center"><b>Tuesday</b></td> 
     <td width="12%" align="center"><b>Wednesday</b></td> 
     <td width="12%" align="center"><b>Thursday</b></td> 
     <td width="12%" align="center"><b>Friday</b></td> 
     <td width="12%" align="center"><b>Saturday</b></td> 
     <td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td> 
     </tr> 

     <tr bgcolor="#7C9BCF"> 

     <td width="14%" align="center">2013-02-24</td> 

     <td width="14%" align="center">2013-02-25</td> 

     <td width="14%" align="center">2013-02-26</td> 

     <td width="14%" align="center">2013-02-27</td> 

     <td width="14%" align="center">2013-02-28</td> 

     <td width="14%" align="center">2013-03-01</td> 

     <td width="14%" align="center">2013-03-02</td> 

     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="left"><pre>&nbsp;</pre></td> 

     <td width="14%" align="left"><pre><b>Shift: </b> 
5:30 PM - 9:00 PM 
<b>Meal:</b> 
- </pre></td> 


     <td width="14%" align="left"><pre>&nbsp;</pre></td> 

     <td width="14%" align="left"><pre>&nbsp;</pre></td> 

     <td width="14%" align="left"><pre>&nbsp;</pre></td> 

     <td width="14%" align="left"><pre><b>Shift: </b> 
2:00 PM - 9:15 PM 
<b>Meal:</b> 
5:45 PM - 6:30 PM</pre></td> 

     <td width="14%" align="left"><pre><b>Shift: </b> 
4:45 PM - 9:15 PM 
<b>Meal:</b> 
- </pre></td> 

     <td width="12%" align="center">14.5</td> 
     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">3.5</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">6.5</td> 

     <td width="14%" align="center">4.5</td> 

     <td width="14%" align="center">Daily Hours</td> 
     </tr> 

    </table> 
    </td></tr> 

     <tr><td> 
     <table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%"> 
     <tr bgcolor="#7C9BCF"> 
     <td width="12%" align="center"><b>Sunday</b></td> 
     <td width="12%" align="center"><b>Monday</b></td> 
     <td width="12%" align="center"><b>Tuesday</b></td> 
     <td width="12%" align="center"><b>Wednesday</b></td> 
     <td width="12%" align="center"><b>Thursday</b></td> 
     <td width="12%" align="center"><b>Friday</b></td> 
     <td width="12%" align="center"><b>Saturday</b></td> 
     <td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td> 
     </tr> 

     <tr bgcolor="#7C9BCF"> 

     <td width="14%" align="center">2013-03-03</td> 

     <td width="14%" align="center">2013-03-04</td> 

     <td width="14%" align="center">2013-03-05</td> 

     <td width="14%" align="center">2013-03-06</td> 

     <td width="14%" align="center">2013-03-07</td> 

     <td width="14%" align="center">2013-03-08</td> 

     <td width="14%" align="center">2013-03-09</td> 

     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="12%" align="center">0.0</td> 
     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">Daily Hours</td> 
     </tr> 

    </table> 
    </td></tr> 

     <tr><td> 
     <table border="4" bordercolor="#2D73B9" cellpadding="2" cellspacing="2" width="100%"> 
     <tr bgcolor="#7C9BCF"> 
     <td width="12%" align="center"><b>Sunday</b></td> 
     <td width="12%" align="center"><b>Monday</b></td> 
     <td width="12%" align="center"><b>Tuesday</b></td> 
     <td width="12%" align="center"><b>Wednesday</b></td> 
     <td width="12%" align="center"><b>Thursday</b></td> 
     <td width="12%" align="center"><b>Friday</b></td> 
     <td width="12%" align="center"><b>Saturday</b></td> 
     <td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td> 
     </tr> 

     <tr bgcolor="#7C9BCF"> 

     <td width="14%" align="center">2013-03-10</td> 

     <td width="14%" align="center">2013-03-11</td> 

     <td width="14%" align="center">2013-03-12</td> 

     <td width="14%" align="center">2013-03-13</td> 

     <td width="14%" align="center">2013-03-14</td> 

     <td width="14%" align="center">2013-03-15</td> 

     <td width="14%" align="center">2013-03-16</td> 

     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="14%" align="left"><pre>Sched Not Posted</pre></td> 

     <td width="12%" align="center">0.0</td> 
     </tr> 

     <tr bgcolor="#FFFFFF"> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">0.0</td> 

     <td width="14%" align="center">Daily Hours</td> 
     </tr> 

    </table> 
    </td></tr> 

    <tr> 
    <td colspan="8" align="center"><b><font size="+1">Schedules may be subject to change based on business needs or demand</font></b></td> 
    </tr> 
    </table > 

     <p><br> 
     </p> 
     <p class="align_center" >  
      <input type=button value="Print this page" onClick="javascript:window.print();">  
      <input type=button value="Close This Window" onClick="javascript:window.close();"> 
     </p> 

    </div> 
    </body> 

</html> 
+3

HTML과 같은 코드 또는 데이터를 제공 할 때 문제를 설명/재현하는 데 필요한 최소 수준으로 줄이십시오.그것보다 더 많은 것이 우리 시간을 낭비하고 우리가 당신을 도울 수있는 길을 얻습니다. 또한, 당신은 당신이 성취하려는 것을 말하지 않습니다. –

답변

5

공지 사항 XPath 접근 자에서 tbody이 필요합니다.

puts page.search('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 
puts post_page.parser.xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 
puts post_page.parser.at_xpath('/html/body/div/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]').inspect 

HTML에 tbody 태그가 없어 조회가 실패합니다.

접근자를 단순화 해보십시오. 나는 일반적으로 Nokogiri가 지원하는 CSS로 시작합니다. 거기에 갈 수 없다면 XPath로 전환합니다. 귀하의 마일리지는 다를 수 있습니다. 예를 들어

:

(rdb:1) puts doc.at('table table tr').to_html 

출력 :

열 머리글에서 점점 많은 간단한 방법입니다
<tr bgcolor="#7C9BCF"> 
<td width="12%" align="center"><b>Sunday</b></td> 
     <td width="12%" align="center"><b>Monday</b></td> 
     <td width="12%" align="center"><b>Tuesday</b></td> 
     <td width="12%" align="center"><b>Wednesday</b></td> 
     <td width="12%" align="center"><b>Thursday</b></td> 
     <td width="12%" align="center"><b>Friday</b></td> 
     <td width="12%" align="center"><b>Saturday</b></td> 
     <td rowspan="2" width="12%" align="center"><b>Total weekly Hours</b></td> 
     </tr> 

.

<tr bgcolor="#7C9BCF"> 
<td width="14%" align="center">2013-02-24</td> 
     <td width="14%" align="center">2013-02-25</td> 
     <td width="14%" align="center">2013-02-26</td> 
     <td width="14%" align="center">2013-02-27</td> 
     <td width="14%" align="center">2013-02-28</td> 
     <td width="14%" align="center">2013-03-01</td> 
     <td width="14%" align="center">2013-03-02</td> 
     </tr> 

셀 내용을 얻으려면 당신이 사용할 수 있습니다 : 당신이 얻을 수

(rdb:1) puts doc.at('table table tr[2]').to_html 

:

당신이 사용할 수있는 두 번째 행에서 얻으려면

(rdb:1) puts doc.search('table table tr[2] td').map(&:text) 

을 어느 반환 :

2013-02-24 
2013-02-25 
2013-02-26 
2013-02-27 
2013-02-28 
2013-03-01 
2013-03-02 
2013-03-03 
2013-03-04 
2013-03-05 
2013-03-06 
2013-03-07 
2013-03-08 
2013-03-09 
2013-03-10 
2013-03-11 
2013-03-12 
2013-03-13 
2013-03-14 
2013-03-15 
2013-03-16 

두 표의 머리글을 어떻게 반환하는지주의하십시오. 첫 번째 테이블로 제한하기 위해 search 대신 at을 사용할 수 있습니다. at은 일치하는 첫 번째 노드를 반환합니다. search은 배열과 같은 NodeSet을 반환합니다. 또한 의 행동과는 달리 search은 모든 문서를 전체 문서에서 찾습니다.

이 코드는 첫 번째 테이블의 두 번째 행이 다음, 내장 세포를 산책 찾습니다

 
(rdb:1) puts doc.at('table table tr[2]').search('td').map(&:text) 
2013-02-24 
2013-02-25 
2013-02-26 
2013-02-27 
2013-02-28 
2013-03-01 
2013-03-02 

그것은 이해하고 유지하기 쉽게, 훨씬 더 간단합니다.

+0

"루크 소스를 사용하십시오!" 특히 HTML과 같이 심하게 학대받는 것. –

관련 문제