2016-06-08 3 views
0

I과 같은 일부 HTML이 :탐색 HTML 테이블 LXML

: 비슷한 질문을 찾고

<html> 
<body> 
<table cellpadding="0" cellspacing="0" border="0" width="100%"> 
     <tr> 
      <td align="left" colspan="4"> 
     <!-- BEGIN NEXT PREV LINKS --> 
     <table cellspacing="2" cellpadding="0" border="0"> 
     <tr> 
      <td align="left"><font style="color:gray">Previous</font>&nbsp;</td> 
      <td align="center" colspan="2" nowrap><b>1-100 of 273 employees</b></td> 
      <td align="right">&nbsp;<a href="">Next</a></td> 
     </tr> 
     <tr> 
      <td align="left" colspan="2"><font style="color:gray">First Page</font></td> 
      <td align="right" colspan="2">&nbsp;&nbsp;<a href="">Last Page</a></td> 
     </tr> 
     </table> 
     <!-- END NEXT PREV LINKS --> 
</td>  
     <td colspan="9" align="right"> 
     <a href="">Add Checked to Favorites</a>&nbsp; 
    <br> 
     <a href="">Add Checked to Excluded</a>&nbsp; 
    </td> 
     </tr> 
     <tr> 
<td rowspan="2"></td><td rowspan="2"></td>  <td rowspan="2" valign="bottom" style="padding-right:5px;"><b><a href=""/></td> 
     <td rowspan="2" valign="bottom" style="padding-right:5px;"><b><a href="">Position</a></b></td> 
     <td colspan="2" align="center" valign="bottom" height="16"><b>Ratings</b><br><img src="/images/shim_333333.gif" width="130" height="1" alt="" hspace="5"></td>  <td rowspan="2">&nbsp;&nbsp;&nbsp;</td>  <td rowspan="2" valign="bottom" style="padding-right:5px;"><b><a href="">Birth&nbsp;Date</a></b></td> 
     <td rowspan="2" valign="bottom" style="padding-right:5px;"><b><a href="">States</a></b></td> 
     <td rowspan="2">&nbsp;</td><td rowspan="2"></td> <td rowspan="2" colspan="3" align="right" valign="bottom"><a href="">Clear&nbsp;All</a>&nbsp;</td>  </tr> 
     <tr> 
     <td align="center"><b><a href="">In-State<br>Rating</a></b></td> 
     <td align="center"><b><a href="">Out of State<br>Rating</a></b></td> 
     </tr> 
     <tr> 
      <td colspan="13" valign="bottom"><img src="/images/shim.gif" width="100%" height="1" alt=""></td> 
     </tr>  <tr> 
     <td align="right" colspan=13><img src="/images/shim_dddddd.gif" width="100%" height="1" border="0" alt=""></td> 
     </tr>  <tr > 
     <td></td><td><b style="">X</b></td> 
     <td nowrap><p><a href="">Cruise, Tom</a>&nbsp;</p></td> 
     <td nowrap>Actor&nbsp;</td> 
     <td align="center"><img src="/images/stars_2_sm_green.gif" alt="instate&#13;Recommendation&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td align="center"><img src="/images/stars_4_sm.gif" alt="Summary&#13;Estimate&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td>&nbsp;</td> 
     <td nowrap>1948&nbsp;</td> 
     <td nowrap>CA</td> 
     <td></td><td></td> 

       <td>&nbsp;</td> 
     <td align="right"><input type="checkbox" name="employee_cb" value="198720" style="height:15px"></td> 
     </tr>  <tr> 
     <td align="right" colspan=13><img src="/images/shim_dddddd.gif" width="100%" height="1" border="0" alt=""></td> 
     </tr>  <tr > 
     <td><b style="">X</b></td><td></td> 
     <td nowrap><p><a href="">Schwarzenegger, Arnold</a>&nbsp;</p></td> 
     <td nowrap>Governor&nbsp;</td> 
     <td align="center"><img src="/images/ohuohausd.jpg" alt="instate&#13;Recommendation&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td align="center"><img src="/images/ohuohausd.jpg" alt="Summary&#13;Estimate&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td>&nbsp;</td> 
     <td nowrap>No Current Date&nbsp;</td> 
     <td nowrap>-</td> 
     <td></td><td></td> 

       <td>&nbsp;</td> 
     <td align="right"><input type="checkbox" name="employee_cb" value="61184" style="height:15px"></td> 
     </tr>  <tr > 
     <td><b style="">X</b></td><td></td> 
     <td nowrap><p><a href="">Obama, Barack</a>&nbsp;</p></td> 
     <td nowrap>President&nbsp;</td> 
     <td align="center"><img src="/images/ohuohausd.jpg" alt="instate&#13;Recommendation&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td align="center"><img src="/images/ohuohausd.jpg" alt="Summary&#13;Estimate&#13;Rating" height="11" width="55" align="middle" hspace="0" vspace="0"></td> 
     <td>&nbsp;</td> 
     <td nowrap>No Current Date&nbsp;</td> 
     <td nowrap>-</td> 
     <td></td><td></td> 

       <td>&nbsp;</td> 
     <td align="right"><input type="checkbox" name="employee_cb" value="225747" style="height:15px"></td> 
     </tr> 
     <tr height="15"> 
     <td align="right" colspan="14"> 
     <!-- BEGIN NEXT PREV LINKS --> 
     <table cellspacing="2" cellpadding="0" border="0"> 
     <tr> 
      <td align="left"><font style="color:gray">Previous</font>&nbsp;</td> 
      <td align="center" colspan="2" nowrap><b>1-100 of 273 employees</b></td> 
      <td align="right">&nbsp;<a href="">Next</a></td> 
     </tr> 
     <tr> 
      <td align="left" colspan="2"><font style="color:gray">First Page</font></td> 
      <td align="right" colspan="2">&nbsp;&nbsp;<a href="">Last Page</a></td> 
     </tr> 
     </table> 
     <!-- END NEXT PREV LINKS --> 

     </td> 
     </tr>  <tr> 
    <td colspan="12" valign="bottom" nowrap><br> 
     <b style="">X</bfdgdfgb style="">X</b>Lorem ipsum dolor sit amet, consectetur adipiscing elit<br> 
    <b style="c">X</b>dfgfdg<b style="">X</b>Lorem ipsum dolor sit amet, consectetur adipiscing elit<br> <b style="">F</b>: A dsd "<b style="">F</b>Lorem ipsum dolor sit amet, consectetur adipiscing elit<br> 
     &nbsp;&nbsp;&nbsp;&nbsp;dfgdfg"<b style="">F</b>"Lorem ipsum dolor sit amet, consectetur adipiscing elit<br> 
    <b style="">E</b>gfhbgdfg"<b style="">E</b>Lorem ipsum dolor sit amet, consectetur adipiscing elit 
    </td> 
     </tr><tr><td colspan="20"> 
