Разобрать различные элементы из одного класса, используя BeautifulSoup - PullRequest
0 голосов
/ 23 января 2020

Предыстория: у меня довольно большой опыт работы с Python, но в целом Noob с BeautifulSoup

Я пытаюсь получить 3 значения из одного класса. Страница, с которой я работаю, имеет ряд элементов, которые выглядят следующим образом:

<blockquote>
<a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.
<a name="title2".... etc
</blockquote>

В настоящее время я просто выгружаю весь текст в список следующим образом:

page_html = soup(page, 'html.parser')

text = []
for a in page_html.select('a'):
    text.append(a.text)

И это возвращает результат, в котором каждая строка выглядит следующим образом:

Title Subtitle: Top Text. Body Text.

Что мне действительно нужно, так это возможность разбирать каждый a в строку в кадре данных, который выглядит примерно так:

col1      col2                    col3
Title     Subtitle: Top Text.     Body Text.

Но, честно говоря, я немного над головой.

Спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2020

Если все ваши <a> теги одинаковы, вы можете использовать это:

from bs4 import BeautifulSoup

import pandas as pd


page = '''<blockquote>
<a name="title"><p><B>Title</b> <table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue"><tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font></td></tr></table> Body Text.</blockquote>
'''
soup = BeautifulSoup(page, "html.parser")



text = []


for texts in soup.find_all('a'):
    paragraph = texts.find('p')

    title = texts.find('b').text
    subtitle = texts.find_all('b')[1].text
    other = ''.join(paragraph.find_all(text=True, recursive=False))

    d = {'col1': [title], 'col2': [subtitle],'col3' : [other]}
    df = pd.DataFrame(data=d)


print(df)

ВЫХОД:

   col1                 col2          col3
0  Title  Subtitle: Top Text.    Body Text.
1 голос
/ 23 января 2020

Используя только сегмент HTML, которым вы поделились:

from bs4 import BeautifulSoup

content = '<a name="title"><p><B>Title</b> ' \
          '<table frame="hsides" border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue">' \
          '<tr><td><font face="arial" size="2" color="#0000CC"><b><I>Subtitle</I>: Top Text.</b></font>' \
          '</td></tr></table> Body Text.'

soup = BeautifulSoup(content, 'html.parser')
articles = soup.find_all('a')

for article in articles:
    paragraph = article.find('p')
    print({
        'title': article.find('b').text,
        'subtitle': article.select('table i')[0].text,
        'body': ''.join(paragraph.find_all(text=True, recursive=False))
    })

Поскольку вопрос в основном о BeautifulSoup, а не о Pandas, я решил, что словаря должно быть достаточно, и вы можете получить Вы сами помещаете его в фрейм данных или другую структуру данных?

Результат:

{'title': 'Title', 'subtitle': 'Subtitle', 'body': '  Body Text.'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...