Spaces:
Sleeping
Sleeping
File size: 3,658 Bytes
928f123 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
import re
import json
import requests
import datetime
from datetime import date
from datetime import datetime
import xml.etree.ElementTree as ET
from requests.exceptions import HTTPError
def _get_today():
return str(date.today())
def _download_pdf_from_arxiv(filename):
url = f'https://arxiv.org/pdf/{filename}'
response = requests.get(url)
if response.status_code == 200:
return response.content
else:
raise Exception(f"Failed to download pdf for arXiv id {filename}")
def download_pdf_from_arxiv(arxiv_id):
filename = f"{arxiv_id}.pdf"
pdf_content = _download_pdf_from_arxiv(filename)
# Save the pdf content to a file
with open(filename, "wb") as f:
f.write(pdf_content)
return filename
def _get_papers_from_hf_daily_papers(target_date):
if target_date is None:
target_date = _get_today()
print(f"target_date is not set => scrap today's papers [{target_date}]")
url = f"https://huggingface.co/api/daily_papers?date={target_date}"
response = requests.get(url)
if response.status_code == 200:
return target_date, response.text
else:
raise HTTPError(f"Error fetching data. Status code: {response.status_code}")
def get_papers_from_hf_daily_papers(target_date):
target_date, results = _get_papers_from_hf_daily_papers(target_date)
results = json.loads(results)
for result in results:
result["target_date"] = target_date
return target_date, results
def _get_paper_xml_by_arxiv_id(arxiv_id):
url = f"http://export.arxiv.org/api/query?search_query=id:{arxiv_id}&start=0&max_results=1"
return requests.get(url)
def _is_arxiv_id_valid(arxiv_id):
pattern = r"^\d{4}\.\d{5}$"
return bool(re.match(pattern, arxiv_id))
def _get_paper_metadata_by_arxiv_id(response):
root = ET.fromstring(response.content)
# Example: Extracting title, authors, and abstract
title = root.find('{http://www.w3.org/2005/Atom}entry/{http://www.w3.org/2005/Atom}title').text
authors = [author.find('{http://www.w3.org/2005/Atom}name').text for author in root.findall('{http://www.w3.org/2005/Atom}entry/{http://www.w3.org/2005/Atom}author')]
abstract = root.find('{http://www.w3.org/2005/Atom}entry/{http://www.w3.org/2005/Atom}summary').text
target_date = root.find('{http://www.w3.org/2005/Atom}entry/{http://www.w3.org/2005/Atom}published').text
return title, authors, abstract, target_date
def get_papers_from_arxiv_ids(arxiv_ids):
results = []
for arxiv_id in arxiv_ids:
print(arxiv_id)
if _is_arxiv_id_valid(arxiv_id):
try:
xml_data = _get_paper_xml_by_arxiv_id(arxiv_id)
title, authors, abstract, target_date = _get_paper_metadata_by_arxiv_id(xml_data)
datetime_obj = datetime.strptime(target_date, "%Y-%m-%dT%H:%M:%SZ")
formatted_date = datetime_obj.strftime("%Y-%m-%d")
results.append(
{
"title": title,
"target_date": formatted_date,
"paper": {
"summary": abstract,
"id": arxiv_id,
"authors" : authors,
}
}
)
except:
print("......something wrong happend when downloading metadata")
print("......this usually happens when you try out the today's published paper")
continue
else:
print(f"......not a valid arXiv ID[{arxiv_id}]")
return results |