BeautifulSoup и Craiglist — проблемы с получением данных с идентичными атрибутами и структурой

У меня возникли проблемы с очисткой приведенного ниже HTML-кода, так как вся информация хранится в структуре, которая не имеет особых различий.

Я хочу получить место, которое извлекает тег b, содержащийся в теге span, который имеет text = 'VIN:', и тег b, содержащийся в теге span, который имеет text = 'одометр:' и т. д..

</p>
</div>
<p class="attrgroup">
<span><b>2001 PORSCHE 911</b></span>
<br/>
</p>
<p class="attrgroup">
<span>VIN: <b>WP0CA29961S653221</b></span>
<br/>
<span>fuel: <b>gas</b></span>
<br/>
<span>odometer: <b>46000</b></span>
<br/>
<span>paint color: <b>silver</b></span>
<br/>
<span>size: <b>sub-compact</b></span>
<br/>
<span>title status: <b>clean</b></span>
<br/>
<span>transmission: <b>manual</b></span>
<br/>
<span>type: <b>convertible</b></span>
<br/>
</p>
</div>

Я пробовал следующие варианты безрезультатно:

all = soup.find_all('section',{'class':'body'})
for i in all:
    print(i.find_all('span'))

&

all = soup.find_all('section',{'class':'body'})
for i in all:
     print(i.find_all('b'))

&

all = soup.find_all('section',{'class':'body'})
for i in all:
    print(i.find_all('p',{'class':'attrgroup'}))

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

Как мне это успешно сделать?


person ramrod    schedule 12.01.2020    source источник


Ответы (1)


Попробуйте с чем-то подобным:

from bs4 import BeautifulSoup

html = """
</p>
</div>
<p class="attrgroup">
<span><b>2001 PORSCHE 911</b></span>
<br/>
</p>
<p class="attrgroup">
<span>VIN: <b>WP0CA29961S653221</b></span>
<br/>
<span>fuel: <b>gas</b></span>
<br/>
<span>odometer: <b>46000</b></span>
<br/>
<span>paint color: <b>silver</b></span>
<br/>
<span>size: <b>sub-compact</b></span>
<br/>
<span>title status: <b>clean</b></span>
<br/>
<span>transmission: <b>manual</b></span>
<br/>
<span>type: <b>convertible</b></span>
<br/>
</p>
</div>
"""
soup = BeautifulSoup(html,'html.parser')
prefixes = ["VIN", "odometer"]
for n in soup.find_all('p', attrs={'class': 'attrgroup'}):    
   for x in n.find_all('span'):
    if(x.text.startswith(tuple(prefixes))):
      print(x.find('b').text)    

Результат:

WP0CA29961S653221
46000
person GiovaniSalazar    schedule 12.01.2020