我一直在尝试解析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>"
然而,没有其他选择似乎有效。在过去,我用类似的代码(尽管不是来自这个网址!)来删除数据。任何指导都会非常有用。
答案 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
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
,某些网站可能会阻止您。虽然与你目前的问题无关。
感谢。