Получение значения текста из ячеек таблицы при очистке рекурсивной структуры - PullRequest
0 голосов
/ 09 января 2019

Я ищу функцию, которая дает пару тегов HTML, возвращает текст внутри них. В идеале я хотел бы, чтобы это было рекурсивно:

Примеры:

С учетом

<a href="/wiki/Asset_management" title="It's Asset management">Asset management</a>

возвращает

Asset management

Учитывая

<a href="/wiki/Asset_management" title="Same Asset management"><p>Recursive Asset management</p></a>

возвращает

Recursive Asset management

Учитывая

<p><a href="/wiki/Asset_management" title="Same Asset management">Again Asset management</a></p>

возвращает

Again Asset management
Вот код, который у меня есть:
    list_of_table_rows = tbl.findAll('tr')

    for tr in list_of_table_rows[1:]:

        th_list = tr.find("th")
        td_list = tr.find("td")

        if th_list is None or td_list is None:
            continue



        th_str = th.text
        td_str = td.contents

        # NOW THE PROBLEM IS td_str IS A LIST OF A BUNCH OF THINGS.

        #PLAIN TEXT, BR TAG, LINKS, PARAGRAPHS, ETC.

        #I WANT TO BE ABLE TO GET THAT PLAIN TEXT FOR LINKS AND PARAGRAPHS


        for element in td_str:
           if element == "<br/":
              continue
           # here...

Входные данные должны быть строкой, а не тегом или любым другим объектом. Моя проблема в рекурсии.


ОБНОВЛЕНИЕ: Это пример данных, с которыми я на самом деле работаю. Цель состоит в том, чтобы получить информацию из инфобоксов Википедии. Проблема в том, что часть информации в Infobox - это ссылки или абзацы. Например, на этой странице: https://en.wikipedia.org/wiki/Goldman_Sachs

<tr><th scope="row" style="padding-right:0.5em;">Founders</th><td 
class="agent" style="line-height:1.35em;"><a 
href="/wiki/Marcus_Goldman" title="Marcus Goldman">Marcus Goldman</a> . 
<br /><a href="/wiki/Samuel_Sachs" title="Samuel Sachs">Samuel 
Sachs</a></td></tr><tr>

Допустим, мы хотим выяснить, кто такие Основатели. Я хочу только текст в элементах. В этом случае список, содержащий Маркуса Голдмана и Сэмюэля Сакса. Я также попробовал read_html от Pandas, но он объединяет строки вместе, и я не хочу, чтобы это произошло (вывод «Marcus GoldmanSamuel Sachs»)

1 Ответ

0 голосов
/ 10 января 2019

Вот пример использования .findChildren. Это не полное решение, но вы можете использовать его для добавления в решение @Bitto Bennichan

import bs4

html = '''<tr><th scope="row" style="padding-right:0.5em;">Founders</th><td 
class="agent" style="line-height:1.35em;"><a 
href="/wiki/Marcus_Goldman" title="Marcus Goldman">Marcus Goldman</a> . 
<br /><a href="/wiki/Samuel_Sachs" title="Samuel Sachs">Samuel 
Sachs</a></td></tr><tr>'''

soup = bs4.BeautifulSoup(html,'html.parser')

rows = soup.find_all('tr')

founders = []
for row in rows:
    children = row.findChildren("a" , recursive=True, text=True)
    for child in children:
        child_text = child.text.split('\n')
        child_text = [ x.strip() for x in child_text ]
        child_text = ' '.join(child_text)
        founders.append(child_text)
...