我正在嘗試從balloon-reference.com 中提取HTML 資料。我想去他們的網站,查看頁面源代碼,html 標簽將在 html 代碼本身中。但是,經過進一步調查,我關心的 html 標簽集在評論塊內。
示例:https ://www.baseball-reference.com/leagues/AL/2021-standard-batting.shtml 通過“查看源代碼”找到標簽:
<div class="table_container" id="div_players_standard_batting">
我正在尋找的代碼在此行下方。如果您查看這一行上方,您將看到注釋塊以 <!-- 開頭,并且直到 HTML 檔案幾乎結束時才結束。
我可以使用以下代碼提取 HTML 注釋,但它帶來了一些問題。
- 它在一個串列中,我只關心有資料的那個
- 它帶有新的行標簽
- 我正在努力研究如何采用球員標準擊球字串代碼并將其重新決議為 html 代碼以使用 BeautifulSoup 來獲取我想要的資料。
代碼:
from bs4 import BeautifulSoup
from bs4 import Comment
import pandas as pd
import os.path
import requests
r = requests.get("https://www.baseball-reference.com/leagues/majors/2021-standard-batting.shtml")
soup = BeautifulSoup(r.content, "html.parser") # try lxml
Data=[x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment))]
Data
當前環境設定:
dependencies:
- python=3.9.7
- beautifulsoup4=4.11.1
- jupyterlab=3.3.2
- pandas=1.4.2
- pyodbc=4.0.32
最終目標:能夠擁有一個熊貓資料框,其中包含來自此網頁的每個玩家的資料。
編輯:
回答:
為實作我的目標所做的更改:通過 Anaconda Prompt 將 lxml 包安裝到我的環境中。使用以下代碼行將我的 html 資料拉入資料框(提供者:HedgeHog - 謝謝!)
pd.read_html([x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment)) if 'id="div_players_standard_batting"' in x][0])[0]
uj5u.com熱心網友回復:
您走在正確的軌道上,您只需將各個部分放在一起。
在ResultSetid 中應該只有一個元素div_players_standard_batting,因此對其進行過濾并將此元素轉換pandas.read_html()為 DataFrame:
pd.read_html([x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment)) if 'id="div_players_standard_batting"' in x][0])[0]
或者作為替代創建一個新的bs4 object并迭代它的行:
soup = BeautifulSoup([x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment)) if 'id="div_players_standard_batting"' in x][0])
for row in soup.select('table tr'):
...
輸出:
| Rk | 姓名 | 年齡 | Tm值 | LG | G | 功放 | AB | R | H | 2B | 3B | 人力資源 | 打點 | 某人 | CS | BB | 所以 | 文學學士 | OBP | SLG | 運維 | 運維 | 結核病 | 國內生產總值 | 高血壓病 | 上海 | 順豐 | 國際文憑組織 | 職位摘要 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 費爾南多·阿巴德* | 35 | 巴爾 | 鋁 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楠 | 楠 | 楠 | 楠 | 楠 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 2 | 科里·雅培 | 25 | CHC | 荷蘭 | 8 | 3 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0.333 | 0.333 | 0.333 | 0.667 | 81 | 1 | 0 | 0 | 0 | 0 | 0 | /1H |
| 2 | 3 | 阿爾伯特·阿布雷烏 | 25 | 紐約年 | 鋁 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楠 | 楠 | 楠 | 楠 | 楠 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 3 | 4 | 布萊恩·阿布雷烏 | 24 | 侯 | 鋁 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楠 | 楠 | 楠 | 楠 | 楠 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 4 | 5 | 何塞·阿布雷烏 | 34 | CHW | 鋁 | 152 | 659 | 566 | 86 | 148 | 30 | 2 | 30 | 117 | 1 | 0 | 61 | 143 | 0.261 | 0.351 | 0.481 | 0.831 | 125 | 272 | 28 | 22 | 0 | 10 | 3 | *3D/5 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1787 | 1720 | 布魯斯·齊默爾曼* | 26 | 巴爾 | 鋁 | 2 | 4 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | -100 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1788 | 1721 | 喬丹齊默爾曼 | 35 | 軍用 | 荷蘭 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -100 | 0 | 0 | 0 | 0 | 0 | 0 | /1 |
| 1789 | 1722 | 泰勒·祖伯 | 26 | 九鐵 | 鋁 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -100 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1790 | 1723 | 邁克·祖尼諾 | 30 | TBR | 鋁 | 109 | 375 | 333 | 64 | 72 | 11 | 2 | 33 | 62 | 0 | 0 | 34 | 132 | 0.216 | 0.301 | 0.559 | 0.86 | 137 | 186 | 7 | 7 | 0 | 1 | 0 | 2/小時 |
| 1791 | 楠 | 每 600 PA 的 LgAvg | 楠 | 楠 | 楠 | 205 | 600 | 535 | 73 | 130 | 26 | 2 | 20 | 69 | 7 | 2 | 52 | 139 | 0.243 | 0.316 | 0.41 | 0.726 | 楠 | 219 | 11 | 7 | 2 | 4 | 2 | 楠 |
uj5u.com熱心網友回復:
首先提取原始 html,然后str.replace使用正則運算式洗掉評論。然后用beautifulsoup4. 我認為這會成功
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/483227.html
