我正在制作我的第二只蜘蛛,我发现这个特殊的结构对我来说非常复杂,我希望你能帮助我。
我有这个html页面(请注意,所有不必要的数据都被删除,我只留下了我感兴趣的链接:
<html>
<head>
</head>
<body>
<form>
<div>
</div>
<script>
</script>
<div>
</div>
<script>
</script>
<div>
<div>
</div>
<div>
<div>
<div>
</div>
<div>
</div>
<div>
<div>
</div>
<div>
<div>
</div>
<div>
</div>
<div>
<div>
<div>
<div>
</div>
<div>
<div>
<script>
</script>
<div>
<p></p>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script> <div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<div></div>
<script></script>
<table class="pageTable">
<tr>
<td></td>
<td>
<span></span>
<span></span>
<span></span>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href></a>
<a href="whatever.com" class="wx4">next</a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
(这是实际结构)。
现在,特别是我的需要是我的蜘蛛遵循该链接(在表格内,在3个跨度之后和9个A标签之后)。所有其余的提取逻辑都已完成。
具有讽刺意味的是,除了桌子和我感兴趣之外,没有一个标签有任何类或id。但是由于一些奇怪的原因,当我尝试使用scrapy访问它时,我得到以下结果:
>>> response.css('a.wx4').extract()
[]
>>>
你知道我能做错什么吗? 是因为它在&lt;&lt; td&gt;以及一堆&lt; a&gt;,嵌套在&lt; tr&gt;,&lt;表&gt;,很多&lt; div>和一个&lt;表格&gt;?
谢谢!
答案 0 :(得分:0)
此XPath将找到最后一个锚元素:
response.selector.xpath('//a[last()]').extract()
你也可以用课程
来限定它response.selector.xpath('//a[@class='wx4']').extract()
如果该课程可能不止一个,请抓住最后一个:
response.selector.xpath('//a[@class='wx4'][last()]').extract()
答案 1 :(得分:0)
//a[@class='wx4' and text()='next']
这将搜索一个用类&#34; wx4&#34;设置样式的链接。它的文字是&#34; next&#34;。
答案 2 :(得分:0)
也许你应该检查一下网页,看看它是否必须首先被粉碎:
scrapy shell your_url
response.body
检查它是否与您从浏览器获得的源代码一致。如果没有,请使用scrapinghub / splash。首先下载并配置docker,然后执行:
pip install scrapy_splash
sudo docker pull scrapinghub/splash
sudo docker run -p 8050:8050 -p 8051:8051 scrapinghub/splash
在您的终端。
然后在新终端中使用scrapy shell
。
然后写入lua_script for splash来执行js以转到页面底部,如:
lua_script = '''
function main(splash)
splash:go(splash.args.url)
splash:wait(2)
splash:runjs("your_javascript")
splash:wait(2)
return splash:html()
end
'''
并且:
import json
import requests
splash_url = 'http://localhost:8050/execute'
headers = {'content-type': 'application/json'}
data = json.dumps({'lua_source': lua_script})
response = requests.post(splash_url, headers=headers, data=data)
然后检查:
response.content
看看它是否一致。