使用lxml解析html表

时间:2016-09-27 21:27:56

标签: python parsing lxml

我一直在尝试解析here中的表格内容 我尝试了几种替代方案,比如

xpath('//table//tr/td//text()') 
xpath('//div[@id="replacetext"]/table/tbody//tr/td/a//text()')

这是我的最后一段代码:

import requests, lxml.html
url ='https://nseindia.com/products/content/derivatives/equities/fo_underlying_home.htm'
url = requests.get(url)
html = lxml.html.fromstring(url.content)
packages = html.xpath('//div[@id="replacetext"]/table/tbody//tr/td/a//text()') # get the text inside all "<tr><td><a ...>text</a></td></tr>"
然而,没有其他选择似乎有效。在过去,我用类似的代码(尽管不是来自这个网址!)来删除数据。任何指导都会非常有用。

2 个答案:

答案 0 :(得分:0)

在HTML页面中,有一个命名空间:

<html xmlns="http://www.w3.org/1999/xhtml">

所以,你需要指定它:

NSMAP = {'html' : "http://www.w3.org/1999/xhtml"}

path = '//html:div[@id="replacetext"]/html:table/html:tbody//html:tr/html:td/html:a//text()'
packages = html.xpath(path, namespaces=NSMAP)

请参阅http://lxml.de/xpathxslt.html#namespaces-and-prefixes

解释Ajax调用

import requests
from lxml import html

base_url = 'https://nseindia.com'

# sumulate the JavaScript
url = base_url + "/products/content/derivatives/equities/fo_underlyinglist.htm"
url = requests.get(url)
content = url.content
# -> <table>
#    <tr><th>S. No.</td>
#    <th>Underlying</td>
#    <th>Symbol</th></tr>
#    <tr>
#    <td style='text-align: right;' >1</td>
#    <td class="normalText" ><a href=fo_INDIAVIX.htm>INDIA VIX</a></td>
#    <td class="normalText" ><a href="/products/dynaContent/derivatives/equities/fomwatchsymbol.jsp?key=INDIAVIX">INDIAVIX</a></td>
#    </tr>
#    ...

html = html.fromstring(content)
packages = html.xpath('//td/a//text()')
# -> ['INDIA VIX',
#     'INDIAVIX',
#     'Nifty 50',
#     'NIFTY',
#     'Nifty IT',
#     'NIFTYIT',
#     'Nifty Bank',
#     'BANKNIFTY',
#     'Nifty Midcap 50',

答案 1 :(得分:0)

我试过你的代码。问题不是由lxml引起的。这是由您加载网页的方式引起的。

我知道您使用requests来获取网页内容,但是,您从requests获得的内容可能与您在浏览器中看到的内容不同。

在此页面中,&#39; https://nseindia.com/products/content/derivatives/equities/fo_underlying_home.htm&#39;,打印request.get的内容,您会发现此页面的源代码不包含任何表格!该表由ajax查询加载。

所以找到一种方法来加载“真的”#39;你想要的页面,你可以使用&#39; lxml`。

顺便说一句,在网页抓取中,您还需要提及一些内容,例如request headers。在执行http请求时设置请求标头是一种很好的做法。如果您在标头中未提供合理的User-Agent,某些网站可能会阻止您。虽然与你目前的问题无关。

感谢。