我正在尝试抓取存储在此维基百科页面https://en.wikipedia.org/wiki/Minister_of_Agriculture_(India)的表格中的数据。 但是我无法抓取完整的数据 她是我到目前为止写的:
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,Surjit Singh Barnala,Rao Birendra Singh
而输出应该是:Jairamdas Daulatram,然后是Panjabrao Deshmukh
答案 0 :(得分: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>
答案 1 :(得分: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)