TransWikia.com

Парсинг html таблицы

Stack Overflow на русском Asked on November 22, 2021

Я бы хотел спарсить эти поля в таблице, но у меня никак не получается получить доступ к этой таблице в html – она с большой глубиной вложенности.

введите сюда описание изображения

from bs4 import BeautifulSoup
import requests

res = requests.get('http://bonds.finam.ru/issue/details0256500001/default.asp')
soup = BeautifulSoup(res.text, 'lxml')
print(soup.find('table'))

3 Answers

Вот вариант рабочий, там js подгружается

from requests_html import HTMLSession

session = HTMLSession()
response = session.get('https://bonds.finam.ru/issue/details0256500001/default.asp')
response.html.render()
get_block = response.html.xpath('//*[@id="content-block"]/div/div[2]/table/tbody/tr/td[1]/div/table/tbody/tr[3]/td[2]/text()')
get_block = [ii.strip() for ii in get_block]
print(get_block)

Answered by Борис Бондарев on November 22, 2021

сделал запрос через selenium, через requests почему то две последние строки из таблицы в html нет, видимо js что то мутит там

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://bonds.finam.ru/issue/details0256500001/default.asp')
html = driver.page_source
driver.quit()

soup = BeautifulSoup(html, 'lxml')
div = soup.find('div', class_='datas')
trs = div.find_all('tr')

for tr in trs:
    tds = tr.find_all('td')
    print(tds[1].text.strip())

вывод:

# ООО "Городской супермаркет"
# Общество с ограниченной ответственностью "Городской супермаркет"
# 7705466989
# http://www.azbukavkusa.ru
# Российская Федерация, 113054, г. Москва, ул. Валовая, д. 8/18
# Российская Федерация, 113054, г. Москва, ул. Валовая, д. 8/18
# (495) 504-3787; 504-3477(факс)
# Торговля

Answered by Ildar on November 22, 2021

Дело в том, что сам <table></table> в Python отдается пустым.
Вот так можно сделать словарь, думаю вы разберетесь дальше:

import requests
from bs4 import BeautifulSoup as BS

resp = requests.get('http://bonds.finam.ru/issue/details0256500001/default.asp')
soup = BS(resp.text, 'lxml')
table = soup.find('div', class_='datas').find_all('tr')
result = {}
for tr in table:
    tds = [td.text.replace('xa0', ' ') for td in tr.find_all('td')]
    result[tds[0]] = tds[1]
    
print(result)

Answered by n1tr0xs on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP