2016-01-29 3 views
1

Я пытаюсь очистить данные, хранящиеся в таблице этой страницы wikipedia https://en.wikipedia.org/wiki/Minister_of_Agriculture_(India). Однако я не в состоянии очистить полную информацию Hers это то, что я написал до сих пор:Скребок Wiki с использованием python

from bs4 import BeautifulSoup 
import urllib2 
wiki = "https://en.wikipedia.org/wiki/Minister_of_Agriculture_(India)" 
header = {'User-Agent': 'Mozilla/5.0'} #Needed to prevent 403 error on Wikipedia 
req = urllib2.Request(wiki,headers=header) 
page = urllib2.urlopen(req) 
soup = BeautifulSoup(page,"html.parser") 

name = "" 
pic = "" 
strt = "" 
end = "" 
pri = "" 
x="" 
table = soup.find("table", { "class" : "wikitable" }) 
for row in table.findAll("tr"): 
    cells = row.findAll("td") 

    if len(cells) == 8: 
     name = cells[0].find(text=True) 
     print name` 

Выход полученный: Джейрамдас Даулатрам, Сурджит Сингх Барнала, Рао Бирендра Сингх

В то время как выход должен быть : Jairamdas Daulatram, а затем Panjabrao Deshmukh

ответ

1

Вы читали необработанный html?

Поскольку некоторые из ячеек занимают несколько строк (например, Политическая партия), большинство строк не содержат в себе 8 ячеек.

Поэтому вы не можете сделать if len(cells) == 8 и ожидать его работы. Подумайте о том, что должна была сделать эта линия. Если было проигнорировать строку заголовка, вы можете заменить ее на if len(cells) > 0, потому что все ячейки заголовка являются <th> тегами (и поэтому не будут отображаться в вашем списке).

источник страницы (показывая вашу проблему):

<tr> 
    <td><a href="/wiki/Jairamdas_Daulatram" title="Jairamdas Daulatram">Jairamdas Daulatram</a></td> 
    <td></td> 
    <td>1948</td> 
    <td>1952</td> 
    <td rowspan="6"><a href="/wiki/Indian_National_Congress" title="Indian National Congress">Indian National Congress</a></td> 
    <td rowspan="6" bgcolor="#00BFFF" width="4px"></td> 
    <td rowspan="3"><a href="/wiki/Jawaharlal_Nehru" title="Jawaharlal Nehru">Jawaharlal Nehru</a></td> 
    <td><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span>[</span>1<span>]</span></a></sup></td> 
    </tr> 
    <tr> 
    <td><a href="/wiki/Panjabrao_Deshmukh" title="Panjabrao Deshmukh">Panjabrao Deshmukh</a></td> 
    <td></td> 
    <td>1952</td> 
    <td>1962</td> 
    <td><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span>[</span>2<span>]</span></a></sup></td> 
    </tr> 
+2

В дополнение к тому, чтобы сообщить ему, что он * не может сделать, сказать ему, что он * может * сделать. Например, он может заменить 'if len (cells) == 8'' if len (cells)> 0'. –

1

Как уже говорилось в предыдущем посте. Не имеет смысла устанавливать статическую длину. Просто проверьте, существует ли <td>. Нижеприведенный код написан на Python 3, но должен работать и в Python 2.7 с некоторыми небольшими корректировками.

from bs4 import BeautifulSoup 
from urllib.request import urlopen 

wiki = urlopen("https://en.wikipedia.org/wiki/Minister_of_Agriculture_(India)") 

soup = BeautifulSoup(wiki, "html.parser") 

table = soup.find("table", { "class" : "wikitable" }) 
for row in table.findAll("tr"): 
    cells = row.findAll("td") 

    if cells: 
     name = cells[0].find(text=True) 
     print(name) 
Смежные вопросы