【问题标题】:Placing BeautifulSoup data into a Pandas dataframe - coming up blank将 BeautifulSoup 数据放入 Pandas 数据框 - 空白
【发布时间】:2020-10-30 00:10:58
【问题描述】:

目标:我想在从网站上抓取数据并将其缩小到感兴趣的表格后创建一个数据框(我希望获得所有国家/地区的人均肉类消费量在世界上)

问题:我有感兴趣的表,但无法将其放入数据框中。但是,我尝试的所有操作都以空白数据框结束

输出:

<table class="wikitable sortable">
<caption>Countries by meat consumption per capita
</caption>
<tbody><tr>
<th>Country</th>
<th>kg/person (2002)<sup class="reference" id="cite_ref-9"><a href="#cite_note-9">[9]</a></sup><sup class="reference" id="cite_ref-11"><a href="#cite_note-11">[note 1]</a></sup></th>
<th>kg/person (2009)<sup class="reference" id="cite_ref-FAO2013_10-1"><a href="#cite_note-FAO2013-10">[10]</a></sup></th>
<th>kg/person (2017)<sup class="reference" id="cite_ref-12"><a href="#cite_note-12">[11]</a></sup>
</th></tr>
<tr>
<td><span class="flagicon"><img alt="" class="thumbborder" data-file-height="700" data-file-width="980" decoding="async" height="15" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/21px-Flag_of_Albania.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/32px-Flag_of_Albania.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/42px-Flag_of_Albania.svg.png 2x" width="21"/> </span><a href="/wiki/Albania" title="Albania">Albania</a></td>
<td>38.2</td>
<td></td>
<td>
</td></tr>
<tr>
<td><span class="flagicon"><img alt="" class="thumbborder" data-file-height="600" data-file-width="900" decoding="async" height="15" src="//upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/23px-Flag_of_Algeria.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/35px-Flag_of_Algeria.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/45px-Flag_of_Algeria.svg.png 2x" width="23"/> </span><a href="/wiki/Algeria" title="Algeria">Algeria</a></td>
<td>18.3</td>
<td>19.5</td>
<td>17.33
</td></tr>
<tr>
<td><span class="flagicon"><img alt="" class="thumbborder" data-file-height="500" data-file-width="1000" decoding="async" height="12" src="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/23px-Flag_of_American_Samoa.svg.png" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/35px-Flag_of_American_Samoa.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/46px-Flag_of_American_Samoa.svg.png 2x" width="23"/> </span><a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></td>
<td>24.9</td>
<td>26.8</td>
<td>
</td></tr>
<tr>

我希望提取以下列标题来获取世界上所有国家/地区人均肉类消费量的图表:国家,公斤/人(2002 年),公斤/人(2009 年),公斤/人(2017 年) )

我的代码:

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

for row in table_meat1.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))

需要帮助将数据放入数据框中!

【问题讨论】:

  • 您查看过维基百科的服务条款吗?有些网站不允许网页抓取。
  • 有一些解决方案可以做到,但这是不道德的,你为什么不使用 web Wikipedia API?
  • 我理解您的担忧 - 但是,我没有发现任何反对意见。网络抓取活动都是针对我正在学习的在线数据科学课程的。他们有练习,要求我们从维基百科上抓取网页。
  • 对于这类作业,我认为没有任何问题。但是对于发布,你一定要检查它。

标签: python-3.x pandas beautifulsoup


【解决方案1】:

这个问题的答案是:

将 Selenium 与 chrome 驱动程序一起使用,您可以使用:

pip install selenium

然后从here 下载适当的 chrome 驱动程序,考虑到我检查了 86.0.4240.22 版本的操作系统,它运行良好。

解压缩并将其放在类似的位置:/Users/admin/software/chromedriver

然后运行这段代码。

from selenium import webdriver

URL = 'https://www.amazon.com/Metagenics-Ultra-Potent-C-1000-Count/dp/B004GLEUHI/ref=sr_1_2_sspa?crid=11YWA9XFVALBP&dchild=1&keywords=metagenics&qid=1603050330&sprefix=metageni%2Caps%2C224&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFRRDdMVU5GNDFKQ1QmZW5jcnlwdGVkSWQ9QTA1NTc3NzAxSFYxV0k5MlFGUUZTJmVuY3J5cHRlZEFkSWQ9QTA2MzM0MzAyWDBDSjNCNlFGRVJNJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=='


options = webdriver.ChromeOptions()
options.add_argument('headless')

driver = webdriver.Chrome("/Users/admin/software/chromedriver",chrome_options=options)
driver.implicitly_wait(5)
driver.get(URL)
content = driver.page_source;
soup = BeautifulSoup(content)
price=soup.find('table', class_='wikitable sortable')
print(price)

但请注意,某些网站禁止网页抓取,您必须使用他们提供的 Web API。

【讨论】:

  • 谢谢你,我应该更清楚 - 我已经能够进行网络抓取,但无法将其放入数据框中。当我尝试将其放入数据框时,我仍然会得到一个空的数据框集。
  • 您的代码显示您没有创建 df。你的意思是你最终得到一个空列表?
  • 我正在尝试从网络抓取中提取数据并创建一个数据框...我想我的代码会显示一个空列表。您知道我如何提取数据并将其放入有组织的数据框中吗?非常感谢您的帮助。
  • 你能添加你的代码来抓取这个页面吗?然后解释你到底想要什么?
  • 上面原始帖子中的“输出”是我从网络抓取中得到的。我想把它放到一个数据框中。在“产出”中,有 4 列标题为:“国家”、“公斤/人(2002 年)”、“公斤/人(2009 年)”和“公斤/人(2017 年)”。这些是 4 列标题,之后所有信息都在那里。我只需要一种方法将其放入数据框表中。
猜你喜欢
  • 2023-03-20
  • 2021-01-12
  • 2021-12-11
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2021-12-31
相关资源
最近更新 更多