第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

python - 使用 BeautifulSoup 更有效地抓取網(wǎng)頁

python - 使用 BeautifulSoup 更有效地抓取網(wǎng)頁

Cats萌萌 2023-07-05 11:10:16
我正在編寫一個(gè)腳本來抓取維基百科頁面,其中包含這些名稱的名稱列表。具體來說,我正在抓取一個(gè)維基百科頁面,其中包含每個(gè)爵士鋼琴家的姓名列表(至少根據(jù)維基百科)。我想要做的是將本頁上所有鋼琴家的名字附加到一個(gè)列表中。以下是維基百科頁面的鏈接:https ://en.wikipedia.org/wiki/List_of_jazz_pianists我設(shè)法用 Beautiful Soup v4 找到了一個(gè)解決方案,但它看起來很笨重。讓我描述一下這個(gè)解決方案以及為什么我會(huì)實(shí)現(xiàn)它。(為了簡(jiǎn)潔起見,我不會(huì)在這篇文章中包含 HTML 文件)import requestsimport bs4result = requests.get("https://en.wikipedia.org/wiki/List_of_jazz_pianists")soup = bs4.BeautifulSoup(result.text, "html.parser")bigList = soup.findAll('div', {'class' : 'div-col columns column-width'})bigList 是每個(gè) div class = div-col columns column-width 的列表,因?yàn)檫@些 div 包含藝術(shù)家的實(shí)際姓名。artistList = []index = 0for nameTag in bigList[5].contents[1].contents:    if index % 2 == 0:        artistList.append(nameTag.contents[0].contents[0])            index += 1    print(artistList)這需要一些解釋。如果您查看 Wikipedia 頁面的 HTML 文件,將會(huì)有所幫助。bigList[5]給出 'F' 的所有姓氏,因?yàn)?F 是字母表中的第 6 個(gè)字符. bigList[5].contents給出一個(gè)包含 3 個(gè)元素的列表:一個(gè)換行轉(zhuǎn)義字符、F 的整個(gè)<li>列表,最后是另一個(gè)換行轉(zhuǎn)義字符. 因此訪問F 的 bigList[5].contents[1]整個(gè)列表。給出每個(gè)元素的列表,以換行轉(zhuǎn)義字符分隔。所以我的想法是,我將迭代此列表中的每個(gè)元素,僅采用偶數(shù)索引元素,因?yàn)槠鏀?shù)索引元素都是換行符轉(zhuǎn)義字符。<li>bigList[5].contents[1].contents<li>nameTag.contents給出一個(gè)由兩個(gè)元素組成的列表,鋼琴家的超鏈接和姓名,以及他們的出生日期 - 死亡日期. 所以我選擇該列表的第一個(gè)元素。最后,nameTag.contents[0].contents給出一個(gè)僅包含一個(gè)元素(鋼琴家的名字)的列表,因此我拉出該列表的唯一元素,以便將其作為字符串而不是嵌套列表附加到artistList。正如您所看到的,對(duì)于看起來應(yīng)該更簡(jiǎn)單的事情來說,這是一個(gè)極其復(fù)雜的過程。鑒于我對(duì) bs4 和使用 python 進(jìn)行網(wǎng)頁抓取總體來說是新手,我覺得有一個(gè)更好的解決方案。此外,我最終想從該頁面上鏈接的每個(gè)鋼琴家的頁面收集數(shù)據(jù)。我的解決方案不是很穩(wěn)健或高效,我知道這會(huì)給我推進(jìn)這個(gè)項(xiàng)目帶來問題。有更好的方法來做我想做的事情嗎?我真的很感謝您的幫助,對(duì)于帖子的長(zhǎng)度以及任何其他不適當(dāng)或非慣用的錯(cuò)誤,我深表歉意 - 我是堆棧溢出的新手。謝謝!
查看完整描述

2 回答

?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊

您的解決方案可能有點(diǎn)過于依賴頁面的格式,盡管抓取維基百科總是很困難,因?yàn)閹в袛?shù)據(jù)的元素沒有用標(biāo)識(shí)符或類來標(biāo)記它們保存的數(shù)據(jù),所以您只能依賴于結(jié)構(gòu)無論如何,表格保持不變。


您找到了正確的數(shù)據(jù),但真正使藝術(shù)家鏈接與眾不同的是它們是元素<a>內(nèi)的div-col <div>元素。


BS4 的一個(gè)更簡(jiǎn)單的解決方案(考慮到您既需要藝術(shù)家姓名又需要他們頁面的鏈接):


from urllib import request

from bs4 import BeautifulSoup


with request.urlopen("https://en.wikipedia.org/wiki/List_of_jazz_pianists") as response:

    bs = BeautifulSoup(response, "html.parser")

    for div_col in bs.find_all('div', {'class': 'div-col'}):

        for artist_tag in div_col.find_all('a'):

            print(f'{artist_tag.text}, {artist_tag.attrs["href"]}')

請(qǐng)注意,這不使用第三方requests,而是標(biāo)準(zhǔn)urllib。


結(jié)果:


Irving Aaronson, /wiki/Irving_Aaronson

Anders Aarum, /wiki/Anders_Aarum

...

Bojan Zulfikarpa?i?, /wiki/Bojan_Zulfikarpa%C5%A1i%C4%87

Axel Zwingenberger, /wiki/Axel_Zwingenberger

如果您注重效率(或更確切地說是簡(jiǎn)潔),那么這句話可能就是您喜歡的:


result = [(a.text, a.attrs['href'])

          for d in bs.find_all('div', {'class': 'div-col'})

          for a in d.find_all('a')]

result將是藝術(shù)家姓名和鏈接的元組列表,即[('Irving Aaronson', '/wiki/Irving_Aaronson'), ('Anders Aarum', '/wiki/Anders_Aarum'), ..]


查看完整回答
反對(duì) 回復(fù) 2023-07-05
?
吃雞游戲

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

找到后bigList,您可以使用此行替換其余行:

[row['title'] for row in bigList[5].find_all('a')]

要理解此代碼,請(qǐng)查看bigList[5]bigList[5].find_all('a')` 的輸出,然后也嘗試該行。

您可以類似地使用href代替title來查找網(wǎng)址。


查看完整回答
反對(duì) 回復(fù) 2023-07-05
  • 2 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)