Как создать словарь из таблицы с помощью Beautifulsoup? - PullRequest
0 голосов
/ 14 апреля 2020

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

from bs4 import BeautifulSoup
import requests

main_url = "https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html"

req = requests.get(main_url)
soup = BeautifulSoup(req.text, "html.parser")

title = soup.find("div", id = "accordionContent5e95581b6e244")

results = {}
for row in title.findAll('tr'):
     aux = row.findAll('td')
     results[aux[0].string] = aux[1].string

print(results)

Это соответствующий код:

<div id="accordionContent5e95581b6e244" class="panel-collapse collapse in"> 
    <div class="panel-body"> 
        <table class="table" width="100%"> 
            <tbody>
                <tr> 
                    <th width="170">PZN</th>
                    <td>00520917</td> 
                </tr> 
                <tr> 
                    <th width="170">Anbieter</th> 
                    <td>Hexal AG</td>
                </tr>

Мой Цель состоит в том, чтобы извлечь словарь из ячеек th td.

Как это можно сделать в BeautifulSoup?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Я бы предложил использовать pandas для хранения данных в Data Frame, а затем импортировать в dictionary.

import pandas as pd
from bs4 import BeautifulSoup
import requests

main_url = "https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html"

req = requests.get(main_url)
soup = BeautifulSoup(req.text, "html.parser")
table=soup.select_one(".panel-body >table")
df=pd.read_html(str(table))[0]
print(df.set_index(0).to_dict('dict'))

Вывод :

{1: {'Rezeptpflichtig': 'nein', 'Anbieter': 'Hexal AG', 'PZN': '00520917', 'Darreichungsform': 'Brausetabletten', 'Wirksubstanz': 'Acetylcystein', 'Monopräparat': 'ja', 'Packungsgröße': '40\xa0St', 'Apothekenpflichtig': 'ja', 'Produktname': 'ACC akut 600mg Hustenlöser'}}
0 голосов
/ 14 апреля 2020
  1. Первая ошибка: вы используете id, в зависимости от того, хотите ли вы очистить больше страниц.
  2. Вторая ошибка: aux = row.findAll('td') это вернет список из одного элемента, потому что вы не принимаете Принимая во внимание теги th, означающие, что aux[1].string вызовет исключение.

Вот код:

from bs4 import BeautifulSoup
import requests

main_url = "https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html"

req = requests.get(main_url)
soup = BeautifulSoup(req.text, "html.parser")

title = soup.find("div", class_="panel-collapse collapse in")

results = {}
for row in title.findAll('tr'):
    key   = row.find('th')
    value = row.find('td')
    results[key.text] =value.text.strip()
print(results)

Вывод:

{'PZN': '00520917', 'Anbieter': 'Hexal AG', 'Packungsgröße': '40\xa0St', 'Produktname': 'ACC akut 600mg Hustenlöser', 'Darreichungsform': 'Brausetabletten', 'Monopräparat': 'ja', 'Wirksubstanz': 'Acetylcystein', 'Rezeptpflichtig': 'nein', 'Apothekenpflichtig': 'ja'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...