使用 selenium 进行网页抓取问题找不到元素

问题描述 投票:0回答:1

我正在尝试在 Google Colab 上使用 selenium 进行网页抓取,但是在复制其 xpath 后尝试查找元素(尤其是链接)时遇到了问题。

我要抓取的网站

我的代码的第一部分

我的代码的第二部分

我的代码的第三部分

我尝试过错开等待时间,并复制完整的 XPATH 而不仅仅是 XPATH。我还尝试执行与尝试使用另一个网站抓取此链接相同的步骤,并且它有效。这让我相信我最初尝试抓取的特定网站存在问题。早些时候,我在使用 beautiful soup 时遇到了一个问题,它会说我的访问被拒绝,所以我收到错误的原因可能是因为它也以这种方式被阻止,尽管当我使用时这并不像以前那么明显美丽的汤。无论如何,我附上了整个代码的图片(除了我在下面讨论的具体代码之外),以及网站的屏幕截图,其中包含我在检查时想要抓取的内容。如果您有任何解决此问题的想法,或者我只是做错了什么,请告诉我。

这是我的代码:

    driver = webdriver.Chrome(options=options)
    driver.get(url)
    link = driver.find_element(By.XPATH, '//*[@id="formDiv"]/div/table/tbody/tr[2]/td[3]')

这是我得到的错误:

---------------------------------------------------------------------------
NoSuchElementException                    Traceback (most recent call last)
<ipython-input-103-acdf74b871c1> in <cell line: 4>()
      2 driver.get(url)
      3 
----> 4 link = driver.find_element(By.XPATH, '//*[@id="formDiv"]/div/table/tbody/tr[2]/td[3]')

2 frames
/usr/local/lib/python3.10/dist-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    227                 alert_text = value["alert"].get("text")
    228             raise exception_class(message, screen, stacktrace, alert_text)  # type: ignore[call-arg]  # mypy is not smart enough here
--> 229         raise exception_class(message, screen, stacktrace)

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="formDiv"]/div/table/tbody/tr[2]/td[3]"}
  (Session info: chrome-headless-shell=126.0.6478.63); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
#0 0x56f9edf3869a <unknown>
#1 0x56f9edc1b0dc <unknown>
#2 0x56f9edc67931 <unknown>
#3 0x56f9edc67a21 <unknown>
#4 0x56f9edcac234 <unknown>
#5 0x56f9edc8a89d <unknown>
#6 0x56f9edca95c3 <unknown>
#7 0x56f9edc8a613 <unknown>
#8 0x56f9edc5a4f7 <unknown>
#9 0x56f9edc5ae4e <unknown>
#10 0x56f9edefe86b <unknown>
#11 0x56f9edf02911 <unknown>
#12 0x56f9edeea35e <unknown>
#13 0x56f9edf03472 <unknown>
#14 0x56f9edececbf <unknown>
#15 0x56f9edf28098 <unknown>
#16 0x56f9edf28270 <unknown>
#17 0x56f9edf377cc <unknown>
#18 0x7c8a0be61ac3 <unknown>
selenium-webdriver web-scraping selenium-chromedriver
1个回答
0
投票

这似乎提取了您要查找的内容:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

URL = "https://www.sec.gov/Archives/edgar/data/1346824/000110465924035606/0001104659-24-035606-index.html"

options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')

driver = webdriver.Remote(
  "http://127.0.0.1:4444/wd/hub",
  options=options
)

driver.get(URL)

link = driver.find_element(By.XPATH, '//*[@id="formDiv"]/div/table/tbody/tr[2]/td[3]')

print(link)
print(link.text)

driver.close()

输出:

tm249128d1_sc13da.htm

我更喜欢在 Docker 容器中使用 Selenium,然后将其作为远程驱动程序进行访问。您可以将对

webdriver.Remote()
的调用替换为:

driver = webdriver.Chrome(options=options)

最后,我建议不要在启动浏览器时使用

--headless
标志。恕我直言,能够看到您正在抓取的内容确实很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.