【发布时间】:2020-07-03 14:46:32
【问题描述】:
BeautifulSoup 的初学者,我正在尝试提取
来自此维基百科链接的公司名称、排名和收入。
https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies
我目前使用的代码是:
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')
我意识到即使是“数据”也无法正常工作,因为当我将它传递给烧瓶网站时它没有任何值。
是否有人可以提出解决方案和实现上述目标的最优雅方式,以及对我们在抓取时在 HTML 中寻找的内容(和格式)的最佳方法提出一些建议。
在此链接上,https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies 我不确定要使用什么来提取 - 是表类、div 类还是正文类。此外,如何进一步提取链接和收入。
我也试过了:
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'
根据下面的回答,它现在正在抓取数据,但不是上面要求的格式:
我有这个:
url = 'https://en.m.wikipedia.org/wiki/List_of_largest_Internet_companies'
req = requests.get(url)
bsObj = BeautifulSoup(req.text, 'html.parser')
data = bsObj.find('table',{'class':'wikitable sortable mw-collapsible'})
table_data = []
rows = data.find_all('tr')
for row in rows:
cols = row.find_all('td')
row_data = [ele.text.strip() for ele in cols]
table_data.append(row_data)
# First element is header so that is why it is empty
data=table_data[0:5]
for in in range(5):
rank=data[i]
name=data[i+1]
为了完整性(和完整的答案),我希望它能够显示
-表中前五家公司 - 公司名称、排名、收入
目前显示如下:
维基百科
[[], ['1', '亚马逊', '$280.5', '2019', '798,000', '$920.22', '西雅图', '1994', '[1][2]'], ['2', '谷歌', '$161.8', '2019', '118,899', '$921.14', '山景', '1998', '[3][4]'], ['3', '京东', '$82.8', '2019', '220,000', '$51.51', '北京', '1998', '[5][6]'], ['4', 'Facebook', '$70.69 ', '2019', '45,000', '$585.37', '门洛帕克', '2004', '[7][8]']]
['1', '亚马逊', '$280.5', '2019', '798,000', '$920.22', '西雅图', '1994', '[1][2]']
['2', 'Google', '$161.8', '2019', '118,899', '$921.14', '山景', '1998', '[3][4]']
【问题讨论】:
-
您正在抓取的 URL 是维基百科主页。这是代码的
url = "https://en.wikiepdia.org"部分。该页面上没有表格,所以 BeautifulSoup 没有给你任何返回索引。这就是你收到错误的原因。您需要将该 URL 替换为一个带有您引用的表的表 en.m.wikipedia.org/wiki/List_of_largest_Internet_companies -
啊,谢谢...但还是 findall 错误?
-
应该是
.find_all()而不是.findAll()
标签: python web-scraping beautifulsoup wikipedia