Beautifulsoup вытягивает округленные десятичные дроби (что видно) из таблицы, а не фактические значения ячеек - PullRequest
0 голосов
/ 08 февраля 2019

Попытка извлечь данные из таблицы веб-страниц.Данные, отображаемые на странице, представляют собой округленные 3 десятичных знака, но фактические значения ячеек - 4 десятичных знака.Мне нужно полное, округленное число.

Мой цикл:

for i in range(0,20):
    soup = BeautifulSoup(html_source,'lxml')
    table = soup.find_all('table')[i]
    df = pd.read_html(str(table))
    print(region,i)
    print( tabulate(df[0], headers='keys', tablefmt='psql') )

Элемент веб-страницы:

 <span class="price-data " data-amount="{&quot;regional&quot;: 
 {&quot;asia-pacific-east&quot;:0.022,&quot;japan- 
 east&quot;:0.0176,&quot;japan-west&quot;:0.0206,&quot;us- 
 west&quot;:0.0164,&quot;us-west-2&quot;:0.0144,&quot;us-west- 
 central&quot;:0.018,&quot;west-india&quot;:0.0193}}" data-decimals="3" 
 data-decimals-force="3" data-month-format="{0}/month" data-hour-format=" 
 {0}/hour" data-region-unavailable="N/A" data-has-valid- 
 price="true">$0.018/hour</span>

Мой код отображает 0.018/hour, и мне нужно, чтобы он отображал 0.0176/hour.

Примечание: это для Японии-Востока (в выборочных данных также есть Япония-Запад).

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы также можете исправить JSON, как показано, и использовать следующее

from bs4 import BeautifulSoup
import json
html = '''<span class="price-data " data-amount="{&quot;regional&quot;: 
     {&quot;asia-pacific-east&quot;:0.022,&quot;japan- 
     east&quot;:0.0176,&quot;japan-west&quot;:0.0206,&quot;us- 
     west&quot;:0.0164,&quot;us-west-2&quot;:0.0144,&quot;us-west- 
     central&quot;:0.018,&quot;west-india&quot;:0.0193}}" data-decimals="3" 
     data-decimals-force="3" data-month-format="{0}/month" data-hour-format=" 
     {0}/hour" data-region-unavailable="N/A" data-has-valid- 
     price="true">$0.018/hour</span>'''

soup = BeautifulSoup(html,'lxml')
items = soup.select('span.price-data')
for item in items:
    if item.has_attr('data-amount'):
        val = json.loads(item['data-amount'].replace('\n', ' ').replace(' ',''))
        print(val['regional']['japan-east'])
0 голосов
/ 08 февраля 2019

Предполагая, что JSON правильно отформатирован, вы можете извлечь его из атрибута data-amount в <span> следующим образом:

from bs4 import BeautifulSoup
import html
import json

html_text = """<span class="price-data " data-amount="{&quot;regional&quot;:{&quot;asia-pacific-east&quot;:0.022,&quot;japan-east&quot;:0.0176,&quot;japan-west&quot;:0.0206,&quot;us-west&quot;:0.0164,&quot;us-west-2&quot;:0.0144,&quot;us-west-central&quot;:0.018,&quot;west-india&quot;:0.0193}}" data-decimals="3" data-decimals-force="3" data-month-format="{0}/month" data-hour-format="{0}/hour"data-region-unavailable="N/A" data-has-valid-price="true">$0.018/hour</span>"""

soup = BeautifulSoup(html_text, "html.parser")
da = html.unescape(soup.span['data-amount'])
data_amount = json.loads(da)

print(data_amount['regional']['japan-east'])

Что будет отображать:

0.0176
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...