我遇到了 Scrapy 行为异常的问题。
几个月前我编写了一个简单的函数,它返回给定 xpath 处的项目列表。
def get_html(response,path):
sel = Selector(text = response.page_source)
time.sleep(.2)
items = sel.xpath(path).getall()
return items
使用示例:
<body>
<div id="1">Some Text</div>
<div id="2">Different Text</div>
<a href="#">Some link</a>
</body>
如果我想获取所有 div 元素,我会这样写:
get_html(response,'//div')
我期望并且之前已收到此输出
['<div id="1">Some Text</div>',
'<div id="2">Different Text</div>']
但是,现在当我调用这个方法时,我收到这个输出
['<div id="1">Some Text</div><div id="2">Different Text</div><a href="#">Some link</a></body>',
'<div id="2">Different Text</div><a href="#">Some link</a></body>']
问题不是由于我正在抓取的网页发生了更改,我在最初抓取时保存了源代码,它与我今天在网页上看到的源代码相同。我尝试抓取的多个网站都存在此问题。我不确定问题是什么,或者如何解决它。我要么需要解决问题,要么用另一个行为相同的函数替换该函数。
我知道有一些方法可以分割字符串并删除不需要的数据,但是我已经在 100 多个模块中使用了这个函数,并且不想冒险通过硬编码这样的解决方案来破坏这些功能。我需要理解为什么函数的输出发生了变化,尽管源代码没有任何变化。
Edit:
根据下面的评论,这正是我在控制台中输入的内容以产生此结果。如果其他人无法重现这种情况,请让我知道如何开始诊断为什么会发生这种情况。我使用的是 Spyder 版本 4.2.5、Python 3.8.5、Scrapy 2.4.1。
In[1]: from scrapy.selector import Selector
In[2]: text = """<body>
<div id="1">Some Text</div>
<div id="2">Different Text</div>
<a href="#">Some link</a>
</body>"""
In[3]: sel = Selector(text=text)
In[4]: items = sel.xpath('//div').getall()
In[5]: items
Out[5]:
['<div id="1">Some Text</div>\n <div id="2">Different Text</div>\n <a href="#">Some link</a>\n </body></html>\n',
'<div id="2">Different Text</div>\n <a href="#">Some link</a>\n </body></html>\n']