수색…


BeautifulSoup에서 요소 뒤에 텍스트 찾기

다음 HTML을 가지고 있다고 가정 해보십시오.

<div>
    <label>Name:</label>
    John Smith
</div>

그리고 label 요소 다음에 "John Smith"라는 텍스트를 찾아야합니다.

이 경우 텍스트로 label 요소를 찾은 다음 .next_sibling 속성 을 사용할 .next_sibling 있습니다 .

from bs4 import BeautifulSoup

data = """
<div>
    <label>Name:</label>
    John Smith
</div>
"""

soup = BeautifulSoup(data, "html.parser")

label = soup.find("label", text="Name:")
print(label.next_sibling.strip())

John Smith 인쇄합니다.

CSS 선택기를 사용하여 BeautifulSoup의 요소 찾기

BeautifulSoup는 CSS 선택기에 대한 지원제한적 이지만 가장 일반적으로 사용되는 CSS를 지원 합니다. select() 메서드를 사용 select() 여러 요소를 찾고 select_one() 을 사용하여 단일 요소를 찾습니다.

기본 예 :

from bs4 import BeautifulSoup

data = """
<ul>
    <li class="item">item1</li>
    <li class="item">item2</li>
    <li class="item">item3</li>
</ul>
"""

soup = BeautifulSoup(data, "html.parser")

for item in soup.select("li.item"):
    print(item.get_text())

인쇄물:

item1
item2
item3

댓글 찾기

에 주석을 찾으려면 BeautifulSoup 사용, text (또는 string 로 유형을 검사 최신 버전의) 인수 Comment :

from bs4 import BeautifulSoup
from bs4 import Comment

data = """
<html>
    <body>
        <div>
        <!-- desired text -->
        </div>
    </body>
</html>
"""

soup = BeautifulSoup(data, "html.parser")
comment = soup.find(text=lambda text: isinstance(text, Comment))
print(comment)

desired text 인쇄 desired text .

필터 함수

BeautifulSoup를 사용하면 find_all 및 유사한 함수에 함수를 제공하여 결과를 필터링 할 수 있습니다. 이는 코드 재사용 도구뿐만 아니라 복잡한 필터에도 유용 할 수 있습니다.

기본 사용법

요소를 인수로 취하는 함수를 정의하십시오. 인수가 일치하면 함수는 True 를 반환해야합니다.

def has_href(tag):
    '''Returns True for tags with a href attribute'''
    return  bool(tag.get("href"))

soup.find_all(has_href) #find all elements with a href attribute
#equivilent using lambda:
soup.find_all(lambda tag: bool(tag.get("href")))

href 값으로 시작하지 않는 태그를 찾는 또 다른 예제

필터 함수에 추가 인수 제공

find_all 전달 된 함수는 하나의 인수만을 취할 수 있기 때문에 find_all 에서 사용할 함수를 생성하는 '함수 팩토리'를 만드는 것이 유용 할 find_all 있습니다. 이것은 태그 찾기 기능을보다 융통성있게 만드는데 유용합니다.

def present_in_href(check_string):
    return lambda tag: tag.get("href") and check_string in tag.get("href")

soup.find_all(present_in_href("/partial/path"))

내부 태그 및 초기 선택된 태그의 속성 액세스

soup.find('div', class_='base class') 하여 html 을 선택한 것으로 가정 해 보겠습니다.

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class')
print(html)

<div class="base class">
  <div>Sample text 1</div>
  <div>Sample text 2</div>
  <div>
    <a class="ordinary link" href="https://example.com">URL text</a>
  </div>
</div>

<div class="Confusing class"></div>
'''

그리고 <a> 태그의 href 에 액세스하려면 다음과 같이하면됩니다.

a_tag = html.a
link = a_tag['href']
print(link)

https://example.com

이는 attrs 가 고유 한 식별 정보를 제공하지 않기 때문에 <a> 태그를 직접 선택할 수없는 경우 유용합니다. 구문 분석 된 페이지에 다른 "twin" <a> 태그가 있습니다. 그러나 필요한 <a> 가 포함 된 상위 태그를 고유하게 선택할 수 있습니다.

일련의 페이지에서 선택적 요소 및 / 또는 해당 속성 수집

페이지 수를 파싱하고 paticular 페이지의 선택적 요소 (한 페이지에 표시 할 수 있고 다른 페이지에 없을 수도 있음)의 값을 수집하려는 경우를 생각해 봅시다.

또한 예를 들어, 요소 자체는 페이지의 가장 일반적인 요소 입니다. 즉, 특정 특성으로 인해 해당 요소 를 고유하게 찾을 수 없습니다. 그러나 부모 요소를 올바르게 선택할 있고 각 중첩 수준에서 원하는 요소의 순서 번호 를 알고 있음을 알 있습니다.

from bs4 import BeautifulSoup

soup = BeautifulSoup(SomePage, 'lxml')
html = soup.find('div', class_='base class') # Below it refers to html_1 and html_2

원하는 요소는 선택 사항이므로 html 에 대한 2 가지 상황이있을 수 있습니다.

html_1 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
  <div>!Needed text!</div>  # №3
</div>

<div>Confusing div text</div>  # №4
'''
        
html_2 = '''
<div class="base class">    # №0
  <div>Sample text 1</div>  # №1
  <div>Sample text 2</div>  # №2  
</div>

<div>Confusing div text</div>  # №4
'''

html_1 이 있으면 수집 할 수 있습니다 !Needed text! 태그 №3에서 이런 식으로 :

wanted tag = html_1.div.find_next_sibling().find_next_sibling() # this gives you whole tag №3

처음에는 №1 div 얻은 다음 2 번은 같은 중첩 수준에서 다음 div 로 №3으로 전환합니다.

wanted_text = wanted_tag.text # extracting !Needed text!

이 접근법의 유용성은 html_2 를 얻을 때 발생합니다. 접근 방식으로 오류가 발생하지 않으면 None .

print(html_2.div.find_next_sibling().find_next_sibling())
None

여기에서 find_next_sibling() 사용하는 것은 중첩 수준에 따라 요소 검색을 제한하기 때문에 중요합니다. find_next() 를 사용하면 №4 태그가 수집되어 원하지 않습니다.

print(html_2.div.find_next().find_next())
<div>Confusing div text</div>

또한 find_previous_sibling()find_previous() 를 탐색하여 정반대로 사용할 수 있습니다.

설명 된 모든 함수에는 첫 번째 태그뿐만 아니라 모든 태그를 포착하기위한 여러 가지 변형이 있습니다.

find_next_siblings()
find_previous_siblings()
find_all_next()
find_all_previous()


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow