【问题标题】:scrapy xpath select elements by classnamescrapy xpath 按类名选择元素
【发布时间】:2015-01-27 15:53:23
【问题描述】:

我关注了How can I find an element by CSS class with XPath?,它提供了用于按类名选择元素的选择器。问题是当我使用它时,它会检索一个空结果“[]”,我知道事实上在馈送到 scrapy shell 的 url 中有一个分类为“zoomWindow”的 div。

我的尝试:

scrapy shell "http://www.niceicdirect.com/epages/NICShop.sf/secAlIVFGjzzf2/?ObjectPath=/Shops/NICShop/Products/5696"
response.xpath("//*[contains(@class, 'zoomWindow')]")

我查看了许多提供各种选择器的资源。在我的情况下,该元素只有一个类,所以使用“concat”的版本我使用但没有工作并被丢弃。

我在虚拟机中安装了 ubuntu 和 scrapy,只是为了确保这不是我在 windows 上安装的错误,但我在 ubuntu 上的尝试得到了相同的结果。

我不知道还能尝试什么,你能看到选择器中的任何错字吗?

【问题讨论】:

    标签: xpath web-scraping scrapy scrapy-shell


    【解决方案1】:

    如果您检查 shell 中的 response.body - 您会发现它不包含带有 class="zoomWindow" 的元素:

    In [3]: "zoomWindow" in response.body
    Out[3]: False
    

    但是,如果您在浏览器中打开页面并检查 HTML 源代码,您会看到该元素在那里。这意味着页面加载涉及 javascript 逻辑或额外的 AJAX 请求。 Scrapy 不是浏览器,也没有内置的 javascript 引擎。换句话说,它只下载页面的初始 HTML 代码,而无需额外下载 js 和 css 文件并“执行”它们。

    对于初学者,您可以尝试使用scrapyjs 下载处理程序和中间件。


    要提取的图像也可以在img 标记中使用id="PreviewImage"

    In [4]: response.xpath("//img[@id='PreviewImage']/@src").extract()
    Out[4]: [u'/WebRoot/NICEIC/Shops/NICShop/547F/0D9A/F434/5E4C/0759/0A0A/124C/58F7/5708.png']
    

    【讨论】:

    • 这是否意味着在使用了scrapy shell“url”之后,response.body 上并不是所有的网页内容都可用?查看网页上的屏幕截图类外观。
    • @secuaz 你可以这么说,是的。我已经更新了答案,扩展了解释。顺便说一句,你为什么需要这个元素,你想从这个元素中得到什么样的数据?
    • 需要图片,通过css,background-image属性应用于目标元素。
    • @secuaz 更新了答案,这是您要提取的内容吗?谢谢。
    • @secuaz 我刚刚将 response.body 转储到本地 HTML 文件中,并搜索了 divclass="zoomWindow" 中使用的背景图像路径 - 很幸运能将它放在单独的img 标签。希望这是有道理的。
    猜你喜欢
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2018-05-21
    • 2014-06-28
    • 2018-04-05
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多