Python - 如何使用'requests和BeautifulSoup'抓取Tr/Td表格数据

2 投票
2 回答
15531 浏览
提问于 2025-05-01 04:58

我刚开始学习编程,正在尝试写我的第一个网络爬虫程序,目的是为了帮助我工作。我想做一个程序,从网页上抓取表格中的数据(tr/td),但是遇到了一些困难,没能成功。以下是我目前的代码:

import requests
from bs4 import BeautifulSoup


def start(url):
    source_code = requests.get(url).text
    soup = BeautifulSoup(source_code)
    for table_data in soup.find_all('td', {'class': 'sorting_1'}):
        print(table_data)

start('http://www.datatables.net/')

我的目标是打印出每一行数据,然后把它导出到一个Excel文件里。

谢谢,
-Cire

暂无标签

2 个回答

1

在查看http://www.datatables.net的源代码时,我没有看到任何地方有文本sorting_1,所以我不认为搜索所有这个class的表格单元格会有结果。

也许这个class出现在与DataTables网站相关的其他网址上,这种情况下你需要在代码中使用那个网址。还有可能这个class只有在某些JavaScript代码在客户端运行后才会出现(也就是说,可能是在对示例表格进行某些操作之后),而不是在最初加载的页面上就有。

我建议你先从你知道在初始页面上存在的标签开始(可以通过在浏览器中查看页面源代码来确认)。

例如,目前我可以看到一个div,它的class是“content”。所以可以把find_all的代码改成这样:

for table_data in soup.find_all('div', {'class': 'content'}):
        print(table_data)

这样应该能找到一些东西。

对提问者评论的回应:

你没有找到那个标签和类的原因是因为DataTables是通过JavaScript在客户端渲染表格的,通常是在DOM加载完成后(不过这也取决于页面和DataTables初始化代码的位置)。这意味着与基础网址相关的HTML内容中并不包含这些内容。如果你用curl命令访问基础网址并查看输出,你就能看到这一点。

但是在浏览器中加载时,一旦DataTablesJavaScript运行,表格就会被渲染,DOM会动态修改以添加表格,包括你正在寻找的带有特定类的单元格。

3

我的建议是,如果你刚接触Python,可以先通过iPython笔记本(互动提示)来玩玩,先让一些东西运作起来,感受一下再去写脚本或函数。这样好处是所有的变量都会保留,观察事情的进展也会简单很多。

从这里的截图可以看到,find_all这个函数没有找到任何东西,返回的是一个空列表[]。使用ipython,你可以很方便地对之前定义的变量尝试其他函数的不同用法。例如,可以试试soup.find_all('td')

enter image description here

撰写回答