【问题标题】:Wiki scraping using python使用 python 进行 Wiki 抓取
【发布时间】:2016-01-29 16:53:55
【问题描述】:

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

【问题讨论】:

    标签: python web screen-scraping


    【解决方案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>
    

    【讨论】:

    • 除了告诉他不能做什么,还要告诉他可以做什么。例如,他可以将if len(cells) == 8 替换为if len(cells) &gt; 0
    【解决方案2】:

    就像在前一篇文章中所说的那样。设置静态长度没有意义。只需检查&lt;td&gt; 是否存在。下面的代码是用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2011-10-21
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多