Python не работает с запросом POST - PullRequest
0 голосов
/ 30 мая 2019

Я извлекаю данные с веб-сайта, используя 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> &nbsp;</font></td>
    <td class="contentCell" width=150>Crossed out</font></td>
    <td  class="contentCell"><nobr><span dir=ltr>&nbsp;&nbsp;&nbsp;</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>

1 Ответ

0 голосов
/ 30 мая 2019

Если вы пытаетесь извлечь / разобрать 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> &nbsp;</font></td>
    <td class="contentCell" width=150>Crossed out</font></td>
    <td  class="contentCell"><nobr><span dir=ltr>&nbsp;&nbsp;&nbsp;</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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...