WebScraping с BeautifulSoup или LXML.HTML - PullRequest
0 голосов
/ 31 марта 2011

Я видел несколько веб-трансляций, и мне нужна помощь, чтобы попытаться это сделать: я использовал lxml.html.Yahoo недавно изменила веб-структуру.

целевая страница;

http://finance.yahoo.com/quote/IBM/options?date=1469750400&straddle=true

В Chrome с помощью инспектора: я вижу данные в

 //*[@id="main-0-Quote-Proxy"]/section/section/div[2]/section/section/table

затем еще немного кода

Как вывести эти данные в список.Я хочу перейти на другие акции с "LLY" на "Msft"?
Как переключаться между датами .... И получать все месяцы.

Ответы [ 4 ]

7 голосов
/ 31 марта 2011

Я знаю, вы сказали, что не можете использовать lxml.html. Но вот как это сделать, используя эту библиотеку, потому что это очень хорошая библиотека. Поэтому для полноты я предоставляю код, использующий его, поскольку я больше не использую BeautifulSoup - он не поддерживается, работает медленно и имеет ужасный API.

Приведенный ниже код анализирует страницу и записывает результаты в CSV-файл.

import lxml.html
import csv

doc = lxml.html.parse('http://finance.yahoo.com/q/os?s=lly&m=2011-04-15')
# find the first table contaning any tr with a td with class yfnc_tabledata1
table = doc.xpath("//table[tr/td[@class='yfnc_tabledata1']]")[0]

with open('results.csv', 'wb') as f:
    cf = csv.writer(f)
    # find all trs inside that table:
    for tr in table.xpath('./tr'):
        # add the text of all tds inside each tr to a list
        row = [td.text_content().strip() for td in tr.xpath('./td')]
        # write the list to the csv file:
        cf.writerow(row)

Вот и все! lxml.html так просто и приятно !! Жаль, что ты не можешь использовать это.

Вот несколько строк из сгенерированного файла results.csv:

LLY110416C00017500,N/A,0.00,17.05,18.45,0,0,17.50,LLY110416P00017500,0.01,0.00,N/A,0.03,0,182
LLY110416C00020000,15.70,0.00,14.55,15.85,0,0,20.00,LLY110416P00020000,0.06,0.00,N/A,0.03,0,439
LLY110416C00022500,N/A,0.00,12.15,12.80,0,0,22.50,LLY110416P00022500,0.01,0.00,N/A,0.03,2,50
1 голос
/ 24 октября 2014

Если вам нужен сырой json, попробуйте MSN

http://www.msn.com/en-us/finance/stocks/optionsajax/126.1.UNH.NYS/

Вы также можете указать срок годности ?date=11/14/2014

http://www.msn.com/en-us/finance/stocks/optionsajax/126.1.UNH.NYS/?date=11/14/2014

Если вы предпочитаете Yahoo JSON

http://finance.yahoo.com/q/op?s=LLY

Но вы должны извлечь его из HTML

import re

m = re.search('<script>.+({"applet_type":"td-applet-options-table".+);</script>', resp.content)

data = json.loads(m.group(1))
as_dicts = data['models']['applet_model']['data']['optionData']['_options'][0]['straddles']

Срок действия здесь

data['models']['applet_model']['data']['optionData']['expirationDates']

Конвертировать iso в метку времени Unix как здесь

Затем повторно запросите другие истечения с отметкой времени Unix

http://finance.yahoo.com/q/op?s=LLY&date=1414713600
1 голос
/ 12 апреля 2011

Вот простой пример для извлечения всех данных из фондовых таблиц:

import urllib
import lxml.html
html = urllib.urlopen('http://finance.yahoo.com/q/op?s=lly&m=2014-11-15').read()
doc = lxml.html.fromstring(html)
# scrape figures from each stock table
for table in doc.xpath('//table[@class="details-table quote-table Fz-m"]'):
    rows = []
    for tr in table.xpath('./tbody/tr'):
        row = [td.text_content().strip() for td in tr.xpath('./td')]
        rows.append(row)
    print rows

Затем для извлечения разных акций и дат вам необходимо изменить URL. Вот Msft за предыдущий день: http://finance.yahoo.com/q/op?s=msft&m=2014-11-14

0 голосов
/ 27 октября 2014

Основываясь на ответе @hoju:

import lxml.html
import calendar
from datetime import datetime

exDate  = "2014-11-22"
symbol  = "LLY"
dt      = datetime.strptime(exDate, '%Y-%m-%d')
ym      = calendar.timegm(dt.utctimetuple())

url     = 'http://finance.yahoo.com/q/op?s=%s&date=%s' % (symbol, ym,)
doc     = lxml.html.parse(url)
table   = doc.xpath('//table[@class="details-table quote-table Fz-m"]/tbody/tr')

rows    = []        
for tr in table:
     d = [td.text_content().strip().replace(',','') for td in tr.xpath('./td')]
     rows.append(d)

print rows 
...