Python/lxml/Xpath:如何找到包含特定文本的行?

2024-10-01 11:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

给定URL http://www.smartmoney.com/quote/FAST/?story=financials&timewindow=1&opt=YB&isFinprint=1&framework.view=smi_emptyView,如何捕获和打印整行数据的内容?在

例如,要获得一个类似以下内容的输出,需要什么 “现金和短期投资144841 169760 189252 86743 57379”?或者类似“物业、厂房和设备-总价值725104 632332 571467 538805 465493”?在

我已经通过siteshttp://www.techchorus.net/web-scraping-lxml介绍了Xpath的基本知识。然而,Xpath语法对我来说仍然是个谜。在

我已经成功地完成了这个任务。我喜欢这样一个事实,beauthoulsoup不需要我知道文件的结构-它只查找包含我搜索的文本的元素。不幸的是,beauthulsoup对于一个需要执行数千次的脚本来说太慢了。我在BeautifulGroup中任务的源代码是(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:我第一次发布时,网址被隐藏了。我现在已经修好了。在

编辑2:我添加了基于beauthoulsoup的解决方案,以澄清我要做什么。在

编辑3:+10为您的解决方案添加根目录。为了将来有同样问题的开发人员的利益,我在这里发布了一个对我有用的快速而肮脏的脚本:

^{pr2}$

Tags: 脚本编辑inputtitlewwwlinepageitem
2条回答
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']

也可以定义一个小函数,通过文本获取行:

^{pr2}$

或者,您可以将所有行移到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'])] 

让html保存html源代码:

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()

未经测试,但应该有效

在firefox中安装xpath cheker或firefinder来帮助您使用xpath

相关问题 更多 >