【问题标题】:BeautifulSoup doesn't catch the complete linkBeautifulSoup 没有捕捉到完整的链接
【发布时间】:2019-09-19 00:38:43
【问题描述】:

当我尝试获取网页上的链接时,bs4 不会捕获整个链接,它会在 **?ref**.... 之前停止。
我将通过代码解释问题:

imdb_link = "https://www.imdb.com/chart/top?ref_=nv_mv_250"
site = requests.get(imdb_link)
soup = BeautifulSoup(site.text,'lxml')

for items in soup.find("table",class_="chart").find_all(class_="titleColumn"):
    link = items.find("a").get('href')
    print(link)

输出是:

/title/tt0111161/
/title/tt0068646/
/title/tt0071562/
/title/tt0468569/
/title/tt0050083/
/title/tt0108052/
/title/tt0167260/
...and so on..

但这是错误的,正如您通过查看网页所看到的那样,因为它可能是:

/title/tt0111161/?ref_=adv_li_tt
/title/tt0068646/?ref_=adv_li_tt
...and so on...

如何获取整个链接?我的意思也是?ref_=adv_li_tt

我使用 Python 3.7.4

【问题讨论】:

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


    【解决方案1】:

    总体而言,尝试解决如何获取完整链接可能会很有趣 - 我认为您需要 selenium 才能允许 javascript 在页面上运行,您不需要呈现页面上的完整链接。你所拥有的,加上前缀https://www.imdb.com,完全可以使用。

    import requests
    from bs4 import BeautifulSoup as bs
    
    with requests.Session() as s:
        r = s.get('https://www.imdb.com/chart/top?ref_=nv_mv_25')
        soup = bs(r.content, 'lxml')
        links = ['https://www.imdb.com' + i['href'] for i in soup.select('.titleColumn a')]
    
        for link in links:
            r = s.get(link)
            soup = bs(r.content, 'lxml')
            print(soup.select_one('title').text)
    

    您可以让 selenium 加载页面,以便内容呈现然后传递给 bs4 以获取页面上的链接:

    from selenium import webdriver
    from bs4 import BeautifulSoup as bs
    
    d = webdriver.Chrome()
    d.get('https://www.imdb.com/chart/top?ref_=nv_mv_25')
    soup = bs(d.page_source, 'lxml')
    d.quit()
    links = ['https://www.imdb.com' + i['href'] for i in soup.select('.titleColumn a')]
    

    【讨论】:

    • 谢谢!事实上,我已经为此使用了 Selenium,但现在我意识到,多亏了你,对于我的范围,我只需要一个前缀。
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多