使用Python来刮取JS表单

时间:2018-03-28 21:12:40

标签: python html selenium

我目前正在开展一项研究项目,我们正在尝试从巴西的Hemeroteca数据库中收集保存的图像文件。在使用带有HTML表单的C / C ++之前,我已经在PHP页面上完成了Web报废,但由于这是一个共享脚本,我需要切换到python,以便组中的每个人都可以使用此工具。

我试图抓取的页面是:http://bndigital.bn.gov.br/hemeroteca-digital/

有三种形式,第一种是报纸/期刊。选择此项后,将填充可用时间,最后一个字段为搜索项。我在这里检查了HTML页面,这三个ID分别是:' PeriodicoCmb1_Input',' PeriodoCmb1_Input'和' PesquisaTxt1'。

关于此主题的一些谷歌搜索引导我访问Selenium包,并且我已将这个示例代码放在一起以尝试阅读该页面:

import webbrowser
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

print("Begin...")

browser = webdriver.Chrome()
url = "http://bndigital.bn.gov.br/hemeroteca-digital/"
browser.get(url)

print("Waiting to load page... (Delay 3 seconds)")

time.sleep(3)

print("Searching for elements")

journal = browser.find_element_by_id("PeriodicoCmb1_Input")
timeRange = browser.find_element_by_id("PeriodoCmb1_Input")
searchTerm = browser.find_element_by_id("PesquisaTxt1")

print(journal)

print("Set fields, delay 3 seconds between input")

search_journal = "Relatorios dos Presidentes dos Estados Brasileiros (BA)"
search_timeRange = "1890 - 1899"
search_text = "Milho"

journal.send_keys(search_journal)
time.sleep(3)
timeRange.send_keys(search_timeRange)
time.sleep(3)
searchTerm.send_keys(search_text)

print("Perform search")

submitButton = button.find_element_by_id("PesquisarBtn1_input")  
submitButton.click()

脚本运行到print(journal)语句,在该语句中抛出错误,指出无法找到该元素。

任何人都可以快速浏览一下有问题的页面并确保我已经正确地确定了这个脚本的一般前提,或者指出一些例子来让我解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

您要查找的DOM元素位于iframe。因此,在使用find_element_by_id API之前,您应切换到iframe上下文。

以下是如何切换到iframe上下文的代码:

# add your code

frame_ref = browser.find_elements_by_tag_name("iframe")[0]

iframe = browser.switch_to.frame(frame_ref)

journal = browser.find_element_by_id("PeriodicoCmb1_Input")

timeRange = browser.find_element_by_id("PeriodoCmb1_Input")

searchTerm = browser.find_element_by_id("PesquisaTxt1")

# add your code

以下是描述切换到iframe上下文的link