【问题标题】:Access href link value from pandas dataframe从 pandas 数据框中访问 href 链接值
【发布时间】:2022-09-30 20:37:50
【问题描述】:

我目前有一个通过抓取https://www.cve.org/downloads 生成的数据框。

 Format Unix Compressed (.Z)           Gzipped            Raw                                   Additional Notes
0    CSV       allitems.csv.Z   allitems.csv.gz   allitems.csv  NOTE: suitable for import into spreadsheet pro...
1   HTML      allitems.html.Z  allitems.html.gz  allitems.html                                                NaN
2   Text       allitems.txt.Z   allitems.txt.gz   allitems.txt                                                NaN
3    XML       allitems.xml.Z   allitems.xml.gz   allitems.xml                     XML Schema Design: cve_1.0.xsd

在 Raw 列下,allitems.csv 实际上是网站中的一个链接。一旦我将其显示到数据框中,就无法再访问链接的 href 值。下面是我目前使用 selenium 和 pandas 的代码:

import pandas as pd
from selenium import webdriver


# from selenium import webdriver
Browser = webdriver.Safari()

# # To navigate to a URL:
Browser.get(\"http://cve.org/downloads\")

# # To get raw html string:
RawHtmlString = Browser.page_source

df = pd.read_html(RawHtmlString)[0]

print(df)

如何编辑我的程序以能够提取链接并自动下载?

    标签: python pandas dataframe selenium


    【解决方案1】:

    首先,您必须访问链接所在的a href 部分,才能获取此文本"/data/downloads/file.csv.gz"

    s = requests.Session() 
    link = '/data/downloads/file.csv.gz'
    baseUrl= 'https://cve.mitre.org/'
    

    然后你应用这样的东西

    s.get(url=urllib.parse.urljoin(baseurl,file_link),headers=headers)
    

    【讨论】:

      【解决方案2】:

      获取链接

      如果你真的想提炼链接,您可以首先使用 attr data-label="Raw" 获取嵌套在 td 中的所有 a 标签,然后遍历它们并获取 hrefs。例如。

      raw = Browser.find_elements(By.XPATH, "//td[@data-label='Raw']/a")
      
      links = [r.get_attribute('href') for r in raw]
      
      print(links)
      ['https://cve.mitre.org/data/downloads/allitems.csv', 
       'https://cve.mitre.org/data/downloads/allitems.html', 
       'https://cve.mitre.org/data/downloads/allitems.txt', 
       'https://cve.mitre.org/data/downloads/allitems.xml']
      

      但如果您只对csv 感兴趣,您可以使用:

      csvs = Browser.find_elements(
          By.XPATH, "//td[@data-label='Raw']/a[contains(@href,'.csv')]")
      links = [csv.get_attribute('href') for csv in csvs]
      
      # or just use `find_element`, seeing that there is only one such file:
      
      csv_link = Browser.find_element(
          By.XPATH, "//td[@data-label='Raw']/a[contains(@href,'.csv')]")\
          .get_attribute('href')
      

      当然,在这种特殊情况下,这些都是毫无意义的练习。正如您在上面看到的,所有链接实际上都具有相同的基本 url。因此,您也可以简单地创建一个额外的列或其他东西:

      BASE = 'https://cve.mitre.org/data/downloads/'
      df['Urls'] = BASE + df.Raw
      
      print(df.Urls)
      0    https://cve.mitre.org/data/downloads/allitems.csv
      1    https://cve.mitre.org/data/downloads/allitems....
      2    https://cve.mitre.org/data/downloads/allitems.txt
      3    https://cve.mitre.org/data/downloads/allitems.xml
      Name: Urls, dtype: object
      

      下载文件

      对于下载,我会依靠urllib.request。但是请注意文档中的警告:“[此功能] 可能会在将来的某个时候被弃用”。可能......这个警告已经存在了一段时间。尝试如下操作:

      from urllib import request
      
      my_path = 'destination_folder_path/' # mind the "/" at the end!
      
      for l in links:
          fname = l.rsplit('/', maxsplit=1)[1]
          print(l) # just to see what we're downloading
          request.urlretrieve(l, f'{my_path}{fname}')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2019-03-05
        • 2018-02-22
        • 2012-08-16
        • 2020-12-14
        • 1970-01-01
        • 2018-02-05
        相关资源
        最近更新 更多