我正在抓取一個字典網站,想要獲得一個單詞的英文翻譯。我正在使用soup.find_all()在頁面源中查找標記的第二個實體。但是該函式回傳一個長物件,因為標簽是嵌套的:
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
soup.find_all('td', attrs={'class':'ToWrd'})[1]
它回傳:
<td class="ToWrd">pupil <em class="tooltip POS2">n<span><i>noun</i>: Refers to person, place, thing, quality, etc.</span></em></td>
但我只對“瞳孔”感興趣,這是我在該詞典網站上搜索的單詞的含義。誰能幫助如何提取這個詞?
請注意,我不想使用 numpy 或 pandas 函式,因為代碼沒有這些依賴項,我不想添加它們。例如,我不是在尋找這個解決方案:
pd.DataFrame(soup.find_all('td', attrs={'class':'ToWrd'})[1])[0][0]
回傳:
'pupil '
uj5u.com熱心網友回復:
有不同的方法可以實作您的目標 - @Tim Roberts 提到了最簡單的方法 - 但請注意,如果只有一個詞,它就會起作用:
soup.find_all('td', attrs={'class':'ToWrd'})[1].text.split()[0]
另一種使用單個/復合名詞/多個單詞的方法是stripped_strings:
list(soup.find_all('td', attrs={'class':'ToWrd'})[1].stripped_strings)[0]
同樣的作業也可以通過結合get_text()引數和來完成split(),但我更喜歡stripped_strings:
soup.find_all('td', attrs={'class':'ToWrd'})[1].get_text('|',strip=True).split('|')[0]
注意: 如果只有<td>該類使用find()而不是find_all()
例子
將提取單個和復合名詞/多個詞:
html = '''
<td >pupil<em >n<span><i>noun</i>: Refers to person, place, thing, quality, etc.</span></em></td>
<td >ice cream<em >n<span><i>noun</i>: Refers to person, place, thing, quality, etc.</span></em></td>
'''
soup=BeautifulSoup(html,'lxml')
[list(w.stripped_strings)[0] for w in soup.find_all('td', attrs={'class':'ToWrd'})]
輸出
['pupil', 'ice cream']
uj5u.com熱心網友回復:
如何使用正則運算式:
import re
valid = re.compile(r'<td >(\w ) <em >')
print(valid.match('<td >pupil <em >n<span><i>noun</i>: Refers to person, place, thing, quality, etc.</span></em></td>').group(1))
回傳
pupil
上面的示例僅在所有標簽都具有
<td class="ToWrd">
之前和
<em class="tooltip POS2">
在你想要的話之后。但是您可以相應地調整正則運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/418827.html
標籤:
