首页 > 解决方案 > 尝试同时抓取两个页面时出错 - Python,bs4

问题描述

我正在尝试从(主)网站上抓取一些电影的链接,然后从这些链接中抓取内容。

在下面的代码中,我尝试只使用一个链接,但最终,我将为所有链接使用循环。

from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import csv

def make_soup(url):
    # opening up connection, grabbing the page
    source = urlopen(url).read()

    # opening up connection, grabbing the page
    page_soup = soup(source, "lxml")

    return page_soup


soup = make_soup('https://letterboxd.com/top10ner/list/2020-edition-top10ners-1001-greatest-movies/')

#### code for grabbing the links
#### link = first_link

my_url = str(link)

new_soup = make_soup(my_url)

new_cont = new_soup.find('div', {'id':'content'})

我得到一个错误:

回溯(最近一次调用最后一次):文件“/Users/calinap/PycharmProjects/WebScraping/letterboxd_scrape.py”,第 34 行,在 new_cont = new_soup.find('div', {'id':'content'}) 文件“ /Users/calinap/PycharmProjects/WebScraping/venv/lib/python3.8/site-packages/bs4/element.py",第 2127 行,在getattr raise AttributeError(AttributeError: ResultSet object has no attribute 'find'。你是可能将元素列表视为单个元素。当您打算调用 find() 时是否调用了 find_all()?

标签: pythonpython-3.xweb-scraping

解决方案


这可能没有必要 my_url = "'" + str(link) + "'"

做就是了my_url = str(link)

好的。我想我知道发生了什么——你正试图打开一个用 JS 呈现的页面。某些页面,例如 facebook - 广泛使用此方法。他们没有向您发送结果页面,您可以从中解析和提取数据,而是向您发送 JavaScript 代码,需要执行该代码以生成带有结果的页面。如果您确实需要这种逻辑 - 您需要使用无头浏览器,例如chromium.

你需要替换这个:

source = urlopen(url).read()

有一些东西链接这个:

from selenium import webdriver
driver = webdriver.Chrome("./chromedriver")
source = driver.get(url)

看看这里: https ://selenium-python.readthedocs.io/getting-started.html


推荐阅读