我正在使用Python requests
从网站提取数据,但遇到了一个奇怪的问题。
我在发帖请求的响应中使用re
来提取一些表数据,如下所示:
import re
import requests
tables = re.compile(r'^\s*(<table width.*?table>)$', flags=re.DOTALL | re.MULTILINE)
with open(tableInfoFile, fileSaveFormat) as f:
chartInfoPage = session.post(tableURL, headers=postLoginHeaders, data=data, verify=False)
for table in re.findall(tables, chartInfoPage.content.decode('utf-8'), flags=re.DOTALL | re.MULTILINE):
f.write(table)
但是,这什么也没写!我已经对正则表达式进行了测试,当我直接在响应数据(从浏览器复制)中使用它时,它可以完美地工作。
甚至更奇怪的是,该代码也可以正常工作:
import re
import requests
tables = re.compile(r'^\s*(<table width.*?table>)$', flags=re.DOTALL | re.MULTILINE)
with open(tableInfoFile, fileSaveFormat) as f:
chartInfoPage = session.post(tableURL, headers=postLoginHeaders, data=data, verify=False)
with open('test.html', 'w') as temp:
temp.write(chartInfoPage.content.decode('utf-8'))
with open('test.html', 'r') as temp:
data = temp.read()
for table in re.findall(tables, data, flags=re.DOTALL | re.MULTILINE):
f.write(table)
这对我来说毫无意义。我要做的就是将数据保存到文件中,然后读取它。与直接使用数据有何不同?
预先感谢。
编辑:哦,这是我尝试提取的表数据示例,如果有帮助的话:
<table width="100%" class="contentTable" cellpading=3>
<tr>
<td colspan=12 class="header">لیست دروس ارایه شده توسط دانشکده مهندسی عمران</td>
</tr>
<tr>
<td class="header" ><nobr> شماره درس</nobr></td>
<td class="header" ><nobr>گروه</td>
<td class="header" ><nobr>واحد</td>
<td class="header" ><nobr>نام درس</td>
<td class="header" ><nobr>پيشنياز و همنياز</td>
<td class="header" ><nobr>ظرفيت</td>
<td class="header" ><nobr>تعداد ثبت نامی</td>
<td class="header" ><nobr>نام استاد</td>
<td class="header" ><nobr>تاريخ امتحان</td>
<td class="header" ><nobr>برنامه هفتگی</td>
<td class="header" ><nobr>ملاحظات</td>
<td class="header" ><nobr>پیغام به هنگام ثبت نام</td>
</tr>
<tr>
<td class="contentCell"><nobr>10021</td>
<td class="contentCell"><nobr>1</td>
<td class="contentCell"><nobr>1</td>
<td class="contentCell"><nobr>آز هیدرولیک</td>
<td class="contentCell" width=150>پيشنياز: 13410: 13110</td>
<td class = "contentCell"><nobr><span dir="ltr"> 16</span></font></td>
<td class="contentCell" ><nobr> </font></td>
<td class="contentCell" width=150>Crossed out</font></td>
<td class="contentCell"><nobr><span dir=ltr> </span></td>
<td class="contentCell"><nobr> شنبه 8:0 تا 12:0 شنبه 13:0 تا 15:0</td>
<td class="contentCell">برگزاری این درس فقط با شرط ثبت نام قطعی حداقل 15 نفر امکان پذیر است
</td>
<td class="contentCell">برگزاری این درس فقط با شرط ثبت نام قطعی حداقل 15 نفر امکان پذیر است</td>
</tr>
</table>
答案 0 :(得分:0)
如果您要提取/解析html,则BeautifulSoup是您的理想之选。在这种情况下,您具有<table>
标签。
html = '''<table width="100%" class="contentTable" cellpading=3>
<tr>
<td colspan=12 class="header">لیست دروس ارایه شده توسط دانشکده مهندسی عمران</td>
</tr>
<tr>
<td class="header" ><nobr> شماره درس</nobr></td>
<td class="header" ><nobr>گروه</td>
<td class="header" ><nobr>واحد</td>
<td class="header" ><nobr>نام درس</td>
<td class="header" ><nobr>پيشنياز و همنياز</td>
<td class="header" ><nobr>ظرفيت</td>
<td class="header" ><nobr>تعداد ثبت نامی</td>
<td class="header" ><nobr>نام استاد</td>
<td class="header" ><nobr>تاريخ امتحان</td>
<td class="header" ><nobr>برنامه هفتگی</td>
<td class="header" ><nobr>ملاحظات</td>
<td class="header" ><nobr>پیغام به هنگام ثبت نام</td>
</tr>
<tr>
<td class="contentCell"><nobr>10021</td>
<td class="contentCell"><nobr>1</td>
<td class="contentCell"><nobr>1</td>
<td class="contentCell"><nobr>آز هیدرولیک</td>
<td class="contentCell" width=150>پيشنياز: 13410: 13110</td>
<td class = "contentCell"><nobr><span dir="ltr"> 16</span></font></td>
<td class="contentCell" ><nobr> </font></td>
<td class="contentCell" width=150>Crossed out</font></td>
<td class="contentCell"><nobr><span dir=ltr> </span></td>
<td class="contentCell"><nobr> شنبه 8:0 تا 12:0 شنبه 13:0 تا 15:0</td>
<td class="contentCell">برگزاری این درس فقط با شرط ثبت نام قطعی حداقل 15 نفر امکان پذیر است
</td>
<td class="contentCell">برگزاری این درس فقط با شرط ثبت نام قطعی حداقل 15 نفر امکان پذیر است</td>
</tr>
</table>'''
.find_all('table')
将存储带有<table>
标签的元素列表。然后,只需按索引选择所需的表,或仅遍历元素列表并打印出来,将其写入文件,然后执行您想要的操作即可。
import pandas as pd
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
tables = soup.find_all('table')
for table in tables:
print (table)