【问题标题】:Finding tables returns [] with bs4使用 bs4 查找表返回 []
【发布时间】:2021-05-18 05:28:23
【问题描述】:

我正在尝试从这个 url 中抓取一个表格:https://cryptoli.st/lists/fixed-supply 我收集到我想要的表在 div 类“dataTables_scroll”中。我使用以下代码,它只返回一个空列表:

from bs4 import BeautifulSoup as bs
import requests
import pandas as pd

url = requests.get("https://cryptoli.st/lists/fixed-supply")
soup = bs(url.content, 'lxml')

table = soup.find_all("div", {"class": "dataTables_scroll"})

print(table)

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 因为网站使用了javascript。将seleniumchromedriver 一起使用。见stackoverflow.com/questions/52687372/…
  • 这个网站好像是用JS来生成内容的。您不能为此使用 BS4,@J.Choi 暗示,需要将 selenium 与 chromedriver 一起使用。

标签: python web-scraping beautifulsoup


【解决方案1】:

原因是你从 requests.get() 得到的响应中不包含表数据。

它可能在客户端加载(通过 javascript)。

你能做些什么呢?使用 selenium webdriver 是一种可能的解决方案。您可以“等待”直到表格加载并变为交互式,然后使用 selenium 获取页面内容,将上下文传递给 bs4 进行抓取。

您可以通过将响应写入文件来检查响应:

f = open("demofile.html", "w", encoding='utf-8')
f.write(soup.prettify())
f.close()

您将能够在预期的表格位置看到“...Loading...”。

【讨论】:

【解决方案2】:

我相信数据是从脚本标签加载的。我必须去上班,所以不能花更多时间研究如何从“|”适当地重新创建数据框目前是分隔数据,但以下内容可以作为其他人的起点,因为它从表体的脚本标记中提取相关条目。

import requests, re
import ast

r = requests.get('https://cryptoli.st/lists/fixed-supply').text
s = re.search(r'cl\.coinmainlist\.dataraw = (\[.*?\]);', r, flags = re.S).group(1)
data = ast.literal_eval(s)
data = [i.split('|') for i in data]
print(data)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2021-04-27
  • 2015-01-19
  • 2014-07-08
相关资源
最近更新 更多