2012-11-29 4 views
0

URL이 http://www.smartmoney.com/quote/FAST/?story=financials&timewindow=1&opt=YB&isFinprint=1&framework.view=smi_emptyView 인 경우 전체 데이터 행의 내용을 어떻게 캡처하고 인쇄합니까?Python/lxml/Xpath : 특정 텍스트가 포함 된 행을 찾으려면 어떻게해야합니까?

예를 들어, 다음과 비슷한 출력을 얻으려면 무엇이 필요합니까? "현금 & 단기 투자 144,841 169,760 189,252 86,743 57,379"? 또는 "Property, Plant & 장비 - 총 725,104 632,332 571,467 538,805 465,493"과 같은 것입니까?

나는 Xpath의 기초 인 http://www.techchorus.net/web-scraping-lxml을 소개 받았다. 그러나 Xpath 구문은 여전히 ​​나에게 수수께끼입니다.

나는 이미 BeautifulSoup에서이 작업을 성공적으로 마쳤습니다. 나는 BeautifulSoup이 파일의 구조를 알 필요가 없다는 것을 좋아합니다. 검색하는 텍스트가 포함 된 요소를 찾습니다. 불행히도 BeautifulSoup는 수천 번이 작업을 수행해야하는 스크립트에는 너무 느립니다. BeautifulSoup로 내 작업에 대한 소스 코드는 (title_input 같음 "현금 & 단기 투자"로)입니다 :

page = urllib2.urlopen (url_local) 
    soup = BeautifulSoup (page) 
    soup_line_item = soup.findAll(text=title_input)[0].parent.parent.parent 
    list_output = soup_line_item.findAll('td') # List of elements 

그래서 LXML에 해당하는 코드는 무엇을 할 것인가?

편집 1 : 처음 게시했을 때 URL이 숨겨졌습니다. 나는 그것을 고쳤다.

편집 2 : 내가하려는 일을 명확히하기 위해 BeautifulSoup 기반 솔루션을 추가했습니다.

EDIT 3 : +10 솔루션에 대한 루트. 같은 질문 미래 개발자의 이익을 위해, 나는 여기에 나를 위해 일한 더러운 빠른 및 스크립트 게시하도록하겠습니다 :

#!/usr/bin/env python 
    import urllib 
    import lxml.html 

    url = 'balancesheet.html' 

    result = urllib.urlopen(url) 
    html = result.read() 


    doc = lxml.html.document_fromstring(html) 
    x = doc.xpath(u'.//th[div[text()="Cash & Short Term Investments"]]/following-sibling::td/text()') 
    print x 

답변

1
In [18]: doc.xpath(u'.//th[div[text()="Cash & Short Term Investments"]]/following-sibling::td/text()') 
Out[18]: [' 144,841', ' 169,760', ' 189,252', ' 86,743', ' 57,379'] 

를하거나하여 행을 얻을 수있는 약간의 기능을 정의 할 수 있습니다 텍스트 :

In [19]: def func(doc,txt): 
    ...:  exp=u'.//th[div[text()="{0}"]]'\ 
    ...:   u'/following-sibling::td/text()'.format(txt) 
    ...:  return [i.strip() for i in doc.xpath(exp)] 

In [20]: func(doc,u'Total Accounts Receivable') 
Out[20]: ['338,594', '270,133', '214,169', '244,940', '236,331'] 

또는 당신은 dict에 모든 행을 얻을 수 있습니다 :

In [21]: d={} 

In [22]: for i in doc.xpath(u'.//tbody/tr'): 
    ...:  if len(i.xpath(u'.//th/div/text()')): 
    ...:   d[i.xpath(u'.//th/div/text()')[0]]=\ 
    ...:   [e.strip() for e in i.xpath(u'.//td/text()')] 

In [23]: d.items()[:3] 
Out[23]: 
[('Accounts Receivables, Gross', 
    ['344,241', '274,894', '218,255', '247,600', '238,596']), 
('Short-Term Investments', 
    ['27,165', '26,067', '24,400', '851', '159']), 
('Cash & Short Term Investments', 
    ['144,841', '169,760', '189,252', '86,743', '57,379'])] 
+0

+10 당신을 돕기 위해 파이어 폭스에서

PSInstall의의 XPath cheker 또는 firefinder 일을해야하지 : HTML은 HTML 소스 코드를 보유하고 doc.xpath를 (U './/th[div[text()="Cash & Short Term Investments']]/다음 형제 자매 : : td/text() ') – jhsu802701

0

하자

import lxm.html 
doc = lxml.html.document_fromstring(html) 
rows_element = doc.xpath('/html/body/div/div[2]/div/div[5]/div/div/table/tbody/tr') 
for row in rows_element: 
    print row.text_content() 

테스트하지만, 명령에 대한 XPath는

관련 문제