如何找到一个非常深层嵌套的A HREF让我的蜘蛛找到NEXT按钮?

时间:2018-04-05 22:48:59

标签: css xpath web-scraping scrapy scrapy-spider

我正在制作我的第二只蜘蛛,我发现这个特殊的结构对我来说非常复杂,我希望你能帮助我。

我有这个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;?

谢谢!

3 个答案:

答案 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

看看它是否一致。