【发布时间】: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