2015-12-23 2 views
2

Я новичок в программировании и python. Но я хочу разобрать HTML в моем скрипте python.Как выбрать конкретную таблицу веб-страницы с помощью Python

Вот это веб-страница: http://stock.finance.sina.com.cn/hkstock/finance/00759.html

Вопрос 1:

Эта страница о финансовой информации определенной доли. Эти четыре таблицы о:

  1. сводные финансовые показатели,
  2. Баланс,
  3. Cash Flow
  4. о прибылях и убытках.

И я хочу, чтобы извлечь информацию из таблицы 3 & 4. Вот мой код:

import urllib 
from bs4 import BeautifulSoup 

url = 'http://stock.finance.sina.com.cn/hkstock/finance/00759.html' 

html = urllib.urlopen(url).read() #.read() mean read all into a string 
soup = BeautifulSoup(html, "lxml") 

table = soup.find("table", { "class" : "tab05" }) 
for row in table.findAll("tr"): 
    print row.findAll("td") 

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

Вопрос 2:

Кроме того, это упрощает китайский веб-страницы, как сохранить оригинал текст на выходе?

Вопрос 3:

В правом верхнем углу каждой таблицы, есть выпадающее меню для выбора присвоенного периода, а именно: «Все», «Весь год», «Полгода», «Первый квартал» и «Третий квартал». Может ли urllib изменить это выпадающее меню?

спасибо.

ответ

1

Согласно веб-сайту, все четыре таблицы имеют имя класса «tab05».

Таким образом, все, что вам нужно сделать, это просто изменить метод .find на .findAll на var soup, после чего можно будет получить доступ к любой из четырех таблиц.

import urllib 
from bs4 import BeautifulSoup 

url = 'http://stock.finance.sina.com.cn/hkstock/finance/00759.html' 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html, "lxml") 

tables = soup.findAll("table", { "class" : "tab05" }) 
print len(tables) #4 

for table in tables: 
    for row in table.findAll("tr"): 
     for col in row.findAll("td"): 
      print col.getText() 

Что касается кодирования упрощать китайском, print col.getText() получат правильные слова на терминале. Если вы хотите записать их в файл, вам нужно закодировать строку до gb2312.

f.write(col.getText().encode('gb2312')) 

Для 3-я вопроса, так как данные визуализируются функцией яваскрипта написанной в datatable.js, я думаю, что это не возможно, чтобы получить все из них просто URLLIB. Лучше проверить другую библиотеку, чтобы найти подходящее использование.

+0

Спасибо. Возможно, я неправильно понимаю ваш смысл. Я переписываю код, но я не могу получить всю информацию из этой таблицы. Последняя цифра, полученная от этого кода, составляет «-45.7852», что составляет только половину этой таблицы. – Seelfun

+0

Это странно ... Шахта показывает, что >>> table = soup.findAll ("table", {"class": "tab05"}) >>> len (table) >>> 4 – Rick

+0

Пожалуйста, запустите html = urllib .urlopen (url) .read() снова, чтобы убедиться, что это не проблема подключения. – Rick

0

Спасибо за ваш ответ. Возможно, я неправильно понимаю ваш смысл. Я переписать код следующим образом:

tables = soup.findAll("table", { "class" : "tab05" }) 

print len(tables) 

for row in tables[0].findAll("tr"): 
    for col in row.findAll("td"): 
     print col.getText() 

Результат «LEN (таблицы)» 1. Только первая таблица может быть доступна. Кроме того, я обнаружил, что если я использую

for row in tables[0].findAll("tr"): 
    for col in row.findAll("td"): 

Я не могу получить всю информацию этой таблицы. Последняя цифра, полученная от этого кода, составляет «-45.7852», что составляет только половину этой таблицы.

Смежные вопросы