Python - 如何使用'requests& amp;来刮取Tr / Td表数据BeautifulSoup”

时间:2014-11-02 20:56:49

标签: python beautifulsoup python-requests

我是编程新手。我正在尝试我的第一个Web爬虫程序,它将帮助我完成我的工作。我正在尝试构建一个程序,它将从网页中删除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 个答案:

答案 0 :(得分:2)

我的建议是,如果你是Python的新手,可以通过iPython笔记本(交互式提示)来玩游戏,让事情先发挥作用,并在尝试编写脚本或函数之前先了解一下。从好的方面来看,所有变量都会存在,并且更容易看到发生了什么。

从此处的屏幕截图中,您可以立即看到find_all功能未找到任何内容。正在返回空列表[]。通过使用ipython,您可以轻松地在先前定义的变量上尝试函数的其他变体。例如,soup.find_all('td')

enter image description here

答案 1 :(得分:0)

查看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)

这应该找到一些东西。

对OP评论的回应:

在这种情况下,您没有找到标记/类配对的确切原因是 DataTables 通过JavaScript呈现表客户端,通常是在DOM完成加载后(尽管它取决于页面以及放置 DataTables 初始化代码的位置)。这意味着与基本URL关联的HTML不包含此内容。如果您curl基本URL并查看输出,则可以看到此信息。

然而,当在浏览器中加载它时,一旦 JavaScript DataTables 触发,表格就会被呈现并动态修改DOM以添加表格,包括你正在寻找的课程。