簡體   English   中英

如何使用 Beautiful Soup 從網站上刮取 SVG 元素?

[英]How to scrape SVG element from a website using Beautiful Soup?

from bs4 import BeautifulSoup
import requests
import random

id_url = "https://codeforces.com/profile/akash77"
id_headers = {
    "User-Agent": 'Mozilla/5.0(Windows NT 6.1Win64x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 87.0 .4280 .141 Safari / 537.36 '}
id_page = requests.get(id_url, headers=id_headers)
id_soup = BeautifulSoup(id_page.content, 'html.parser')

id_soup = id_soup.find('svg')
print(id_soup)

為此,我得到了None作為 output 。

如果我解析包含此<svg>標記的 < <div> <div>元素,則不會打印 <div> 元素的內容。 find()適用於除 SVG 標簽外的所有 HTML 標簽。

svg 標簽不包含在源代碼中,它由 Javascript 渲染。

該網頁使用 Javascript 動態呈現,因此您將需要selenium來獲取呈現的頁面。

首先,安裝庫

pip install selenium
pip install webdriver-manager

然后,您可以使用它訪問整個頁面

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

s=Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s)
driver.maximize_window()
driver.get('https://codeforces.com/profile/akash77')
elements = driver.find_elements(By.XPATH, '//*[@id="userActivityGraph"]')

Elements 是一個 selenium WebElement,所以我們需要從中取出 HTML。

svg = [WebElement.get_attribute('innerHTML') for WebElement in elements]

這為您提供了 svg 和其中的所有元素。

在此處輸入圖像描述

有時,您需要在無頭模式下運行瀏覽器(無需打開 chrome UI),因為您可以將“無頭”選項傳遞給驅動程序。

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('headless')

# then pass options to the driver

driver = webdriver.Chrome(service=s, options=options) 

如果您只想要 html 中的數據,這並不漂亮,但它比瀏覽器自動化更快速、更容易:

import requests
import json

url = 'https://codeforces.com/profile/akash77'

resp = requests.get(url)

start = "$('#userActivityGraph').empty().calendar_yearview_blocks("
end = "start_monday: false"

s = resp.text
svg_data = s[s.find(start)+len(start):s.rfind(end)].strip()[:-1].replace('items','"items"').replace('data','"data"').replace('\n','').replace('\t','').replace(' ','') #get the token out the html
broken = svg_data+'}'

json_data = json.loads(broken)
print(json_data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM