Python 美丽的汤和刮削维基百科条目:

Python 美丽的汤和刮削维基百科条目:,python,web-scraping,beautifulsoup,wikipedia,Python,Web Scraping,Beautifulsoup,Wikipedia,初学美貌的人,我正在试着提取 该维基百科链接的公司名称、排名和收入 到目前为止,我使用的代码是: from bs4 import BeautifulSoup import requests url = "https://en.wikiepdia.org" req = requests.get(url) bsObj = BeautifulSoup(req.text, "html.parser") data = bsObj.find('table'

初学美貌的人,我正在试着提取

该维基百科链接的公司名称、排名和收入

到目前为止,我使用的代码是:

from bs4 import BeautifulSoup 
import requests 
url = "https://en.wikiepdia.org" 
req = requests.get(url) 
bsObj = BeautifulSoup(req.text, "html.parser") 
data = bsObj.find('table',{'class':'wikitable sortable mw-collapsible'})
revenue=data.findAll('data-sort-value')
我意识到,即使是“数据”也不能正常工作,因为当我将其传递到flask网站时,它不包含任何值

请有人提出一个解决方案和最优雅的方式来实现上述目标,以及一些建议,为我们在HTML中寻找什么样的最佳方法时,刮(和格式)

在这个链接上,我不确定我要用什么来提取-是table类、div类还是body类。此外,如何进一步提取链接和收入

我也试过:

data = bsObj.find_all('table', class_='wikitable sortable mw-collapsible')
它运行服务器时没有错误。但是,网页“[]”上只显示一个空列表

基于以下一个答案:我将代码更新为:

url = "https://en.wikiepdia.org" 
req = requests.get(url) 
bsObj = BeautifulSoup(req.text, "html.parser") 
mydata=bsObj.find('table',{'class':'wikitable sortable mw-collapsible'})
table_data=[]
rows = mydata.findAll(name=None, attrs={}, recursive=True, text=None, limit=None, kwargs='')('tr')
for row in rows:
    cols=row.findAll('td')
    row_data=[ele.text.strip() for ele in cols]
    table_data.append(row_data)

data=table_data[0:10]
持续性错误是:

 File "webscraper.py", line 15, in <module>
    rows = mydata.findAll(name=None, attrs={}, recursive=True, text=None, limit=None, kwargs='')('tr')
AttributeError: 'NoneType' object has no attribute 'findAll'
为了完整性(以及完整的答案),我希望它能够显示出来

-表中的前五家公司 -公司名称、级别、收入

当前它显示以下内容:

 File "webscraper.py", line 15, in <module>
    rows = mydata.findAll(name=None, attrs={}, recursive=True, text=None, limit=None, kwargs='')('tr')
AttributeError: 'NoneType' object has no attribute 'findAll'
维基百科

[[]、[1]、[1]、[Amazon]、[280.5]、[2019]、[798000]、[920.22]、[Seattle]、[1994]、[1][2]、[2]、[2]、[Google]、[161.8]、[2019]、[118899]、[921.14]、[Mountain View]、[1998]、[3]、[JD.com]、[82.8]、[2019]、[220000]、[51.51]、[5][6]、[3]、[4]、[3]、[3]、[3]、[3]、[3]、[3]、[,['4'、'Facebook'、'70.69美元'、'2019美元'、'45000美元'、'585.37美元'、'Menlo Park'、'2004年'、'7][8]]

[1]、“亚马逊”、“280.5美元”、“2019年”、“798000美元”、“920.22美元”、“西雅图”、“1994年”、“1][2]]

['2'、'Google'、'161.8美元'、'2019'、'118899'、'921.14美元'、'Mountain View'、'1998'、'[3][4].

通常(并非总是)在处理维基百科表格时,你不必为beautifulsoup费心。只需使用熊猫:

import pandas as pd
table = pd.read_html('https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies')
table[0]
输出:

    Rank    Company     Revenue ($B)    F.Y.    Employees   Market cap. ($B)    Headquarters    Founded     Refs
0   1   Amazon  $280.5  2019    798000  $920.22     Seattle     1994    [1][2]
1   2   Google  $161.8  2019    118899  $921.14     Mountain View   1998    [3][4]
    Rank Company    Revenue ($B)
0   1   Amazon      $280.5
1   2   Google      $161.8
2   3   JD.com     $82.8
3   4   Facebook    $70.69
4   5   Alibaba     $56.152
[['1', 'Amazon', '$280.5'],
 ['2', 'Google', '$161.8'],
 ['3', 'JD.com', '$82.8'],
 ['4', 'Facebook', '$70.69'],
 ['5', 'Alibaba', '$56.152']]
等等。 然后可以使用标准方法选择或删除列等

编辑: 仅显示前5名公司的名称、排名和收入:

table[0][["Rank", "Company","Revenue ($B)"]].head(5)
输出:

    Rank    Company     Revenue ($B)    F.Y.    Employees   Market cap. ($B)    Headquarters    Founded     Refs
0   1   Amazon  $280.5  2019    798000  $920.22     Seattle     1994    [1][2]
1   2   Google  $161.8  2019    118899  $921.14     Mountain View   1998    [3][4]
    Rank Company    Revenue ($B)
0   1   Amazon      $280.5
1   2   Google      $161.8
2   3   JD.com     $82.8
3   4   Facebook    $70.69
4   5   Alibaba     $56.152
[['1', 'Amazon', '$280.5'],
 ['2', 'Google', '$161.8'],
 ['3', 'JD.com', '$82.8'],
 ['4', 'Facebook', '$70.69'],
 ['5', 'Alibaba', '$56.152']]
通常(并非总是)在处理Wikipedia表格时,您不必为beautifulsoup而烦恼。只需使用pandas:

import pandas as pd
table = pd.read_html('https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies')
table[0]
输出:

    Rank    Company     Revenue ($B)    F.Y.    Employees   Market cap. ($B)    Headquarters    Founded     Refs
0   1   Amazon  $280.5  2019    798000  $920.22     Seattle     1994    [1][2]
1   2   Google  $161.8  2019    118899  $921.14     Mountain View   1998    [3][4]
    Rank Company    Revenue ($B)
0   1   Amazon      $280.5
1   2   Google      $161.8
2   3   JD.com     $82.8
3   4   Facebook    $70.69
4   5   Alibaba     $56.152
[['1', 'Amazon', '$280.5'],
 ['2', 'Google', '$161.8'],
 ['3', 'JD.com', '$82.8'],
 ['4', 'Facebook', '$70.69'],
 ['5', 'Alibaba', '$56.152']]
等等。 然后可以使用标准方法选择或删除列等

编辑: 仅显示前5名公司的名称、排名和收入:

table[0][["Rank", "Company","Revenue ($B)"]].head(5)
输出:

    Rank    Company     Revenue ($B)    F.Y.    Employees   Market cap. ($B)    Headquarters    Founded     Refs
0   1   Amazon  $280.5  2019    798000  $920.22     Seattle     1994    [1][2]
1   2   Google  $161.8  2019    118899  $921.14     Mountain View   1998    [3][4]
    Rank Company    Revenue ($B)
0   1   Amazon      $280.5
1   2   Google      $161.8
2   3   JD.com     $82.8
3   4   Facebook    $70.69
4   5   Alibaba     $56.152
[['1', 'Amazon', '$280.5'],
 ['2', 'Google', '$161.8'],
 ['3', 'JD.com', '$82.8'],
 ['4', 'Facebook', '$70.69'],
 ['5', 'Alibaba', '$56.152']]

下面是一个使用BeautifulSoup的示例。下面的许多内容都基于这里的答案

从bs4导入美化组
导入请求
url='1〕https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies' 
req=请求。获取(url)
bsObj=BeautifulSoup(req.text'html.parser')
data=bsObj.find('table',{'class':'wikitable sortable mw collapsable'})
表_数据=[]
行=数据。查找所有('tr')
对于行中的行:
cols=行。查找所有('td'))
行数据=[ele.text.strip()表示列中的元素]
表_data.append(行_数据)
#第一个元素是header,所以它是空的
表_数据[0:5]
# [[],
#[1”,“亚马逊”,“280.5美元”,“2019年”,“798000美元”,“920.22美元”,“西雅图”,“1994年”,“1][2]],
#[2]、“谷歌”、“161.8美元”、“2019年”、“118899美元”、“921.14美元”、“山景”、“1998年”、“3][4],
#[3]、“京东”、“82.8美元”、“2019年”、“22万美元”、“51.51美元”、“北京”、“1998年”、“5][6]”,
#['4'、'Facebook'、'70.69美元'、'2019美元'、'45000美元'、'585.37美元'、'Menlo Park'、'2004年'、'7][8]]
因此,隔离此列表中的某些元素,您只需要注意内部列表的数字索引

#亚马逊的整行
表2数据[1]
#[1]、“亚马逊”、“280.5美元”、“2019年”、“798000美元”、“920.22美元”、“西雅图”、“1994年”、“1][2]]
#等级
表_数据[1][0]
# '1'
#公司
表_数据[1][1]
#“亚马逊”
#收入
表_数据[1][2]
# '$280.5'
因此,为了只分离前两列(排名、公司和收入),您可以运行以下列表

iso_数据=[tab[0:3]用于表_数据中的tab]
iso_数据[1:6]
#[[1]、[Amazon'、[280.5']、[2]、[Google'、[161.8']、[3]、[JD.com'、[82.8']、[4]、[Facebook'、[70.69']、[5]、[Alibaba'、[56.152']
然后,如果要将其放入
pandas
数据框中,可以执行以下操作

将熊猫作为pd导入
#此处的'1'对于删除空标题很重要
df=pd.DataFrame(表_数据[1],列=['Rank','Company','Revenue','F.Y','Employees','Market cap','Headstation','Founded','Refs'])
df
#Rank公司收入F.Y.员工市值总部成立参考文献
#01亚马逊$280.5 2019 798000$920.22西雅图1994[1][2]
#1 2谷歌2019年161.8美元118899年921.14美元山景1998[3][4]
#2.3京东公司$82.8 2019 220000$51.51北京1998[5][6]
#3 4 Facebook 2019年70.69美元45000美元梅洛公园2004年585.37美元[7][8]
#4.5阿里巴巴$56.152 2019 101958$570.95杭州1999[9][10]
# ..  ...         ...      ...   ...       ...        ...            ...     ...         ...
#75 77 Farfetch 2019年1.02美元4532 2007年伦敦3.51美元[138][139]
(76)78 YELP 1.01美元2019 2019 5950美元2.48旧金山1996 [140 ] [141 ]
#77 79 Vroom.com$1.1 2020 3990$5.2纽约市2003[142]
78×80克拉吉列1美元2018 1000旧金山1995 [ 143 ]
(79)81美元,1美元,2018美元,3990美元,旧金山2003(144)
# 
#[80行x 9列]

下面是一个使用BeautifulSoup的示例。下面的许多内容都基于这里的答案

从bs4导入美化组
导入请求
url='1〕https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies' 
req=请求。获取(url)
bsObj=BeautifulSoup(req.text'html.parser')
data=bsObj.find('table',{'class':'