Как извлечь конкретную <td>из таблицы - PullRequest
0 голосов
/ 03 сентября 2018

Я работаю над программой очистки веб-страниц, использующей Python & BeautifulSoup. Я столкнулся с проблемой при очистке таблицы.

Моя проблема в том, что мне нужно извлечь только выбранные <td> теги, а не всю таблицу.

Мне нужны только цифры для 52-недельного максимума, 52-недельного минимума, прибыли на акцию и цены для балансовой стоимости.

Могу ли я это сделать в любом случае?

Таблица образцов

<table id="TABLE_1">
  <tbody id="TBODY_2">
    <tr id="TR_3">
      <td id="TD_4">
        <strong id="STRONG_5">52-Week High:</strong>
      </td>
      <td id="TD_6">
        1,116.00
      </td>
      <td id="TD_7">
        <strong id="STRONG_8">Earnings Per Share TTM (EPS):</strong>
      </td>
      <td id="TD_9">
        47.87 (15.57%)
      </td>
      <td id="TD_10">
        <strong id="STRONG_11">Price to Book Value (P/BV):</strong>
      </td>
      <td id="TD_12">
        2.5481125565
      </td>
    </tr>
    <tr id="TR_13">
      <td id="TD_14">
        <strong id="STRONG_15">52-Week Low:</strong>
      </td>
      <td id="TD_16">
        867.50
      </td>
      <td id="TD_17">
        <strong id="STRONG_18">Price-Earnings Ratio TTM (P/E):</strong>
      </td>
      <td id="TD_19">
        20.8272404429
      </td>
      <td id="TD_20">
        <strong id="STRONG_21">Return on Equity (ROE):</strong>
      </td>
      <td id="TD_22">
        12.42%
      </td>
    </tr>
    <tr id="TR_23">
      <td id="TD_24">
        <strong id="STRONG_25">Fair Value:</strong>
      </td>
      <td id="TD_26">
        -
      </td>
      <td id="TD_27">
        <strong id="STRONG_28">Dividends Per Share (DPS):</strong>
      </td>
      <td id="TD_29">
        -
      </td>
      <td id="TD_30">
        <strong id="STRONG_31">Recommendation:</strong>
      </td>
      <td id="TD_32">
        None<span id="SPAN_33"></span>
      </td>
    </tr>
    <tr id="TR_34">
      <td id="TD_35">
        <strong id="STRONG_36">Last Price:</strong>
      </td>
      <td id="TD_37">
        <span id="SPAN_38"></span> <span id="SPAN_39">984.5</span>
      </td>
    </tr>
  </tbody>
</table>

Я также показал свои коды для справки.

Любая помощь будет принята с благодарностью! Спасибо!

from bs4 import BeautifulSoup as soup
from urllib.request import Request, urlopen
import pandas as pd

myurl = "https://www.investagrams.com/Stock/ac"
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(myurl,headers=hdr)

# Open connection to website
uClient = urlopen(req)

# Offloads the content to variable
page_html = uClient.read()

#just closing it
uClient.close()

# html parser
page_soup = soup(page_html, "html.parser")

table = page_soup.find("div", {"id":"FundamentalAnalysisPanel"}).find("table")

print(table.text)

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете сделать это методом findNextSibling.

import requests
from bs4 import BeautifulSoup

r = requests.get('https://www.investagrams.com/Stock/ac')
soup = BeautifulSoup(r.text)

# specify table parameters for which you want to find values
parameters = ['52-Week High:', '52-Week Low:', 'Earnings Per Share TTM (EPS):', 'Price-Earnings Ratio TTM (P/E):', 'Price to Book Value (P/BV):']

# iterate all <td> tags and print text of the next sibling (with value),
# if this <td> contains specified parameter.
for td in soup.findAll('td'):
     for p in parameters:
         if td.find('strong', text=p) is not None:
             print(td.findNextSibling().text.strip())

Результат:

1,116.00
47.87 (15.57%)
2.5481125565
867.50
20.8272404429
0 голосов
/ 03 сентября 2018

Это может быть то, что вы хотите

    page_soup = soup(req.data.decode('utf-8'))

    #tables = page_soup.find_all('table')
    tables = page_soup.find_all('td')

    df = pd.read_html(str(tables[i]))

где i таблица, которую вы хотите

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