python - AttributeError:'int'对象在抓取维基百科时没有属性'parent'
问题描述
我想从https://id.wikipedia.org/wiki/Demografi_Indonesia抓取。我需要提取一张表。
我使用这个脚本
#import library yang dibutuhkan
import requests
import urllib.request
import time
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from urllib.request import urlopen
#buatlah request ke website
url = 'https://id.wikipedia.org/wiki/Demografi_Indonesia'
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
#ambil table dengan class 'wikitable sortable'
soup = soup.find("table",{"class":"wikitable sortable"})
#cari data dengan tag 'td'
cells = soup.find_all('td')
#buatlah lists kosong
bps = []
nama = []
ibu_kota = []
populasi = []
luas = []
pulau = []
#memasukkan data ke dalam list berdasarkan pola HTML
if len(cells) > 0:
bps = cells[0]
bps.append(int(bps.text))
nama = cells[2]
nama.append(nama.text.strip())
ibu_kota = cells[4]
ibu_kota.append(ibu_kota.text.strip())
populasi = cells[5]
populasi.append(process_num(populasi.text.strip()))
luas = cells[6]
luas.append(process_num(luas.text.strip()))
pulau = cells[8]
pulau.append(pulau.text.strip())
#buatlah DatFrame dan masukkan ke CSV
df = pd.DataFrame(bps)
但它引发了一个错误
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-51-6130f70f1b21> in <module>
31 if len(cells) > 0:
32 bps = cells[0]
---> 33 bps.append(int(bps.text))
34
35 nama = cells[2]
~\anaconda3\lib\site-packages\bs4\element.py in append(self, tag)
412 :param tag: A PageElement.
413 """
--> 414 self.insert(len(self.contents), tag)
415
416 def extend(self, tags):
~\anaconda3\lib\site-packages\bs4\element.py in insert(self, position, new_child)
364 new_child.extract()
365
--> 366 new_child.parent = self
367 previous_child = None
368 if position == 0:
AttributeError: 'int' object has no attribute 'parent'
我想要的输出是列:BPS 代码、名称(Nama)、首都(Ibu Kota)、人口(Populasi)、面积(luas)、岛屿(Pulau)。
如何解决这种情况?
解决方案
您可以使用read_html
with[2]
提取第三个 DataFrame 表单列表,按位置选择列并按列表DataFrame.iloc
设置列名:
url = 'https://id.wikipedia.org/wiki/Demografi_Indonesia'
pos = [0,2,4,5,6,8]
df = pd.read_html(url)[2].iloc[:, pos]
df.columns = ['bps','nama','ibu_kota','populasi','luas','pulau']
print (df.head())
bps nama ibu_kota populasi luas pulau
0 11 Aceh Banda Aceh 4.494.410 56.50051 Sumatra
1 12 Sumatra Utara Medan 12.982.204 72.42781 Sumatra
2 13 Sumatra Barat Padang 4.846.909 42.22465 Sumatra
3 14 Riau Pekanbaru 5.538.367 87.84423 Sumatra
4 15 Jambi Jambi 3.092.265 45.34849 Sumatra
推荐阅读
- java - 杰克逊没有正确反序列化 SetValuedMap
- android - 如何使用签名上传密钥创建 android app bundle (aab) 文件以进行发布?
- swift - 如何创建像附加图像一样的视图。上次看到的用户个人资料图片显示在此
- php - 如何使用特定键在多维数组中查找特定值
- java - Java 中有哪些 Exchanger 类的实时示例?
- codeigniter - Codeigniter 中的数据库插入
- objective-c - ipatool 因异常而失败:Xcode 10.1
- php - 每年每月或每周如何分离数据
- python - 通过 OptionMenu 返回值
- frameworks - 在 Cognos 框架管理器中如何使用 excel 文件作为我的数据源