【问题标题】:Can't get all the information when I print two categories together将两个类别一起打印时无法获取所有信息
【发布时间】:2018-07-14 18:24:06
【问题描述】:

我在 python 中编写了一些代码来抓取一些电影名称以及与这些电影相关的一些附加信息。如果我考虑单独打印这两个项目,那么我到目前为止所写的内容都很好,例如位于 我脚本的中间部分和底部的print(addinfo)

但是,当我尝试在底部将它们一起打印时,我只得到具有附加信息的电影名称(附加信息是从附加到每个电影名称的链接中检索的。问题是大多数电影名称不包含额外链接。)

例如,如果有 5 个电影名称,其中只有三个具有附加链接,那么当我将它们打印在一起时,我会得到三个电影名称和附加信息,而我应该打印 5 个电影名称。我希望打印那些没有额外信息的名称。我怎样才能解决这个问题?提前致谢。我认为站点地址和 html 信息无关紧要,因为代码运行良好。不过,我会粘贴完整的代码供您参考。

我尝试过的脚本:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

URL = "https://in.bookmyshow.com/vizag/movies"

res = requests.get(URL)
soup = BeautifulSoup(res.text, 'lxml')
for item in soup.select(".card-container"):
    movie = item.select_one(".__movie-name").text.strip()

    print(movie)  ####I do not wish to print it here. I expect to print both (movie and addinfo) together

    blink = item.select_one(".book-button a")
    if blink:
        req = requests.get(urljoin(URL,blink['href']))
        soup = BeautifulSoup(req.text,"lxml")
        addinfo = ' '.join([item.select_one(".__venue-name").text.strip() for item in soup.select(".listing-info")])

        print(movie,addinfo) ####if i print both of them together then I only get those movies which have items informations as well

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup


    【解决方案1】:

    代码:

    import requests
    from bs4 import BeautifulSoup
    from urllib.parse import urljoin
    
    URL = "https://in.bookmyshow.com/vizag/movies"
    
    res = requests.get(URL)
    soup = BeautifulSoup(res.text, 'html.parser')
    for item in soup.select(".card-container"):
        addinfo = ''
        movie = item.select_one(".__movie-name").text.strip()
        blink = item.select_one(".book-button a")
        if blink:
            req = requests.get(urljoin(URL,blink['href']))
            soup = BeautifulSoup(req.text,"lxml")
            addinfo = ' '.join([item.select_one(".__venue-name").text.strip() for item in soup.select(".listing-info")])
        print(movie, addinfo)
    

    输出:

    Tholi Prema Gokul A/C DTS: Vizag
    Howrah Bridge INOX: CMR Central, Maddilapalem INOX: Varun Beach, Beach Road INOX: Vizag Chitralaya Mall Satyam A/C Dts: Gopalapatnam V Max: Vizag
    Chalo Ganesh A/C Dts: Tagarapuvalasa INOX: CMR Central, Maddilapalem INOX: Varun Beach, Beach Road INOX: Vizag Chitralaya Mall Mukta A2 Cinemas: Vizag Central, Vizag Mohini Mini: Gajuwaka Mohini 70mm Dolby Atmos: Gajuwaka Narasimha a/c Dts: Gopalapatnam Sri Lakshmi Narasimha Picture Palace: Vizag Sri Venkateshwara Screen 1: Vizag Sarat Theater - 4K Dolby Atmos: Vizag
    Touch Chesi Chudu INOX: CMR Central, Maddilapalem INOX: Varun Beach, Beach Road INOX: Vizag Chitralaya Mall Mukta A2 Cinemas: Vizag Central, Vizag Raja Cine Max 2K  A/c Dts: Kothavalasa Sharada 4K: Vizag Sri Rama Picture Palace: Vizag Tata Picture Palace A/c Dts: Tagarapuvalasa V Max: Vizag
    Bhaagamathie INOX: CMR Central, Maddilapalem INOX: Varun Beach, Beach Road INOX: Vizag Chitralaya Mall Jagadamba 4k: Vizag Kinnera Cinema: Maddilapalem Mukta A2 Cinemas: Vizag Central, Vizag Sri Ramulamma Theatre, Thagarapuvalasa: Vizag Sri Lakshmi Narasimha Picture Palace: Vizag Shankara A/C Dts: Gopalapatnam Sri Jaya A/c Dts: Kothavalasa
    Padmaavat 
    Gang Gokul A/C DTS: Vizag Sri Parameswari Picture Palace: Kancharapalem
    Jai Simha Mourya Theatre: Gopalapatnam Sree Leela Mahal: Vizag Saptagiri Theatre: Chittivalasa
    Maze Runner: The Death Cure INOX: Varun Beach, Beach Road INOX: Vizag Chitralaya Mall Ramadevi 4K: Vizag
    Jumanji: Welcome To The Jungle INOX: Vizag Chitralaya Mall
    Hey Jude INOX: Varun Beach, Beach Road
    Green Apple 
    Sollividava 
    Tagaru 
    Savarakathi 
    KEE 
    Prema Baraha 
    Befaam 
    Shadow 
    Rosapoo 
    Aapla Manus 
    Kalakalappu 2 
    Kumari 21 F 
    Karu 
    Kirrak Party 
    Gayatri 
    Inttelligent 
    KEY 
    Downup The Exit 796 
    Pad Man 
    The Boy and The World 
    The 15:17 to Paris 
    Leera The Soulmates 
    Aiyaary 
    Kanam 
    

    【讨论】:

    • 感谢您的回复@Ali。如果您查看上面的输出,您可以看到(在Hey Jude 之后)所有电影都在INOX: Varun Beach, Beach Road 中填写了相同的信息,而它们都是空白的。更清楚一点:在Hey Jude 之后,电影名称没有任何附加信息。这是我正在努力解决的问题。
    • 我刚刚更新了我的答案,希望能解决你的问题。
    • 没办法。它确实修复了。你绝对值得一票。感谢您的出色修复。
    • 没问题@Topto :D
    【解决方案2】:

    如果您使用else 块,那么另一种方法可能如下所示:

    import requests
    from bs4 import BeautifulSoup
    from urllib.parse import urljoin
    
    URL = "https://in.bookmyshow.com/vizag/movies"
    
    res = requests.get(URL)
    soup = BeautifulSoup(res.text, 'lxml')
    for item in soup.select(".card-container"):
        movie = item.select_one(".__movie-name").text.strip()
        blink = item.select_one(".book-button a")
    
        if blink:
            req = requests.get(urljoin(URL,blink['href']))
            soup = BeautifulSoup(req.text,"lxml")
            addinfo = ' '.join([item.select_one(".__venue-name").text.strip() for item in soup.select(".listing-info")])
    
            print(movie,addinfo)
        else:
            print(movie)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-02
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多