使用Python抓取JS表单

2024-05-13 20:07:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进行一个研究项目,我们试图从巴西Hemeroteca数据库中收集保存的图像文件。在使用HTML表单使用C/C++之前,我已经在PHP页面上进行了Web删除,但是由于这是一个共享脚本,所以我需要切换到Python,这样组中的每个人都可以使用这个工具。在

我要刮的页面是:http://bndigital.bn.gov.br/hemeroteca-digital/

有三种形式,第一种是报纸/杂志。选择此选项后,将填充可用时间,最后一个字段是搜索项。我在这里检查了HTML页面,它们的三个id分别是:“periodicmb1_Input”、“periodicmb1_Input”和“PesquisaTxt1”。在

一些关于这个主题的google搜索让我找到了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)语句,在该语句中抛出错误,说明找不到元素。在

有人能快速浏览一下有问题的页面,确保我正确地理解了这个脚本的基本前提,或者给我指出一些例子来帮助我解决这个问题吗?在

谢谢!在


Tags: fromimportbrowseridinputsearchbytime
1条回答
网友
1楼 · 发布于 2024-05-13 20:07:47

您要查找的DOM元素位于iframe。所以在使用find_element_by_idAPI之前,您应该切换到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。在

相关问题 更多 >