Python Mechanize не вызывает нумерацию страниц - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь использовать python mechanize для очистки разбитой на страницы таблицы, но таблица не обновляется новыми данными, когда я говорю mechanize нажать следующую страницу.

HTML-код страницы, которую я пытаюсь почистить, выглядит следующим образом, где последний ряд содержит кнопки страницы:

<table>
  <tbody>
    < ---- several tr's comprising the first page of data --->
    <tr><td>
        <span id="siteMasterHolder_basicBodyHolder_CalendarSearchResultList_gvResults_lnkPage1">1</span>
        <a href="javascript:__doPostBack('ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$gvResults$ctl23$lnkPage2','')" id="siteMasterHolder_basicBodyHolder_CalendarSearchResultList_gvResults_lnkPage2">2</a>
        <a href="javascript:__doPostBack('ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$gvResults$ctl23$lnkPage3','')" id="siteMasterHolder_basicBodyHolder_CalendarSearchResultList_gvResults_lnkPage3">3</a>
        ....etc up to page 10
           </td></tr>
       </tbody>
   </table>

Функция __doPostBack на странице такова:

    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }

Мой python scraper получает список тегов <a> в виде объектов BeautifulSoup и делает следующее:

for i, tag in enumerate(aNums):
    tagId = tag['id']
    br.select_form(nr=1)
    br.form.set_all_readonly(False)
    br.form['__EVENTTARGET'] = tagId
    pageNum = 'ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$hfPageNumber'
    br.form.set_value(tag.text, pageNum)
    ctl = br.find_control("ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$btnPrintPage")
    br.form.controls.remove(ctl)
    ctl = br.find_control("ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$btnPrintAll")
    br.form.controls.remove(ctl)

    response = br.submit()
    content = response.read()
    soup = BeautifulSoup(content,features="html5lib")
    < --- then some code to scrape the table on the new page --->

Но когда я запускаю скрипт, он просто очищает страницу 1 для каждой итерации.

Это заголовки, которые публикуются при нажатии <a> тега '2' (статус только для чтения в скобках):

__EVENTTARGET: (False)
__EVENTARGUMENT: (False)
__VIEWSTATE:/wEPDwULLT... (False) [truncated for reading ease]
__VIEWSTATEGENERATOR:1D32DE84 (False)
__EVENTVALIDATION:/wEdAA6Sgc... (False) [truncated for reading ease]
ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$hfPageNumber:2 (False)
ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$btnPrintPage:Print This Page (False)
ctl00$ctl00$siteMasterHolder$basicBodyHolder$CalendarSearchResultList$btnPrintAll:Print All Pages (False)

Я подозреваю, что проблема связана с заголовком, заканчивающимся 'PageNumber' значением '1', потому что когда я печатал, какое значение было после отправки формы, оно все равно было '1', а не '2' или ' 3 ', как и должно быть, несмотря на то, что '__EVENTTARGET' принимает значение новой строки, которую я установил. Но я просто не могу понять это.

Если возможно, я бы предпочел использовать механизацию, а не библиотеку, подобную селену, которая может использовать JavaScript.

Все здесь очень полезны и находчивы, так что спасибо заранее!

...