单击并下载列表中的所有项目Selenium Python

时间:2019-06-11 10:27:39

标签: python selenium selenium-webdriver

我正在尝试编写一个脚本,以下载所有《日语机器月度工具》订购的PDF

第一步是尝试遍历每年(2010-2019年)并打印所有列表项。我已经实现了。

第二部分是单击每个列表项(将下载每个pdf)。这是我在寻求帮助的地方。

enter code here
from selenium import webdriver
import time
driver = webdriver.Chrome("C:\Python\chromedriver", options=options)

driver.get("http://www.jmtba.or.jp/english/date/2019/?cat=169")
time.sleep(3)


list1 = ['2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019']

i=2010
while i<=2019:
    driver.find_element_by_link_text(str(i)).click()
    # Print all Monthly Machine Tool Orders
    langs = driver.find_elements_by_css_selector("#left > ul.news_archive")
    for lang in langs:
        print(lang.text)
        lang.click()
    i = i + 1

打印每个PDF的所有标题,但不单击并下载。任何帮助,不胜感激!

3 个答案:

答案 0 :(得分:0)

请勿使用--- title: "Untitled" output: flexdashboard::flex_dashboard: orientation: columns vertical_layout: fill runtime: shiny --- ```{r setup, include=FALSE} library(flexdashboard) library(DT) modDtUi <- function(id){ # UI module ns = NS(id) DT::dataTableOutput(ns('x1')) } modDt <- function(input, output, session, data){ # Server module x <- data output$x1 <- DT::renderDataTable(x, selection = 'none', editable = TRUE, rownames = FALSE) proxy <- dataTableProxy('x1', session = session) observeEvent(input$x1_cell_edit, { info = input$x1_cell_edit i = info$row j = info$col + 1 v = info$value x[i, j] <<- DT::coerceValue(v, x[i, j]) replaceData(proxy, x, resetPaging = FALSE, rownames = FALSE) }) } ``` Column {data-width=650} ----------------------------------------------------------------------- ### Editable table ```{r} modDtUi("editable") ``` ```{r} callModule(modDt, "editable", data = iris) ``` 功能,请始终使用WebDriverWait等待特定条件发生,然后再继续执行代码。

time.sleep(3)

答案 1 :(得分:0)

您正在搜索的一部分,所以您无法单击它们。

Go to website > Right click > analyze > Drag your mouse on links

您将在跨度中看到您的链接,因此您需要搜索跨度部分。

langs = driver.find_element_by_xpath("//span[@class = 'text']//a")

langs.click()

当您像上面那样更改代码时,它将解决您的问题。如果有效,请告诉我

答案 2 :(得分:0)

  1. 使用sleep()anti-pattern的某种形式,请考虑改用Explicit Wait

    • 删除time.sleep(3)
    • 替换此行:

      driver.find_element_by_link_text(str(i)).click()
      

      与此:

      WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, str(i)))).click()
      

    查看How to use Selenium to test web applications using AJAX technology文章以了解更多详细信息

  2. 您的CSS选择器不是很正确,它应该定位到a tag

    langs = driver.find_elements_by_css_selector("#left > ul.news_archive > li > span.text > a")
    
  3. 使用浏览器下载文件效率极低,我建议使用urllib代替:

    urllib.request.urlretrieve(lang.get_attribute('href'), lang.text + '.pdf')