특정 속성 만있는 태그를 찾는 방법-BeautifulSoup


84

BeautifulSoup을 사용하여 내가 검색하는 속성 만 포함 된 태그를 어떻게 검색합니까?

예를 들어 모든 <td valign="top">태그 를 찾고 싶습니다 .

다음 코드 : raw_card_data = soup.fetch('td', {'valign':re.compile('top')})

원하는 모든 데이터를 가져 오지만 <td>속성이 있는 태그 도 가져 옵니다.valign:top

나는 또한 시도했다 : raw_card_data = soup.findAll(re.compile('<td valign="top">')) 그리고 이것은 아무것도 반환하지 않는다 (아마도 잘못된 정규식 때문에)

"찾기 말을 BeautifulSoup로있는 방법이 있다면 궁금 해서요 <td>그의 유일한 속성입니다 태그 valign:top"

예를 들어, HTML 문서에 다음 <td>태그가 포함 된 경우 UPDATE :

<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />

첫 번째 <td>태그 ( <td width="580" valign="top">) 만 반환 하고 싶습니다.

답변:


96

BeutifulSoup 문서 에 설명 된대로

이것을 사용할 수 있습니다 :

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

편집하다 :

valign = "top"속성 만있는 태그를 반환하려면 tag attrs속성 의 길이를 확인할 수 있습니다 .

from BeautifulSoup import BeautifulSoup

html = '<td valign="top">.....</td>\
        <td width="580" valign="top">.......</td>\
        <td>.....</td>'

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

for result in results :
    if len(result.attrs) == 1 :
        print result

그 결과 :

<td valign="top">.....</td>

julio.alegria에 대한 내 의견에 따라 다른 속성을 가진 <tr>태그를 포함하여 속성 이있는 모든 태그를 찾습니다 valign="top"( <td width="580" valign="top">이 검색에서도 반환 됨). <tr>유일한 속성 인 태그 를 찾는 방법을 찾고 있습니다valign="top"
Snaxib

따라서 len (tag.attrs)을 확인할 수 있습니다. 만약 렌 (tag.attrs)> 1, 태그 (나는 내 게시물을 편집 한) 무시
루이 G.

51

설명서에 설명 된대로의 lambda함수를 사용할 수 있습니다 . 따라서 귀하의 경우 다음을 사용 하여 태그 를 검색하십시오 .findAlltdvalign = "top"

td_tag_list = soup.findAll(
                lambda tag:tag.name == "td" and
                len(tag.attrs) == 1 and
                tag["valign"] == "top")

4
BS의 모든 기능을 사용하므로 최고의 답변
Rafael T

2
매우 최적화 된 방식으로 결과를 제공하기 때문에 훌륭한 답변입니다.
CrazyGeek

32

값이있는 속성 이름으로 만 검색하려는 경우

from bs4 import BeautifulSoup
import re

soup= BeautifulSoup(html.text,'lxml')
results = soup.findAll("td", {"valign" : re.compile(r".*")})

Steve Lorimer에 따르면 정규식 대신 True를 전달하는 것이 좋습니다.

results = soup.findAll("td", {"valign" : True})

2
뒤에 괄호가 누락되어 r".*"컴파일되지 않습니다.
Jack Cole

9
정규 표현식에 대한 필요, 그냥 통과하지 True:results = soup.findAll("td", {"valign" : True})
스티브 Lorimer가에게

14

가장 쉬운 방법은 새로운 CSS 스타일 select방법을 사용하는 것입니다.

soup = BeautifulSoup(html)
results = soup.select('td[valign="top"]')

4

다음의 인수로 전달하십시오 findAll.

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <html>
... <head><title>My Title!</title></head>
... <body><table>
... <tr><td>First!</td>
... <td valign="top">Second!</td></tr>
... </table></body><html>
... """)
>>>
>>> soup.findAll('td')
[<td>First!</td>, <td valign="top">Second!</td>]
>>>
>>> soup.findAll('td', valign='top')
[<td valign="top">Second!</td>]

1
다음과 같은 태그가있는 경우 : <td width="580" valign="top">? 나는 사람들을 잡아 싶지 않아, 그의 유일한 속성입니다 단지 태그valign="top"
Snaxib

2

Chris Redford와 Amr의 대답을 조합하면 select 명령을 사용하여 값이있는 속성 이름을 검색 할 수도 있습니다.

from bs4 import BeautifulSoup as Soup
html = '<td valign="top">.....</td>\
    <td width="580" valign="top">.......</td>\
    <td>.....</td>'
soup = Soup(html, 'lxml')
results = soup.select('td[valign]')

같은 방법으로 시도했지만 작동하지 않습니다. 해결 방법이 있습니까?
Phaneendra Charyulu Kanduri

1
@PhaneendraCharyuluKanduri 죄송합니다. 코드에 잘못된 코딩 오류가 있습니다. 이제 복사 및 붙여 넣기가 작동합니다!
GrazingScientist
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.