【问题标题】:How to get complete href links using beautifulsoup in python如何在python中使用beautifulsoup获取完整的href链接
【发布时间】:2019-12-23 16:40:44
【问题描述】:

我正在尝试按流派获取顶级电影名称。我无法获得完整的href链接,我被半个href链接卡住了

通过我得到的以下代码,

https://www.imdb.com/search/title?genres=action&sort=user_rating,desc&title_type=feature&num_votes=25000,
https://www.imdb.com/search/title?genres=adventure&sort=user_rating,desc&title_type=feature&num_votes=25000,
https://www.imdb.com/search/title?genres=animation&sort=user_rating,desc&title_type=feature&num_votes=25000,
https://www.imdb.com/search/title?genres=biography&sort=user_rating,desc&title_type=feature&num_votes=25000,
.........

像这样,但我想按其类型(如动作、冒险、动画、传记)列出所有前 100 部电影的名称......

我尝试了以下代码:

from bs4 import BeautifulSoup
import requests

url = 'https://www.imdb.com'
main_url = url + '/chart/top'
res = requests.get(main_url)
soup = BeautifulSoup(res.text, 'html.parser')
for href in soup.find_all(class_='subnav_item_main'):
               # print(href)
               all_links = url + href.find('a').get('href')
               print(all_links)

我想要来自a link的完整链接,如下图所示

/search/title?genres=action&sort=user_rating,desc&title_type=feature&num_votes=25000,&pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=5aab685f-35eb-40f3-95f7-c53f09d542c3&pf_rd_r=FM1ZEBQ7E9KGQSDD441H&pf_rd_s=right-6&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_gnr_1"

【问题讨论】:

    标签: python web-scraping beautifulsoup request


    【解决方案1】:

    您需要对这些 url 进行另一个循环,并且限制只能获得 100 个。我将键存储在字典中,其中键是流派,值是电影列表。注意原始标题可能会出现,例如The Mountain II (2016) 是 Dag II(原标题)。

    links 是一个元组列表,我将流派作为第一项,将 url 作为第二项。

    import requests, pprint
    from bs4 import BeautifulSoup as bs
    from urllib.parse import  urljoin
    
    url = 'https://www.imdb.com/chart/top'    
    genres = {}
    
    with requests.Session() as s:
        r = s.get(url)
        soup = bs(r.content, 'lxml')
        links = [(i.text, urljoin(url,i['href'])) for i in soup.select('.subnav_item_main a')]
    
        for link in links:
            r = s.get(link[1])
            soup = bs(r.content, 'lxml')
            genres[link[0].strip()] = [i['alt'] for i in soup.select('.loadlate', limit = 100)]
    
    pprint.pprint(genres)
    

    示例输出:

    【讨论】:

    • 您好先生,我正在尝试将此输出保存到 csv 文件中,但事实并非如此。有什么特殊的语法可以做到这一点
    • 尝试:df=pd.DataFrame.from_dict(genres,orient='index').transpose() 然后 df.to_csv(r'C:\Users\User\Desktop\Data.csv' , sep=',', encoding='utf-8-sig',index = False )
    • 先生,我没有使用 pandas,有没有什么办法可以像简单的 python 语法那样不用 pandas
    • 那么不要创建列表字典。而是在列表理解生成的列表的位置 0 处插入流派,例如row = [i['alt'] for i in soup.select('.loadlate', limit = 100)] 然后 row.insert(0,genres[link[0].strip()) 然后 csv.writerow(row )
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多