gpt4 book ai didi

python - 没有 html 标签时的 HTML 抓取

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:01 24 4
gpt4 key购买 nike

我正在尝试从这个 website 获取海拔数据以及开始和结束通过时间.到目前为止,我已经查看了源代码并且无法使用 Beautiful Soup 来获得我想要的东西,因为源代码在我感兴趣的信息周围没有任何标签。该信息包含在名为 spStart 的函数中, 以及相应的参数。我曾尝试使用 selenium 来获取 Javascript 处理的代码,但我最终得到的与页面上的源代码相同,现在我被卡住了。

这是我使用 selenium 的尝试:

import datetime
import time
from bs4 import BeautifulSoup
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import selenium.webdriver.chrome.service as service
from lxml import html


try:
#Launching chrome in headless mode to access inspect element code''
service = service.Service('/correct_path/chromedriver.exe')
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'/correct_path/chromedriver.exe')
driver.get("https://www.n2yo.com/passes/?s=39090&a=1")
print("Chrome Browser Initialized in Headless Mode")


soup = BeautifulSoup(driver.execute_script("return document.documentElement.innerHTML;"), "lxml")
print(soup)



except KeyboardInterrupt:
driver.quit()
print("Driver Exited")

当我运行这段代码时,它会提供我在 chrome 中使用“查看源代码”选项时看到的 html。我的印象是,通过使用 selenium 以这种方式获取源代码,我会看到在 chrome 的同一页面上使用“检查元素”选项时可用的内容。

有人会介意解释我哪里出错了,并建议一种可行的方法来获取我想要的数据,可能还有一个解释过的例子吗?我真的很感激。

感谢您的宝贵时间。

最佳答案

No 不一样,Inspect Element 检查 DOM , 源页面虽然实际上是 DOM 的原始种子页面, DOM可以动态改变,通常通过JS代码改变, 有时非常戏剧化。您还会注意到 Inspect Element 显示了源代码未显示的阴影元素。

要查看差异有多大,请访问 chrome://settings/ 并单击 Inspect element 然后查看 View page source并比较。

您应该在加载后定位元素并获取 arguments[0] 而不是通过 document 获取整个页面

html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
sel_soup=BeautifulSoup(html_of_interest, 'lxml')

这有两个实际案例:

1

该元素尚未加载到 DOM 中,您需要等待该元素:

browser.get("url")
sleep(experimental) # usually get will finish only after the page is loaded but sometimes there is some JS woo running after on load time

try:
element= WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'your_id_of_interest')))
print "element is ready do the thing!"
html_of_interest=driver.execute_script('return arguments[0].innerHTML',element)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
except TimeoutException:
print "Somethings wrong!"

2

该元素在影子根中,您需要先扩展影子根,可能不是您的情况,但我会在这里提及,因为它与以后的引用有关。例如:

import selenium
from selenium import webdriver
driver = webdriver.Chrome()
from bs4 import BeautifulSoup


def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root

driver.get("chrome://settings")
root1 = driver.find_element_by_tag_name('settings-ui')

html_of_interest=driver.execute_script('return arguments[0].innerHTML',root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup# empty root not expande

shadow_root1 = expand_shadow_element(root1)

html_of_interest=driver.execute_script('return arguments[0].innerHTML',shadow_root1)
sel_soup=BeautifulSoup(html_of_interest, 'html.parser')
sel_soup

enter image description here

关于python - 没有 html 标签时的 HTML 抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com