Я извлекаю данные с веб-сайта с помощью 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>
Если вы пытаетесь извлечь/разобрать 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)
ах, хорошо, как я уже говорил ранее, просто используйте красивый суп, чтобы вытащить элементы тега <table>
. Я обновил решение.
В итоге я сделал именно это, оказалось, что использование re
с ^
и регулярными выражениями $
не работает с ответами на сообщения. Всем, кто не хочет использовать BeautifulSoup
, я предлагаю просто найти способ удалить эти 2 символа в их регулярном выражении.
ну, я на самом деле не хочу извлекать данные, я просто хочу сохранить данные непосредственно в файл
html
и загрузить его на веб-сайт.re
с ним сделать это намного проще.