Python : BeautifulSoup-이름 속성을 기반으로 속성 값 가져 오기


95

예를 들어 이름을 기반으로 속성 값을 인쇄하고 싶습니다.

<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']

위의 코드는를 제공합니다 KeyError: 'name'. 이름이 BeatifulSoup에서 사용되기 때문에 키워드 인수로 사용할 수 없기 때문이라고 생각합니다.

답변:


160

매우 간단합니다. 다음을 사용하십시오.

>>> 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

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"/>를
반환합니다

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'}

dict이기 때문에 keys및 'values'를 사용할 수도 있습니다.

>>> 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의 대답이 최선의 해결책이지만, 당신이 직면 한 문제는 Beautiful Soup의 Tag 객체가 파이썬 사전처럼 작동한다는 사실과 관련이 있습니다. 'name'속성이없는 태그에서 tag [ '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>

파이썬 코드


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.