我有一個像下面這樣的標簽,我想用它來選擇它 Beautiful Soup
<td align="right" class="simcal" valign="top"> Title:<br/></td>
當我嘗試使用以下代碼選擇此標簽時,一切正常。
# sample 1 :
my_tag = soup.find(
'td',
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
# sample 2 :
my_tag = soup.find(
text=" Title:",
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
但是當我嘗試將這兩者結合在一起Beautiful Soup時,找不到我想要的元素。
# This will fail
my_tag = soup.find(
'td',
text=" Title:",
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
所以我的問題是有人可以向我解釋這里發生了什么嗎?
uj5u.com熱心網友回復:
首先,這里有一個錯字。你有它在你的 html 中尋找它的時候"simcal"
其次,(這只是我的理解,我不能肯定)但文本" Title:"位于<br>沒有屬性的標簽內。所以它是正確的,因為它不回傳任何align="right" valign="top"屬于<td>標簽的屬性。這里的棘手之處在于,對于 html,您不需要用<br>標簽打開,我認為這就是 BeautifulSoup 在這里被絆倒的原因。
請注意,如果我們洗掉</br>標簽,它會起作用:
from bs4 import BeautifulSoup
html = '''<td align="right" valign="top"> Title:</td>'''
soup = BeautifulSoup(html, 'html.parser')
my_tag = soup.find(
'td',
text=" Title:",
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
print(my_tag)
輸出:
<td align="right" class="header2" valign="top"> Title:</td>
要在您的情況下解決此問題而不必洗掉結束</br>標記,并且在此解決方案的幫助下,我們看到通過使用'lxml'決議器而不是'html.parser',它可以處理它。
from bs4 import BeautifulSoup
html = '''<td align="right" valign="top"> Title:</br></td>'''
soup = BeautifulSoup(html, 'lxml')
# sample 1 :
my_tag1 = soup.find(
'td',
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
# sample 2 :
my_tag2 = soup.find(
text=" Title:",
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
my_tag3 = soup.find(
'td',
text=" Title:",
attrs={"align": "right", "class": "header2", "valign": 'top'},
)
print(my_tag1)
print(my_tag2)
print(my_tag3)
輸出:
<td align="right" class="header2" valign="top"> Title:</td>
<td align="right" class="header2" valign="top"> Title:</td>
<td align="right" class="header2" valign="top"> Title:</td>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370851.html
上一篇:使用python從網站上抓取價格
