2015-05-05 2 views
3

Я пытаюсь очистить данные с сайта, на котором используется большое количество таблиц. Я изучаю документацию beautifulsoup, а также здесь, в stackoverflow, но я все еще потерян.BeautifulSoup соскабливает вложенные таблицы

Вот указанная таблица:

 <form action="/rr/" class="form"> 
 
     <table border="0" width="100%" cellpadding="2" cellspacing="0" align="left"> 
 
      <tr bgcolor="#6699CC"> 
 
      <td valign="top"><font face="arial"><b>Uesless Data</b></font></td> 
 
    
 
      <td width="10%"><br /></td> 
 
    
 
      <td align="right"><font face="arial">Uesless Data</font></td> 
 
      </tr> 
 
    
 
      <tr bgcolor="#DCDCDC"> 
 
      <td> <input size="12" name="s" value="data:" onfocus= 
 
      "this.value = '';" /> <input type="hidden" name="d" value="research" /> 
 
    \t \t \t \t 
 
      <input type="submit" value="Date" /></td> 
 
    
 
      <td width="10%"><br /></td> 
 
    
 
      </tr> 
 
     </table> 
 
     </form> 
 
    
 
     <table border="0" width="100%"> 
 
     <tr> 
 
      <td></td> 
 
     </tr> 
 
     </table><br /> 
 
     <br /> 
 
    
 
     <table border="0" width="100%"> 
 
     <tr> 
 
      <td valign="top" width="99%"> 
 
      <table cellpadding="2" cellspacing="0" border="0" width="100%"> 
 
       <tr bgcolor="#A0B8C8"> 
 
       <td colspan="6"><b>Data to be pulled</b></td> 
 
       </tr> 
 
    
 
       <tr bgcolor="#DCDCDC"> 
 
       <td><font face="arial"><b>Data to be pulled</b></font></td> 
 
    
 
       <td><font face="arial"><b>Data to be pulled</b></font></td> 
 
    
 
       <td align="center"><font face="arial"><b>Data to be pulled 
 
       </b></font></td> 
 
    
 
       <td align="center"><font face="arial"><b>Data to be pulled 
 
       </b></font></td> 
 
    
 
       <td align="center"><font face="arial"><b>Data to be pulled 
 
       </b></font></td> 
 
    
 
       <td align="center"><font face="arial"><b>Data to be pulled 
 
       </b></font></td> 
 
       </tr> 
 
    
 
       <tr> 
 
       <td>Data to be pulled</td> 
 
    
 
       <td align="center">Data to be pulled</td> 
 
    
 
       <td align="center">Data to be pulled</td> 
 
    
 
       <td align="center">Data to be pulled</td> 
 
    
 
       <td align="center"><br /></td> 
 
       </tr> 
 
    \t  </table> 
 
    \t </td> 
 
    \t </tr> 
 
     </table>

Есть немало столов, и ни один из них действительно имеют отличительные идентификаторы или метки. Моя последняя попытка была:

table = soup.find('table', attrs={'border':'0', 'width': "100%'}) 

Что вытаскивает только первый пустой стол. Я чувствую, что ответ прост, и я над этим думаю.

+0

В чем проблема? Если он просто находит все 4 таблицы с (надмножеством) этих attrs, используйте 'find_all' вместо' find'. Это все, что ты хотел? – abarnert

+0

Между тем, если каждая таблица на странице имеет те же 'border' и' width', эти attrs на самом деле не делают вам ничего хорошего. Это так же хрупко, как если бы вы просто делали 'soup.find_all ('table')'. И на самом деле нет хорошего способа стать кем-то неудобным на странице стиля 90-х годов. Вы можете попытаться сделать причудливые вещи, как только найти 'table's, которые находятся под какой-либо другой определенной цепочкой тегов и так далее, и надеяться, что они никогда не изменят макет страницы, но обычно это не стоит делать, если простая вещь возвращает правильные результаты. – abarnert

ответ

4

Если вы просто ищете все столы, а не первый, вы просто хотите, чтобы find_all вместо find.

Если вы пытаетесь найти определенную таблицу, такую ​​как вложенная внутри другой, а страница использует дизайн в стиле 90-х, что делает невозможным его поиск через id или другие атрибуты, единственным вариантом является поиск по структуре:

for table in soup.find_all('table'): 
    for subtable in table.find_all('table'): 
     # Found it! 

И, конечно, вы можете сгладить это в одном понимание, если вы действительно хотите:

subtable = next(subtable for table in soup.find_all('table') 
       for subtable in table.find_all('table')) 

Обратите внимание, что я кончил в attrs. Если каждая таблица на странице имеет надмножество одинаковых атрибутов, вы ничего не помогаете, указав их.

Все это, очевидно, уродливое и ломкое ... но действительно нет способа не быть хрупким с такого рода компоновкой.

Использование другой библиотеки, такой как lxml.html, которая позволяет вам искать XPath, может сделать ее немного более компактной, но в конечном итоге она будет делать то же самое.

+0

Макет затруднял поиск без какого-либо окончательного 'id'. Я пытаюсь получить информацию td из вложенной таблицы. Поиск по структуре - это то, что я думал, что мне нужно было делать, я просто не знал, как это сделать. Я сделаю это. – kayduh

+0

@ user2259786: Да, таблицы-внутри-таблицы внутри табличных макетов без 'id' в любом месте и т. Д. Затрудняют извлечение данных просто, эффективно или надежно; поэтому он называется «стиль 90-х», потому что большинство людей решили прекратить это делать 15 лет назад. :) Но если вам приходится иметь дело со страницей, которая по-прежнему выполняется в старом стиле, вам придется выполнять неуклюжий поиск в старом стиле. – abarnert

Смежные вопросы