机械化和Python,单击href=";javascript:void(0)&引用;链接并获得回复

机械化和Python,单击href=";javascript:void(0)&引用;链接并获得回复,javascript,python,ajax,mechanize,mechanize-python,Javascript,Python,Ajax,Mechanize,Mechanize Python,我需要从我填写表单的页面中删除一些数据(已经用mechanize完成了)。问题是,该页面返回许多页面上的数据,而我从这些页面获取数据时遇到了麻烦 从第一个结果页面获取它们没有问题,因为它在搜索之后已经显示了——我只需提交表单并获得响应 我分析了结果页面的源代码,它似乎使用了Java脚本RichFaces(一些用于JSF和ajax的库,但我可能是错的,因为我不是web专家) 然而,我设法找到了如何进入剩余的结果页面。我需要单击此表单中的链接(href=“javascript:void(0);”,完

我需要从我填写表单的页面中删除一些数据(已经用mechanize完成了)。问题是,该页面返回许多页面上的数据,而我从这些页面获取数据时遇到了麻烦

从第一个结果页面获取它们没有问题,因为它在搜索之后已经显示了——我只需提交表单并获得响应

我分析了结果页面的源代码,它似乎使用了Java脚本RichFaces(一些用于JSF和ajax的库,但我可能是错的,因为我不是web专家)

然而,我设法找到了如何进入剩余的结果页面。我需要单击此表单中的链接(
href=“javascript:void(0);”
,完整代码如下):

1
新的RichFaces.ui.DataScroller(“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233”、函数(事件、元素、数据){RichFaces.ajax(“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233”、事件、{“参数”){“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233:page:data.page},“incId:“1”}、{“数字”:{“SomeSimpleForm:SomeSimpleForm:SomeSimpleTable:JIDT211:JT233:“9”、“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_8”:“8”、“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_7”:“7”、“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_6”:“6”、“SomeSimpleForm:j_idt211:j_idt233_ds_5”:“5”、“SomeSimpleForm:SomeSimpleTable:jt211:jt233:j idu idu ds”4”:,“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_3”:“3”、“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_1”:“1”、“SomeSimpleForm:SomeSimpleTable:j_idt233_ds_10”:“10”、“SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_2”:“2”;“2”;“按钮”:“右”:“SomeSimpleTable:SomeSimpleTable:SomeSimpleTable:next”;“下一个simpletable:j”SomeSimpleForm:SomeSimpleTable:j_idt211:j_idt233_ds_l:“last”},currentPage:1})

因此,我想问一下,是否有办法单击所有链接并使用mechanize获取所有页面(注意,
symbol之后有更多可用页面)?我想问一下关于拥有网络知识的所有傻瓜的答案:)

这对我很有效:似乎所有html都可以在
页面中使用

import time    
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://polon.nauka.gov.pl/opi/aa/drh/zestawienie')

next_id = 'drhPageForm:drhPageTable:j_idt211:j_idt233_ds_next'

pages = []
it = 0
while it < 1795:
    time.sleep(1)
    it += 1
    bad = True
    while bad:
        try:
            driver.find_element_by_id(next_id).click()
            bad = False 
        except:
            print('retry')

    page = driver.page_source

    pages.append(page)
导入时间
从selenium导入webdriver
driver=webdriver.Firefox()
司机,上车https://polon.nauka.gov.pl/opi/aa/drh/zestawienie')
next_id='drhPageForm:drhPageTable:j_idt211:j_idt233_ds_next'
页码=[]
它=0
虽然它<1795:
时间。睡眠(1)
it+=1
坏=真
虽然不好:
尝试:
驱动程序。按\u id(下一个\u id)查找\u元素。\u。单击()
坏=假
除:
打印('重试')
page=driver.page\u源
pages.append(第页)
不必首先收集和存储所有html,您也可以只查询您想要的内容,但您需要
lxml
BeautifulSoup


编辑:在运行它之后,我确实注意到我们犯了一个错误。捕获异常并重试很简单。

首先,我仍然坚持使用selenium,因为这是一个相当“javascript繁重”的网站。请注意,如果需要,您可以使用无头浏览器(或带浏览器)

这里的想法是按每页100行分页,单击“>>”链接直到它不在页面上,这意味着我们已经到达最后一页,没有更多的结果要处理。为了使解决方案可靠,我们需要使用:每次进入下一页时-等待加载微调器不可见

工作执行:

# -*- coding: utf-8 -*-
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.maximize_window()

driver.get('https://polon.nauka.gov.pl/opi/aa/drh/zestawienie?execution=e1s1')
wait = WebDriverWait(driver, 30)

# paginate by 100
select = Select(driver.find_element_by_id("drhPageForm:drhPageTable:j_idt211:j_idt214:j_idt220"))
select.select_by_visible_text("100")

while True:
    # wait until there is no loading spinner
    wait.until(EC.invisibility_of_element_located((By.ID, "loadingPopup_content_scroller")))

    current_page = driver.find_element_by_class_name("rf-ds-act").text
    print("Current page: %d" % current_page)

    # TODO: collect the results

    # proceed to the next page
    try:
        next_page = driver.find_element_by_link_text(u"»")
        next_page.click()
    except NoSuchElementException:
        break

非常感谢您的帮助:)我会尝试一下。是的,我同意,但BeautifulSoup不是一个问题,我以前使用过它,所以我想我会处理它。但是,我在
send_keys
方法上遇到了问题,因为在我自动(从源代码)单击搜索(Wyszukaj)后按钮,page自动清除了条件。Meh,谁在乎,如果你的方法有效,我只会使用BS4进行解析。哦,我刚刚注意到,你是来自
yagmail
的人-使用了你的工具,我只想为此感谢你,太棒了!祝你好运!非常确定它会起作用:)的确,页面的功能很奇怪,但是重试该元素是有效的……此外,如果你想对页面友好并有耐心,请随意添加更多延迟。@yak-Hah,被称为“那个家伙”太酷了"; 不客气!一定程度上我正在使用你的解决方案,但它似乎以某种方式“重复”页面,并将其中一些页面下载两次。然而,我不认为这是一个大问题,我可以在解析时进一步处理这个问题。干杯:)看来你的解决方案更好。我打开了一个新的悬赏来感谢你的回答:)@yak-wow,非常感谢。很高兴这个答案帮助解决了这个问题。
# -*- coding: utf-8 -*-
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.maximize_window()

driver.get('https://polon.nauka.gov.pl/opi/aa/drh/zestawienie?execution=e1s1')
wait = WebDriverWait(driver, 30)

# paginate by 100
select = Select(driver.find_element_by_id("drhPageForm:drhPageTable:j_idt211:j_idt214:j_idt220"))
select.select_by_visible_text("100")

while True:
    # wait until there is no loading spinner
    wait.until(EC.invisibility_of_element_located((By.ID, "loadingPopup_content_scroller")))

    current_page = driver.find_element_by_class_name("rf-ds-act").text
    print("Current page: %d" % current_page)

    # TODO: collect the results

    # proceed to the next page
    try:
        next_page = driver.find_element_by_link_text(u"»")
        next_page.click()
    except NoSuchElementException:
        break