我正在尝试编写一个脚本,以下载所有《日语机器月度工具》订购的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的所有标题,但不单击并下载。任何帮助,不胜感激!
答案 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)
使用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文章以了解更多详细信息
您的CSS选择器不是很正确,它应该定位到a
tag
langs = driver.find_elements_by_css_selector("#left > ul.news_archive > li > span.text > a")
使用浏览器下载文件效率极低,我建议使用urllib代替:
urllib.request.urlretrieve(lang.get_attribute('href'), lang.text + '.pdf')