使用 python 进行 Wiki 抓取

Wiki scraping using python

我正在尝试抓取存储在维基百科页面 https://en.wikipedia.org/wiki/Minister_of_Agriculture_(India) 的 table 中的数据。 但是我无法抓取完整数据 她是我到目前为止写的:

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

你读过原著了吗html?

因为有些单元格跨越多行(例如政党),所以大多数行中没有 8 个单元格。

因此,您不能 if len(cells) == 8 并期望它起作用。想一想这条线的目的是什么。如果要忽略 header 行,那么您可以将其替换为 if len(cells) > 0,因为所有 header 单元格都是 <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>

就像之前 post 中所说的那样。设置静态长度没有意义。只需检查 <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)