【问题标题】:Naming PDFs downloaded using python and selenium命名使用 python 和 selenium 下载的 PDF
【发布时间】:2021-11-09 12:30:13
【问题描述】:

我有一个用于工作的网络爬虫,可以从我们的非公开网站下载给定过滤器的所有 pdf。我正在尝试命名文件 “ID 号 + 文件名 + 日期文件是 made.pdf” 我在 Try 语句中使用绝对 xPath 作为文件名,但它不起作用并且跳到异常。如果我错过了任何语法方面的内容,或者是否有更好的方法来实现这一点,我将不胜感激。我也复制了xPath,看看有没有经验的人可以给我相对的xPath使用

错误

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div[1]/div[4]/div/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[2]/h2"}
  (Session info: chrome=93.0.4577.63)

HTML

我的代码:

table_rows=driver.find_elements_by_xpath("//a[contains(@href, '#resources/details/?id=')]")
    for link_elem in table_rows:
        url = link_elem.get_attribute('href')
        id_number= url[-8:]
        driver.get(url)
       try:
            filename_first = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/div/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[2]/h2').text.replace(':', '').replace(r'/', '-')

       except:
            filename_first = 'file.pdf'
        #filename_first = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[4]/div/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[2]/h2').text.replace(':', '').replace(r'/', '-')
        filename_final = id_number + filename_first #+ '.pdf'
        css_thing =  '#file > div:nth-child(1) > div.form-group.padding-xs-bottom > div > div > button.btn.btn-danger.get-download-url'
        time.sleep(5)
        download_button = driver.find_element_by_css_selector(css_thing)
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, css_thing))).click()
        time.sleep(5)
        link_data = driver.find_element_by_xpath("//a[contains(@href, 'https://s3.amazonaws.com')]")
        url = link_data.get_attribute("href")
        r = requests.get(url, allow_redirects=True)
        open(filename_final, 'wb').write(r.content)
        print("good")

【问题讨论】:

  • 你不应该使用这些类型的动态 xpath /html/body/div[1]/div[1]/div[4]/div/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div[2]/h2
  • 试试这个//a//div[@class='flex-1 ellipsis padding-xs-right']
  • @NandanA 谢谢!现在当我运行 filename_first = driver.find_element_by_xpath("//a//div[@class='flex-1 ellipsis padding-xs-right']").text.replace(':', '').replace( r'/', '-') + '.pdf' 文件名就变成了.pdf
  • 你能给我们示例pdf名称以查看
  • @NandanA 当然!目前使用该行代码的名称只是.pdf。然后当它迭代循环时,它只会覆盖该文件。当我从代码中删除 + '.pdf' 时,它只是用 Id_number 命名它们。哪个更好,但 id 更喜欢 Xpath 文本 +id_number+.pdf

标签: python selenium pdf


【解决方案1】:

您收到NoSuchElement 异常,因为您使用的是绝对xPath 如果DOM 是动态的,那么您的脚本失败的可能性很大。

始终使用可靠的xPath

xPath: //a//div[@class='flex-1 ellipsis padding-xs-right']

【讨论】:

    【解决方案2】:

    根据您分享的快照,我相信您可以使用以下 xpath

    //a[contains(@href,'#resources/details/')]//div[contains(@class,'ellipsis')]
    

    此外,在使用此 xpath 之前,请检查我们有 1/1 匹配节点的开发工具。

    像这样使用它:

    filename_first = driver.find_element_by_xpath("//a[contains(@href,'#resources/details/')]//div[contains(@class,'ellipsis')]").text
    print(filename_first)
    

    如果您使用上述代码获得所需的输出,我们可以将其替换为正则表达式以获取您实际寻找的内容。

    【讨论】:

    • 谢谢!我做了所有这些,并在调试器中运行它,它有 filename_first 作为一个空字符串 - 我认为那是因为它说 1/23 匹配节点
    • 可以分享网页网址吗?
    • 不幸的是,没有。它是一个私人网站。但我可以发送 HTML 的片段
    • 好的,请分享补充信息。
    • 谢谢!我不确定如何复制下一个,所以这是一个屏幕截图。最底部的黑色文本是我想出现在文件名ibb.co/6gzKZxQ
    猜你喜欢
    • 2019-05-28
    • 2020-08-04
    • 2021-05-08
    • 1970-01-01
    • 2021-11-16
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    相关资源
    最近更新 更多