Cześć, obecnie próbuję zeskrobać to https://www.sec.gov/ix?doc=/Archives/edgar/data/1090727/000109072720000003/form8-kq42019earningsr.htm Łącze SEC z beautifulsoup, aby uzyskać link zawierający„ UPS ”

pressting = soup3.find_all("a", string="UPS")
linkkm = pressting.get('href')
print(linkkm)

Ale kiedy to robię, pojawia się ten błąd:

Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36\SEC.py", line 55, in <module>
    print('Price: ' + str(edgar()))
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36\SEC.py", line 46, in edgar
    linkkm = pressting.get('href')
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36\lib\site-packages\bs4\element.py", line 2081, in __getattr__
    "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
AttributeError: ResultSet object has no attribute 'get'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

Oczekiwanym wynikiem jest wyodrębnienie atrybutu href, a następnie wydrukowanie tego href. Każda pomoc będzie mile widziana.

-1
DaReal HeroofHell 8 marzec 2020, 15:37

2 odpowiedzi

Najlepsza odpowiedź

Zasadniczo strona jest dynamicznie renderowana przez JavaScript po załadowaniu. więc nie będziesz w stanie przeanalizować obiektów, dopóki ich nie wyrenderujesz. Dlatego moduł requests nie wyrenderuje JavaScript.

Aby to osiągnąć, możesz użyć podejścia selenium. w przeciwnym razie możesz użyć modułu HTMLSession z html_request, aby renderować go w locie.

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import re
from time import sleep

options = Options()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)

driver.get("https://www.sec.gov/ix?doc=/Archives/edgar/data/1090727/000109072720000003/form8-kq42019earningsr.htm")

sleep(1)
soup = BeautifulSoup(driver.page_source, 'html.parser')

for item in soup.findAll("a", style=re.compile("^text")):
    print(item.get("href"))

driver.quit()

Wynik:

https://www.sec.gov/Archives/edgar/data/1090727/000109072720000003/exhibit991-q42019earni.htm
https://www.sec.gov/Archives/edgar/data/1090727/000109072720000003/exhibit992-q42019finan.htm

Jeśli jednak chcesz tylko pierwszego adresu URL;

url = soup.find("a", style=re.compile("^text")).get("href")
print(url)

Wynik:

https://www.sec.gov/Archives/edgar/data/1090727/000109072720000003/exhibit991-q42019earni.htm
0
αԋɱҽԃ αмєяιcαη 8 marzec 2020, 14:04

Twój problem polega na tym, że soup3.find_all () zwraca listę wyników i próbujesz użyć metody .get () z tej listy, gdy masz użyć jej tylko na jednym elemencie.

Spróbuj czegoś takiego jak iteracja po nich i wydrukowanie każdego z nich:

pressting = soup3.find_all("a", string="UPS")
for i in pressting:
    print(i.get('href'))
0
Alvaro Bataller 8 marzec 2020, 12:55