BeautifulSoup - получить атрибуты div'а, над которым я перебираю - PullRequest
0 голосов
/ 01 марта 2019

Я использую BeautifulSoup для разбора списков компаний с сайтов ВК.Я нашел правильные элементы для итерации, но я не могу получить данные о самих этих элементах.

Вот пример HTML-кода, через который я прохожу:

<div id="content" class="site-content">
    <main id="primary" class="content-area" role="main">
        <header class="page-header">
        <main id="portfolio-landing-company-list" class="page-content">
            <section id="portfolio__list--grid" class="portfolio__list--all">
            <div class="company company-stage--venturegrowth company-type--enterprise company--single-company">
                    <div class="company__thumbnail company__thumbnail-link">
                        <a href="http://www.domain1.com" title="Company1" target="_blank">
                    </div>      
            </div>
            <div class="company company-stage--seed company-type--bio company--single-company">
                    <div class="company__thumbnail company__thumbnail-link">
                        <a href="http://www.domain2.com" title="Company2" target="_blank">
                    </div>
            </div>

Вот как я сейчас использую BeautifulSoup и эта часть прекрасно работает :

portfolio = soup.find('div', attrs={'class': 'portfolio-tiles'})
for eachco in portfolio.find_all('article'):
  companyname = eachco.a['title']
  companyurl = eachco.a['href']

Но я хочу взять отсюда элементы класса :

<div class="company company-stage--venturegrowth company-type--enterprise company--single-company">
or
<div class="company company-stage--seed company-type--bio company--single-company">

(для каждой компании в списке несколько вариантов)

Я пробовал перебирать с помощью:

portfolio = soup.find('div', attrs={'class': 'portfolio-tiles'})
for eachco in portfolio.find_all('article'):
  companyattributes = eachco.div['class']

, но это выплевывает строкииз:

['company__thumbnail', 'company__thumbnail-link']

(он же, уровень ниже того, что я ищу)

Как я могу перебрать все результаты, но получить элементы класса для каждого результата? Я чувствую, что упускаю что-то действительно простое, но был бы признателен за любую помощь в выяснении, что это за вещь!

ОБНОВЛЕНИЕ

Я закончил тем, что пошел сследующий, который заставил все работать вместе:

portfolio = soup.find_all('div', class_=re.compile("company company-"))
    for eachco in portfolio:
        coname = eachco.a['title']
        courl = eachco.a['href']
        cotypes = eachco['class']
        costage = cotypes[1]
        comarket = cotypes[2]

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю это то, что вы ищете:

for i in range(len(soup)):
     print(soup.select('div[class*="stage"]')[i].attrs['class'])

Вывод

   ['company', 'company-stage--venturegrowth', 'company-type--enterprise', 'company--single-company']
   ['company', 'company-stage--seed', 'company-type--bio', 'company--single-company']y--single-company']
0 голосов
/ 01 марта 2019

Вы можете использовать модуль re для поиска определенного текста в элементе класса.

from bs4 import BeautifulSoup
import re
html = """<html><div id="content" class="site-content">
    <main id="primary" class="content-area" role="main">
        <header class="page-header">
        <main id="portfolio-landing-company-list" class="page-content">
            <section id="portfolio__list--grid" class="portfolio__list--all">
            <div class="company company-stage--venturegrowth company-type--enterprise company--single-company">
                    <div class="company__thumbnail company__thumbnail-link">(
                        <a href="http://www.domain1.com" title="Company1" target="_blank">
                    </div>
            </div>
            <div class="company company-stage--venturegrowth company-type--enterprise company--single-company">
                    <div class="company__thumbnail company__thumbnail-link">
                        <a href="http://www.domain2.com" title="Company2" target="_blank">
                    </div>
            </div> </html>"""

soup = BeautifulSoup(html, 'html.parser')
divs = soup.find_all('div' ,class_=re.compile("stage"))
for div in divs:
    print(div['class'])

Вывод:

[u'company', u'company-stage--venturegrowth', u'company-type--enterprise', u'company--single-company']
[u'company', u'company-stage--venturegrowth', u'company-type--enterprise', u'company--single-company']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...