使用python从Wikipedia抓取表格:无法获取列

时间:2018-11-16 19:21:41

标签: python python-3.x web-scraping html-table beautifulsoup

我正在尝试从Wikipedia

抓取一张桌子
<tr>
  <td>1</td>
  <td><span class="nowrap"><span class="datasortkey" data-sort-value="Etats unis"><span class="flagicon"><a class="image" href="/wiki/Fichier:Flag_of_the_United_States.svg" title="Drapeau des États-Unis"><img alt="Drapeau des États-Unis" class="noviewer thumbborder" data-file-height="650" data-file-width="1235" height="11" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/20px-Flag_of_the_United_States.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/30px-Flag_of_the_United_States.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/40px-Flag_of_the_United_States.svg.png 2x" width="20" /></a> </span><a href="/wiki/%C3%89tats-Unis" title="États-Unis">États-Unis</a></span></span></td>
  <td>19 390,60 </td>
</tr>

您已经注意到有3列,这是我使用的代码

A = []
B = []
C = []

for row in DataFondMonetaireInt.findAll("tr"):
    cells = row.findAll("td")
    if len(cells) == 3:
        A.append(cells[0].find(text=True))
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))

它对A和C都很好,但对B却不行,我无法获得国家名称(在示例中:Etats Unis

为什么不起作用?

先谢谢您,

3 个答案:

答案 0 :(得分:3)

使用.text代替.find(text=True)

DataFondMonetaireInt = BeautifulSoup(html_text, "html.parser")

A = []
B = []
C = []

for row in DataFondMonetaireInt.findAll("tr"):
    cells = row.findAll("td")
    if len(cells) == 3:
        A.append(cells[0].text)
        B.append(cells[1].text.strip())
        C.append(cells[2].text)

答案 1 :(得分:2)

您可以执行以下操作获取每个表格

import pandas as pd
tables = pd.read_html("https://fr.wikipedia.org/wiki/Liste_des_pays_par_PIB_nominal")
[tables[i] for i in range(3)]

答案 2 :(得分:0)

您还可以使用Wikipedia API来获取WikiText数据:

import requests
import wikitextparser as wtp
import re

r = requests.get(
    'https://fr.wikipedia.org/w/api.php',
    params = {
        'action': 'parse',
        'page': 'Liste_des_pays_par_PIB_nominal',
        'contentmodel': 'wikitext',
        'prop': 'wikitext',
        'format': 'json'
    }
)

data = wtp.parse(r.json()['parse']['wikitext']['*'])

f = re.compile(r'[0-9]+[.[0-9]+]?')

for i in range(1, 4):
    print([
        (t[0], wtp.parse(t[1]).templates[0].name, float(f.findall(t[2])[0]))
        for t in data.tables[i].data()
        if len(wtp.parse(t[1]).templates) > 0
    ])

以上内容将使用WikiTextParser library

提供来自3个表的数据