Python: BeautifulSoup - รับค่าแอตทริบิวต์ตามแอตทริบิวต์ name


98

ฉันต้องการพิมพ์ค่าแอตทริบิวต์ตามชื่อตัวอย่างเช่น

<META NAME="City" content="Austin">

ฉันอยากทำอะไรแบบนี้

soup = BeautifulSoup(f) //f is some HTML containing the above meta tag
for meta_tag in soup('meta'):
    if meta_tag['name'] == 'City':
         print meta_tag['content']

รหัสด้านบนให้ a KeyError: 'name'ฉันเชื่อว่านี่เป็นเพราะชื่อถูกใช้โดย BeatifulSoup ดังนั้นจึงไม่สามารถใช้เป็นอาร์กิวเมนต์คำหลักได้

คำตอบ:


162

ค่อนข้างง่ายใช้สิ่งต่อไปนี้ -

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<META NAME="City" content="Austin">')
>>> soup.find("meta", {"name":"City"})
<meta name="City" content="Austin" />
>>> soup.find("meta", {"name":"City"})['content']
u'Austin'

แสดงความคิดเห็นหากมีสิ่งใดไม่ชัดเจน


1
ฉันจะทำสิ่งนี้ได้อย่างไรหากต้องการค้นหาอินสแตนซ์ทั้งหมดเช่นตอนนี้ soup.find ("meta", {"name": "City"}) ['content'] ให้ผลลัพธ์แรก แต่บอกว่ามีอีกอัน บรรทัดในซุปซึ่งเป็น <META NAME = 'City "content =" San Francisco "> ฉันจะแก้ไขโค้ดเพื่อให้ได้' Austin 'และ' San Francisco 'ได้อย่างไร
overflowname

1
คำถามเดิม soup.findAll("meta", {"name":"City"})['content']แต่นี่เป็นวิธีที่ง่ายในกรณีที่คนอื่นมามองหามัน สิ่งนี้จะส่งคืนเหตุการณ์ทั้งหมด
Hannon César

ฉันจะได้รับค่าของคุณลักษณะเฉพาะได้อย่างไร หมายความว่าฉันมีคุณลักษณะเท่านั้น ...
Phaneendra Charyulu Kanduri

นั่นคือสิ่งที่uอยู่ในu'Austin?
webNoob13

นอกจากนี้ยังได้รับข้อผิดพลาดที่สำคัญ ['เนื้อหา']
webNoob13

28

theharshestตอบคำถาม แต่นี่เป็นอีกวิธีในการทำสิ่งเดียวกัน นอกจากนี้ในตัวอย่างของคุณคุณมี NAME เป็นตัวพิมพ์ใหญ่และในรหัสของคุณคุณมีชื่อเป็นตัวพิมพ์เล็ก

s = '<div class="question" id="get attrs" name="python" x="something">Hello World</div>'
soup = BeautifulSoup(s)

attributes_dictionary = soup.find('div').attrs
print attributes_dictionary
# prints: {'id': 'get attrs', 'x': 'something', 'class': ['question'], 'name': 'python'}

print attributes_dictionary['class'][0]
# prints: question

print soup.find('div').get_text()
# prints: Hello World

กรณีที่ไม่ตรงกันอาจเกิดจากความตั้งใจเนื่องจาก BeautifulSoup แปลงแท็กเป็นตัวพิมพ์เล็กโดยค่าเริ่มต้น ในกรณีนี้: BeautifulSoup ('<META NAME = "City" content = "Austin">') ส่งคืน <meta content = "Austin" name = "City" />
tuckermi

9

6 ปีที่ไปปาร์ตี้ แต่ฉันกำลังค้นหาวิธีแยกค่าแอตทริบิวต์แท็กขององค์ประกอบ html ดังนั้นสำหรับ:

<span property="addressLocality">Ayr</span>

ฉันต้องการ "addressLocality" ฉันถูกนำกลับมาที่นี่เสมอ แต่คำตอบไม่ได้ช่วยแก้ปัญหาของฉันได้จริงๆ

ฉันจัดการได้อย่างไรในที่สุด:

>>> from bs4 import BeautifulSoup as bs

>>> soup = bs('<span property="addressLocality">Ayr</span>', 'html.parser')
>>> my_attributes = soup.find().attrs
>>> my_attributes
{u'property': u'addressLocality'}

เนื่องจากเป็นคำสั่งคุณสามารถใช้keysและ 'ค่า'

>>> my_attributes.keys()
[u'property']
>>> my_attributes.values()
[u'addressLocality']

หวังว่ามันจะช่วยคนอื่น!


8

ผลงานดังต่อไปนี้:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<META NAME="City" content="Austin">', 'html.parser')

metas = soup.find_all("meta")

for meta in metas:
    print meta.attrs['content'], meta.attrs['name']

7

คำตอบของ theharshest เป็นทางออกที่ดีที่สุด แต่ FYI ปัญหาที่คุณพบเกี่ยวข้องกับการที่วัตถุ Tag ใน Beautiful Soup ทำหน้าที่เหมือนพจนานุกรม Python หากคุณเข้าถึงแท็ก ['name'] บนแท็กที่ไม่มีแอตทริบิวต์ "name" คุณจะได้รับ KeyError


1

คุณสามารถลองใช้วิธีนี้:

เพื่อหาค่าซึ่งเขียนเป็นช่วงตาราง

htmlContent


<table>
    <tr>
        <th>
            ID
        </th>
        <th>
            Name
        </th>
    </tr>


    <tr>
        <td>
            <span name="spanId" class="spanclass">ID123</span>
        </td>

        <td>
            <span>Bonny</span>
        </td>
    </tr>
</table>

รหัส Python


soup = BeautifulSoup(htmlContent, "lxml")
soup.prettify()

tables = soup.find_all("table")

for table in tables:
   storeValueRows = table.find_all("tr")
   thValue = storeValueRows[0].find_all("th")[0].string

   if (thValue == "ID"): # with this condition I am verifying that this html is correct, that I wanted.
      value = storeValueRows[1].find_all("span")[0].string
      value = value.strip()

      # storeValueRows[1] will represent <tr> tag of table located at first index and find_all("span")[0] will give me <span> tag and '.string' will give me value

      # value.strip() - will remove space from start and end of the string.

     # find using attribute :

     value = storeValueRows[1].find("span", {"name":"spanId"})['class']
     print value
     # this will print spanclass

1
If tdd='<td class="abc"> 75</td>'
In Beautifulsoup 

if(tdd.has_attr('class')):
   print(tdd.attrs['class'][0])


Result:  abc

1
แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
shaunakde
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.