【问题标题】:Python: Scrapy returning all html following element instead of just html of elementPython:Scrapy返回所有html后面的元素,而不仅仅是元素的html
【发布时间】:2021-09-30 21:06:26
【问题描述】:

我遇到了 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 多个模块中使用了此功能,并且不想冒险通过硬编码这样的解决方案来破坏这些功能。我需要了解为什么函数的输出发生了变化,尽管源代码没有改变。

编辑:

下面的每个 cmets,这正是我输入控制台以产生此结果的内容。请让我知道如果其他人无法复制,我如何开始诊断为什么会发生这种情况。我正在使用 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']

【问题讨论】:

  • 首先检查您在response.page_source 中的内容,因为问题可能是HTML
  • 当你使用response.page_source时使用sleep()是没用的
  • 我无法重现此问题。更好地展示我们可以复制和运行的最小工作代码。并使用会产生问题的真实 URL。
  • 当我在 HTML 中使用 &amp;lt;/div&gt; 而不是 &lt;/div&gt; 时,我可以获得类似的结果(但不一样)。浏览器可以将其显示为&lt;/div&gt;,但对于选择器,它不是&lt;/div&gt;,因此它会一直显示到 HTML 的末尾。
  • 我添加了一个编辑,其中包含我为产生问题所采取的确切步骤。

标签: python html scrapy


【解决方案1】:

在全新安装 Anaconda 后问题似乎已得到解决。不知道是什么导致它首先出现,希望它不会再次发生。

【讨论】:

    【解决方案2】:

    我在使用 MacOS、Anaconda、Python 3.7 和 Scrapy 2.4.1 时遇到了类似的问题。我发现使用 Python 3.9 和 Scrapy 2.5.0 创建一个新的 Conda 环境可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2012-10-08
      • 2022-01-20
      • 2019-06-26
      相关资源
      最近更新 更多