Python - 如何使用'requests和BeautifulSoup'抓取Tr/Td表格数据
我刚开始学习编程,正在尝试写我的第一个网络爬虫程序,目的是为了帮助我工作。我想做一个程序,从网页上抓取表格中的数据(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 个回答
在查看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
命令访问基础网址并查看输出,你就能看到这一点。
但是在浏览器中加载时,一旦DataTables的JavaScript运行,表格就会被渲染,DOM会动态修改以添加表格,包括你正在寻找的带有特定类的单元格。
我的建议是,如果你刚接触Python,可以先通过iPython笔记本(互动提示)来玩玩,先让一些东西运作起来,感受一下再去写脚本或函数。这样好处是所有的变量都会保留,观察事情的进展也会简单很多。
从这里的截图可以看到,find_all
这个函数没有找到任何东西,返回的是一个空列表[]
。使用ipython
,你可以很方便地对之前定义的变量尝试其他函数的不同用法。例如,可以试试soup.find_all('td')
。