python - 尝试同时抓取两个页面时出错 - 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()?
解决方案
这可能没有必要
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
推荐阅读
- java - Maven Shade Plugin:“mvn install”如何在本地存储库中包含通过“mvn package”生成的相同 jar?
- c++ - 有没有办法在不输出 C++ 中的 ANSI 转义序列的情况下更改颜色?
- android - Volley 单例不在 mvvm 模式下的存储库上工作
- python - 如何在for循环中的每个单词后添加逗号
- python - 为什么较长的代码不超过时间限制而较短的代码超过时间限制?
- javascript - 使用迭代过程在 PHP 中收集 HTML 元素
- python - Python将字典列表与等效字段结合起来
- sql - 为什么 SQL 中没有 ROUND(23/6) = 4?
- sql - Oracle 触发错误“ORA-00942:表或视图不存在”
- c++ - 重新初始化相同的指针时是否会在while循环中发生内存泄漏