Я хочу найти тег <span>, который находится внутри тега <h1>, который содержит несколько тегов <span>, и получить текст внутри него - PullRequest
0 голосов
/ 15 октября 2019

Что я хочу сделать, это выбрать второй диапазон и захватить его текст, чтобы напечатать его. Ниже приведен HTML-код и код BeautifulSoup

#HTML code

<h1 id="productTitle">
   <a href="https://www.example.com/product/">
       <span id="productBrand">BRAND</span>
   </a>
   <span>PRODUCT TITLE </span>
</h1>
#BeautifulSoup code

for h1 in soup.find_all('h1', id="productTitle"):
    productTitle = h1.find('span').text
    print(productTitle)

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Надеюсь, не всегда, идентификатор должен быть уникальным, значение find_all, вероятно, не требуется.

С bs4 4.7.1+ вы можете использовать: не исключать дочерний диапазон с идентификатором

from bs4 import BeautifulSoup as bs

html = '''<h1 id="productTitle">
   <a href="https://www.example.com/product/">
         <span id="productBrand">BRAND</span>
   </a>
         <span>PRODUCT TITLE </span>
</h1>
'''
soup = bs(html, 'lxml')
print(soup.select_one('#productTitle span:not([id])').text)

Вы также можете nth-child

print(soup.select_one('#productTitle span:nth-child(2)').text)

или

print(soup.select_one('#productTitle span:nth-child(even)').text)

или даже непосредственный братский комбинатор, чтобы получить span после ребенка a

print(soup.select_one('#productTitle a + span').text)

или прикованный next_sibling

print(soup.select_one('#productTitle a').next_sibling.next_sibling.text)
0 голосов
/ 15 октября 2019

Получает все необходимые поля в теге h1:

Код Python:

from bs4 import BeautifulSoup
text = '''
<h1 id="productTitle">
   <a href="https://www.example.com/product/">
         <span id="productBrand">BRAND</span>
   </a>
         <span>PRODUCT TITLE </span>
</h1>
'''
soup = BeautifulSoup(text,features='html.parser')
#BeautifulSoup code

for h1 in soup.find_all('h1', id="productTitle"):
    spans = h1.find_all('span')
    print('productBrand  == > {}'.format(spans[0].text))
    print('productTitle  == > {}'.format(spans[1].text))

Получить все пролеты с помощью h1:

for h1 in soup.find_all('h1', id="productTitle"):
    for i,span in enumerate(h1.find_all('span')):
      print('span {} == > {}'.format(i,span.text))

Демонстрация: Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...