Как извлечь значение td из веб-страницы с помощью Python? - PullRequest
0 голосов
/ 19 февраля 2019

Я в значительной степени новичок в Python, но я собираюсь создать инструмент для очистки веб-страниц, который будет извлекать данные из таблицы HTML онлайн и распечатывать их в формате CSV в том же формате.

Я пытаюсь удалить данные с веб-страницы.Но он дает мне пустой массив, хотя в нем есть данные.Как извлечь эти данные?

enter code here

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from urllib.request import urlopen

from bs4 import BeautifulSoup

url = "https://www.forbes.com/global2000/list/#tab:overall"
page = urlopen(url)

soup = BeautifulSoup(page)
text = soup.get_text()
print(soup.prettify())

all_tables=soup.find_all('tbody')
print(all_tables)
right_table=soup.find('tbody',{"class":'list-item-template'})

A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
H=[]
for row in right_table.findAll("tr"):
    cells = row.findAll('td')
    print(len(cells))
    states=row.findAll('th') #To store second column data
    if len(cells)==8: #Only extract table body not heading
        A.append(cells[0].find(text=True))
        # B.append(states[0].find(text=True))
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))
        D.append(cells[3].find(text=True))
        E.append(cells[4].find(text=True))
        F.append(cells[5].find(text=True))
        G.append(cells[6].find(text=True))
        H.append(cells[7].find(text=True))


df=pd.DataFrame(A,columns=['IMAGE'])
df['RANK']=B
df['NAME']=C
df['COUNTRY']=D
df['REVENUE']=E
df['PROFITS']=F
df['ASSETS']=G
print(df)

Я получаю этот вывод:

enter image description here

Ответы [ 2 ]

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

Javascript должен быть запущен для заполнения страницы, и вам может быть предоставлено согласие на использование файлов cookie.Следующие элементы перемещаются по этому адресу и дают время для выполнения различных действий:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

url = 'https://www.forbes.com/global2000/list/#tab:overall'
d = webdriver.Chrome()
d.get(url)
d.switch_to.frame(d.find_element_by_css_selector('[id^="pop-frame"]'))
WebDriverWait(d, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".call"))).click()
element = WebDriverWait(d, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR , '.legalese')))
actions = ActionChains(d)
actions.move_to_element(element).perform()
table = d.find_element_by_css_selector('#the_list')
print(table.text)
0 голосов
/ 19 февраля 2019

У вас проблемы с тем, что ваш HTML не загружается, когда вы пытаетесь его удалить.Вы должны ждать исполнения части JS.Одним из самых простых способов является использование селена и ожидание загрузки страницы

#!/usr/bin/python3
# coding: utf8

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from urllib.request import urlopen

from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait


url = "https://www.forbes.com/global2000/list/#tab:overall"

# Load the javascript part
driver = webdriver.Firefox()
driver.get(url)
time.sleep(10)
html = driver.page_source

soup  = BeautifulSoup(html)

text = soup.get_text()
print(soup.prettify())

all_tables=soup.find_all('tbody')
print(all_tables)
right_table=soup.find('tbody',{"class":'list-item-template'})

A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
H=[]
print(right_table)
for row in right_table.findAll("tr"):
    cells = row.findAll('td')
    print(len(cells))
    states=row.findAll('th') #To store second column data
    if len(cells)==8: #Only extract table body not heading
        A.append(cells[0].find(text=True))
        # B.append(states[0].find(text=True))
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))
        D.append(cells[3].find(text=True))
        E.append(cells[4].find(text=True))
        F.append(cells[5].find(text=True))
        G.append(cells[6].find(text=True))


df=pd.DataFrame(A,columns=['IMAGE'])
df['RANK']=B
df['NAME']=C
df['COUNTRY']=D
df['REVENUE']=E
df['PROFITS']=F
df['ASSETS']=G
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...