【问题标题】:Extracting src attribute提取 src 属性
【发布时间】:2020-10-17 22:55:11
【问题描述】:

我想做什么:

此 HTML 代码:

<img class="poster lazyload lazyloaded"
     data-src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg"
     data-srcset="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 1x, https://image.tmdb.org/t/p/w188_and_h282_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 2x"
     alt="Hitman"
     src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg"
     srcset="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 1x, https://image.tmdb.org/t/p/w188_and_h282_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 2x"
     data-loaded="true">

我想提取“data-src”或“src”(或每个属性都包含图像的 URL)属性值。

我尝试了什么:

Posters = soup.find("img")["src"]
print(Posters)

但这显然会返回每个 img 标签的所有值,因此每个链接都与海报无关。 输出:

https://www.themoviedb.org/assets/2/v4/logos/v2/blue_short-8e7b30f73a4020692ccca9c88bafe5dcb6f8a62a4c6bc55cd9ba82bb2cd95f6c.SVG
https://www.themoviedb.org/assets/2/v4/logos/v2/blue_short-8e7b30f73a4020692ccca9c88bafe5dcb6f8a62a4c6bc55cd9ba82bb2cd95f6c.SVG

我的意思是海报(查看此网址:https://www.themoviedb.org/search?&amp;query=Hitman)电影海报。

总结

我想提取属性中的值,在类“.lazyloaded”中

我希望一切都清楚。谢谢。


编辑:

解释一下,问题出在哪里?

对于阅读的每个人来说,Laurent 的答案是解决方案,问题在于解析后的 H​​TML。

正如我们在浏览器上看到的那样,包含我试图抓取的属性的类位于“posterlazyloadlazyloaded”类中:

但如果我们打印 website.content:

   <img class="poster lazyload" 
        data-src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/lrDpwvha8VX05vIFxeSZTiPJGYl.jpg"                                                                          
        data-srcset="https://image.tmdb.org/t/p/w94_and_h141_bestv2/lrDpwvha8VX05vIFxeSZTiPJGYl.jpg 1x, https://image.tmdb.org/t/p/w188_and_h282_bestv2/lrDpwvha8VX05vIFxeSZTiPJGYl.jpg 2x"
        alt="The Hitman&#x27;s Bodyguard Collection">

这是非常非常不同的。

【问题讨论】:

    标签: python web-scraping


    【解决方案1】:

    您可以尝试通过class进行过滤:

    posters  = soup.find_all("img", {"class": "lazyloaded"})
    
    for poster in posters:
        print(poster["src"])
    

    查看文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css-class

    编辑:更多解释

    假设你有以下文件demo.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    <img class="logo" src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg">
    <img class="poster lazyload lazyloaded"
         data-src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg"
         data-srcset="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 1x, https://image.tmdb.org/t/p/w188_and_h282_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 2x"
         alt="Hitman"
         src="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg"
         srcset="https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 1x, https://image.tmdb.org/t/p/w188_and_h282_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg 2x"
         data-loaded="true">
    </body>
    </html>
    

    您可以像这样解析“海报”图像:

    import io
    
    from bs4 import BeautifulSoup
    
    with io.open("demo.html", encoding="utf8") as fd:
        soup = BeautifulSoup(fd.read(), features="html.parser")
    
    posters = soup.find_all("img", {"class": "lazyloaded"})
    
    for poster in posters:
        print(poster["src"])
    

    你得到:

    https://image.tmdb.org/t/p/w94_and_h141_bestv2/3qlQM9KP1cyvNfPChA9rASASdHr.jpg
    

    【讨论】:

    • 谢谢 Laurent,我试过了,但它没有打印任何东西,我检查了类是否正确,我得到了这个扩展名的类:selectorgadget.com,我会尝试查看文档。
    • 更新:我打印的网站内容和类名不一样,是“posterlazyload”,我找不到“lazyloaded”,所以我尝试了poster或lazyload但给了我键错误
    • 更新 2.0:工作,我更好地阅读了类并且没有属性“src”,但我看到了“data-srcset”和“data-src”,我将属性更改为“ data-src”,一切正常。非常感谢 Laurent,问题出在解析的 html 上。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多