我正試圖將這個網頁決議成一個pandas資料框架來進行分析,但是這個頁面的設定使得表格只有兩列用途,一列是名字,另一列則是包含所有其他資訊的單一單元格。
例如,以我下面的代碼為例:
importbs4
from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
url = "https://education.scripps.edu/alumni/graduate-alumni-list/index.html"。
page = urlopen(url)
html = page.read().decode("utf-8"/span>)
soup = BeautifulSoup(html, "html.parser")
table = soup.find('tbody')
td = table.find_all('td')
資料 = []
for element in td:
sub_data = []
for sub_element in element:
try:
sub_data.append(sub_element.get_text())
except:
繼續:
data.append(sub_data)
dataFrame = pd.DataFrame(data = data)
df = dataFrame[[1,3]]
df = df.dropna()
因此df.iat[0,1]將有程式、答辯年、導師、論文題目和本科院校。HTML只使用 "br "和 "strong "來分隔這些值,我想知道是否有辦法將這些文本分隔成不同的列,因此這些列將是 "姓名"、"程式"、"答辯年份 "等,而不是一個包含所有資訊的單元。
非常感謝您!
uj5u.com熱心網友回復:
在你的代碼中的try:之后和sub_data.append行之前,你應該用"<br> "分割你的sub_element文本。你可以嘗試以下方法:
sub_data_splitted = sub_element.get_text().split("<br>") 。
# 之后你就可以使用資料的每個欄位,即。
program = sub_data_splitted[0].split(" :")[1]
defense_year = sub_data_splitted[1].split(":") [1]
advisor = sub_data_splitted[2].split(":") [1]
dissertation_title = sub_data_splitted[3].split(":") [1]
ug_institution = sub_data_splitted[4].split(":") [1]
uj5u.com熱心網友回復:
你可以這樣做。
- 你可以使用
.stripped_strings()來從表的每個<tr>中獲得一個資料串列。 - 由于你只需要數值而不是標題(如姓名、國防年等),所以使用List comprehension只選擇需要的數值。
- 將串列添加到一個資料框架。
下面是它的操作方法。
import requests
from bs4 import BeautifulSoup
import pandas as pd
URL = "https://education.scripps.edu/alumni/graduate-alumni-list/index.html"/span>
page = requests.get(URL)
soup = BeautifulSoup(page.text, "lxml")
t = soup.find('table').find('tbody')
trs = t.find_all('tr')
資料 = []
for i in trs:
l = [x for i,x in enumerate(list(i. stripped_strings)) if i%2 == 0 ]
data.append(l)
df = pd.DataFrame(data=data)
0 ... 6 ...
0 Abbott, PhD, Jason ... 無
1 Adam, PhD, Gregory Charles ... 無 1 Adam, PhD, Gregory Charles ...
2 Adhikari, PhD, Pramisha ... 無 2 Adhikari, PhD, Pramisha ...
3 Al-Bassam, PhD, Jawdat M. H. ... None
4 Albertshofer, PhD, Klaus ... 無
.. ... ... ...
682 Zhou, PhD, Jiacheng ... 無
683 Zhou, PhD, Zhaohui (Sunny) ... 無 683 周朝暉博士 ...
684 Zhu, PhD, Ruyi ... 無 684 朱如意博士...
685 Zhu, PhD, Yan ... 無 685 Zhu, PhD, Yan ...
686 Zuhl, PhD, Andrea M. ... None 686 Zuhl, PhD, Andrea M. .
[687 行 x 7 列]
uj5u.com熱心網友回復:
這是你想做的嗎?
這是你想做的嗎?
import bs4
from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
url = "https://education.scripps.edu/alumni/graduate-alumni-list/index.html"。
page = urlopen(url)
html = page.read().decode("utf-8"/span>)
soup = BeautifulSoup(html, "html.parser")
table = soup.find('tbody')
td = table.find_all('td')
資料 = {}
名稱 = []
prev_name = None[/span]。
for element in td:
sub_data = {}
for sub_element in element:
try:
data[sub_element['alt']] = {}.
prev_name = sub_element['alt'] = {}。
except:
sub_element = str(sub_element).replace('</strong>', ' ')。 replace('<br/> ', '</strong>')
temp = BeautifulSoup(sub_element)
if len(temp.find_all('strong'/span>)) > 0:
temp = [str(i.string) for i in temp. find_all('strong') if i.string is not None ]
temp = {i.split(':', 1) [0] : i. split(': ', 1)[1] for i in temp if ' : ' in i}。
data[prev_name] = temp
df = pd.DataFrame(data = data)
df = df.T.reset_index()
df.rename(columns={'index' : 'Name'}, inplace=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320259.html
標籤:
上一篇:如何用R語言從圖表中抓取資料
