วิธีเข้าถึงค่าแอตทริบิวต์ของแท็กด้วย BeautifulSoup

ฉันใช้ BeautifulSoup และขอการขูดเว็บ ฉันรู้วิธีแยกแอตทริบิวต์ระหว่างแท็กต่างๆ แต่หากสิ่งที่ฉันต้องการคือหมายเลข '4.31' ด้านล่างในแท็ก มีความคิดเห็นไหมว่าจะได้มันมาได้อย่างไร

<div class="starRating" title="4.31">
<svg
 ...
</svg>
</div>

ฉันพยายามแล้ว:

soup.find('div',{'class':'starRating'})
soup.find('title')

ซึ่งไม่ส่งคืนอะไรเลย ดังนั้นตัวเลขจึงเป็นแท็ก...


person ilovebroccoli    schedule 28.12.2019    source แหล่งที่มา


คำตอบ (2)


คุณสามารถอ่านค่าแอตทริบิวต์ title ได้ดังนี้:

from bs4 import BeautifulSoup


response = """
<html>
<div class="starRating" title="4.31">
<svg>
</svg>
</div>
</html>
"""

soup = BeautifulSoup(response, 'lxml')
print(soup.find('div', {'class': 'starRating'})['title'])

เอาท์พุต:

4.31

ดู https://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes `

แท็กอาจมีแอตทริบิวต์จำนวนเท่าใดก็ได้ แท็ก <b id="boldest"> มีแอตทริบิวต์ "id" ซึ่งมีค่าเป็น "boldest" คุณสามารถเข้าถึงแอตทริบิวต์ของแท็กได้โดยถือว่าแท็กเหมือนกับพจนานุกรม

person Dan-Dev    schedule 28.12.2019

คุณสามารถใช้แลมบ์ดาเพื่อค้นหาองค์ประกอบที่มีแอตทริบิวต์ title ที่ตรงกัน จากนั้นใช้ปุ่ม ["title"] เพื่อแยกข้อมูลที่คุณต้องการ:

>>> soup.find(lambda x: x.name == "div" and "title" in x.attrs)["title"]
'4.31'

หรือใช้ตัวเลือก CSS:

>>> soup.select_one("div[title]")
<div class="starRating" title="4.31"></div>

ง่ายยิ่งขึ้น ให้ใช้แอตทริบิวต์เป้าหมายเป็น kwarg:

>>> soup.find("div", title=True)
<div class="starRating" title="4.31"></div>

ความพยายามที่จะดึงแอตทริบิวต์ title ออกจากองค์ประกอบที่ไม่มีจะทำให้ KeyError เพิ่มขึ้น ดังนั้นจึงควรกรองล่วงหน้า ใช้ find_all หรือ select หากคุณต้องการให้ผลลัพธ์หลายรายการสามารถทำซ้ำได้

person ggorlen    schedule 28.12.2019