<table cellpadding="0" cellspacing="0" border="0" width="100%" align="center"> 
    <tr> 
    <td colspan="2"><img src="/images/shim.gif" width="100%" height="5" alt=""></td> 
    </tr> 
    <tr> 
    <td valign="top">States:&nbsp;</td> 
    <td>CA=California; ND=North&nbsp;Dakota</td> 
    </tr>  
</table> 
</td></tr>  
</table></body> 
</html> 

, 나는 (테이블은 항상 전체 HTML 코드에 17이라고 지적) 구축 할 수 있었다

data = open("employeetest.htm",'r').read() 

root = lh.fromstring(data) 

rows = root.xpath("//table")[17].findall("tr") 
data = list() 
for row in rows: 
    data.append([c.text_content() for c in row.getchildren()]) 
print data 

매우 복잡한 목록을 생성합니다. 내 최종 목표는 테이블에 포함 된 모든 정보는 이상한 요소를 많이 생산 단지 그러나

[['Cruise, Tom', 'Actor', '1948', 'CA'], ['Schwarzenegger, Arnold', 'Governor', 'No Current Date', '-'], ...]    

를 얻는 것입니다. 나는 \xa0 결과를 하나의 공간으로 대체하여 청소할 수 있음을 안다. 나는 이것을 어떻게 더 많이 탐색해야할지 모르겠습니다. 감사!

+0

데이터는 모든 테이블에없는'를 ... 수행 또한 무엇'에 나타내는 사용 파라미터 nowrap 속성과 완전히 하나 개의 속성이 TRS 너의 기대되는 결과? –

+0

필자는 실수라고 생각하지만, '

'및 ''이 있습니다. '...'는 같은 패턴의 연속을 나타 내기위한 것이었다. – sundorer

+0

그래, 여는 태그를 놓 쳤어. 그래서 게시 된 것에서 당신이 원하는 것은 귀하의 질문에있는 세 가지 하위 목록입니까? –

답변

1

, 당신이 찾고 검색 범위를 좁힐 수 있습니다이 함께 최종 관련 결과를 얻기 위해 약간의 조작이 필요합니다

from lxml import html 

root = html.fromstring(h) 
rows = root.xpath("//tr[td[@nowrap and text() and count(@*)=1]]") 
data = list() 

for row in rows: 
    print(row.xpath(".//td[@nowrap]//text()")) 

출력 :

['Cruise, Tom', u'\xa0', u'Actor\xa0', u'1948\xa0', 'CA'] 
['Schwarzenegger, Arnold', u'\xa0', u'Governor\xa0', u'No Current Date\xa0', '-'] 
['Obama, Barack', u'\xa0', u'President\xa0', u'No Current Date\xa0', '-'] 
+0

감사! 이것은 꽤 잘 돌아갔다. 다른 사람들이이 정보를 필요로하고 정보를 필요로 할 때를 대비하여 인코딩을 변경해야했습니다. – sundorer

1

당신은 HTML 문서를 트래버스하고 더 세련된 XPath를 얻어야 할 것입니다. 또한 두 개의 XPath 표현식을 필요로하는 여러 요소에서 관련 데이터의 문제에 직면합니다. ...이 예상 출력에 있어야하지만, 처음 세 개의 하위 목록에서 데이터를 얻기 위해 무엇 확실하지

import lxml.etree as et 

with open("employeetest.htm",'r') as f: 
    text = f.read().replace('&nbsp', '').replace(';', '') 
root = et.HTML(text) 

# XPATH LISTS (W/ RELATED ITEMS) 
items1 = root.xpath("//td/p/a/text()") 
items2 = root.xpath("//td[p/a/text()]/following-sibling::td/text()") 

# NUMBER OF ITEMS RELATED BETWEEN EACH 
r = int(len(items2)/len(items1)) 

# ITERATE THROUGH WITH LIST SLICE AND APPEND 
data = [] 

for i in range(r): 
    inner = [] 
    inner.append(items1[i]) 
    for j in items2[0+i*r:2+i*r]: # SLICE BY EVERY THREE ITEMS 
     inner.append(j) 

    data.append(inner) 

print(data) 
# [['Cruise, Tom', 'Actor', '1948'], 
# ['Schwarzenegger, Arnold', 'Governor', 'No Current Date'], 
# ['Obama, Barack', 'President', 'No Current Date']]