【问题标题】:How to clean up the data from this webscraping script?如何清理这个网络抓取脚本中的数据?
【发布时间】:2018-03-13 16:07:03
【问题描述】:

这是我的代码:

import requests
from bs4 import BeautifulSoup
import lxml

r = requests.post('https://opir.fiu.edu/instructor_evals/instr_eval_result.asp', data={'Term': '1175', 'Coll': 'CBADM'})
soup = BeautifulSoup(r.text, "lxml")

tables = soup.find_all('table')
print(tables)



print(tables)

由于它是一个 ASP 页面,我不得不进行发布请求,并且我必须获取正确的数据。在商学院查找特定学期的所有表格。问题是输出:

<tr class="tableback2"><td>Overall assessment of instructor</td><td align="right">0.0%</td><td align="right">56.8%</td><td align="right">27.0%</td><td align="right">13.5%</td><td align="right">2.7%</td><td align="right">0.0%</td> </tr>
</table>, <table align="center" border="0" cellpadding="0" cellspacing="0" width="75%">
<tr class="boldtxt"><td>Term: 1175 - Summer 2017</td></tr><tr class="boldtxt"><td>Instructor Name: Austin, Lathan Craig</td><td colspan="6"> Department: MARKETING</td></tr>
<tr class="boldtxt"><td>Course: TRA   4721  </td><td colspan="2">Section: RVBB-1</td><td colspan="4">Title: Global Logistics</td></tr>
<tr class="boldtxt"><td>Enrolled: 56</td><td colspan="2">Ref#: 55703 -1</td><td colspan="4"> Completed Forms: 46</td></tr>

我希望beautifulsoup 能够解析文本,并将其漂亮而整洁地返回到数据框中,每一列都是分开的。我想在之后将它放入数据框中,或者将其保存到 CSV 文件中……但我不知道如何摆脱所有这些 CSS 选择器和标签。我尝试使用此代码来执行此操作,它删除了指定的代码,但 td 和 tr 不起作用:

for tag in soup():
    for attribute in ["class", "id", "name", "style", "td", "tr"]:
        del tag[attribute]

然后,I tried to use this package called bleach, but when putting the 'tables' into it 但它指定它必须是文本输入。所以我显然不能把我的桌子放进去。 This is ideally what I would like to see with my output.

所以我真的不知道如何以正确的方式格式化它。非常感谢任何帮助。

【问题讨论】:

  • 我对 Bleach 不熟悉,但您可以遍历表格行和单元格:stackoverflow.com/questions/15250455/…
  • …并适用于您的代码,并带有示例输出:gist.github.com/helb/be5263f7ce9d83e7dbe8c11277363814
  • @helb 您的 gist 代码有效,但我的输出与您的输出不同。你的看起来格式完美,但我的看起来明显不同。 imgur.com/a/RtcHI
  • 您可以通过re.sub() 使用正则表达式进行迭代和替换
  • @JSowwy 您的代码看起来不错。它可能是您的 IDE 中的终端弄乱了选项卡,或者是较旧的 Python 版本(自 3.0 起支持print() 中的end,您使用什么版本?)。 repl.it 上的工作示例:repl.it/Lwle/1(从保存的文件而不是 requests 加载数据,但其余部分相同)

标签: python css python-3.x web-scraping beautifulsoup


【解决方案1】:

试试这个。我想这就是你所期望的。顺便说一句,如果该页面中有多个表,并且如果您想要另一个表,请抽动索引,如soup.select('table')[n]。谢谢。

import requests
from bs4 import BeautifulSoup

res = requests.post('https://opir.fiu.edu/instructor_evals/instr_eval_result.asp', data={'Term': '1175', 'Coll': 'CBADM'})
soup = BeautifulSoup(res.text, "lxml")

tables = soup.select('table')[0]
list_items = [[items.text.replace("\xa0","") for items in list_item.select("td")]
                    for list_item in tables.select("tr")] 

for data in list_items:
    print(' '.join(data))

部分结果:

Term: 1175 - Summer 2017
Instructor Name: Elias, Desiree   Department: SCHACCOUNT
Course: ACG   2021   Section: RVCC-1 Title: ACC Decisions
Enrolled: 118 Ref#: 51914 -1  Completed Forms: 36

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2018-10-29
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多