Wiki使用python进行抓取

时间:2016-01-29 16:53:56

标签: python web screen-scraping

我正在尝试抓取存储在此维基百科页面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

2 个答案:

答案 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)