2015-01-04 98 views
1

最近我試圖從網頁解析HTML表使用lxmlrequests解析使用lxml和請求與python

的Python代碼運行是這樣的:

>>> from lxml to html 
>>> import requests 
>>> page = requests.get('http://www.bigpaisa.com/candlestick-stock-screener-result/nse/bearish-evening-star-candlestick-pattern') 
>>> tree = html.fromstring(page.text)' 

然後我想用lxml.xpath()函數獲取列表來解析以下重複數據塊:

<TR> 
    <TD style="font-size: 11px;"><!-- <a href="/company-technical-details/<%=sr.getExchange()%>/<%=sr.getSymbol()%>/<%=sr.getName()%>" ><%= sr.getSymbol() %></a> --> 
        AMTEKINDIA   </TD> 
    <TD style="font-size: 11px; max-width: 135px;">AMTEK INDIA LIMITED</TD> 
    <TD>    nse   </TD> 
    <TD style="min-width: 60px; max-width: 60px;">02-01-2015</TD> 
    <TD>78</TD> 
    <TD>78.3</TD> 
    <TD>72.25</TD> 
    <TD>73.9</TD> 

但未能如願得到一個錯誤,例如:

>>> symbol=tree.xpath('//TD[@style="font-size: 11px;"][@!-- [@a href="/company-t 
echnical-details/[@%=sr.getExchange()%]/[@%=sr.getSymbol()%]/[@%=sr.getName()%]" 
][@%= sr.getSymbol() %][@/a] --]/text()') 

給出Xpath評估錯誤和

>>> prices=tree.xpath('//TD/text()') 

返回沒有值的列表。

+1

'from lxml to html' is not valid Python。你的意思是'從lxml導入html'嗎? – 2015-01-04 15:09:08

回答

2

您感興趣的行在<table>之內,ID爲sortable

from lxml import html 

url = 'http://www.bigpaisa.com/candlestick-stock-screener-result/nse/bearish-%20evening-star-candlestick-pattern' 
doc = html.parse(url) 

# you can use XPath to select elements... 
rows = doc.xpath("//table[@id = 'sortable']/tbody/tr") 

# or, if you prefer, use CSS selectors instead... 
rows = doc.cssselect("table#sortable tbody tr") 

for tr in rows: 
    # do something with each tr, for example 
    tds = tr.cssselect("td") 
    print tds[4].text 

請注意,根本不需要requests模塊。

+0

看起來,頁面聲明瞭一個默認的XHTML命名空間,你需要在路徑表達式中考慮到 - 如果我沒有弄錯的話? – 2015-01-04 15:11:12

+0

不像'lxml.html'解析器看起來,我測試了這個代碼,它的工作原理。 – Tomalak 2015-01-04 15:14:29

+1

我看到 - HTML解析器只是忽略名稱空間。 [「還要注意,HTML解析器是爲了解析HTML文檔,對於XHTML文檔,請使用XML解析器,它是可識別名稱空間的。」](http://lxml.de/parsing.html#parsing-html)。 – 2015-01-04 15:18:56