python - Python Webscraping:我如何循环许多 url 请求?
问题描述
import requests
from bs4 import BeautifulSoup
LURL="https://www.erkunde-die-welt.de/laender-hauptstaedte-welt/"
Lpage = requests.get(LURL)
Lsoup = BeautifulSoup(Lpage.content, 'html.parser')
Lx = Lsoup.find_all(class_="column-2")
a=[]
for Lx in Lx:
a.append(Lx.text)
a.remove("Land")
j=0
for i in range(len(a)):
b = a[j]
URL = "https://de.wikipedia.org/wiki/"+b
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
l = soup.find(class_="firstHeading")
zr = soup.find(class_="wikitable infobox infoboxstaat float-right")
z = zr.findAll("tr")
a=""
for z in z:
a=a+z.text
h=a.find("Hauptstadt")
lol=a[h:-1]
lol=lol.replace("Hauptstadt", "")
lol=lol.strip()
fg=lol.find("\n")
lol=lol[0:fg]
lol=lol.strip()
j=j+1
print(lol)
print(l.text)
这是代码。它获取每个国家/地区的名称并将其打包成一个列表。之后,程序循环浏览各个国家的维基百科页面,获取该国的首都并打印出来。它适用于每个国家/地区。但是在一个国家/地区完成并再次启动代码后,它会停止工作并出现错误:
Traceback (most recent call last): File "main.py", line 19, in <module>
z = zr.findAll("tr") AttributeError: 'NoneType' object has no attribute 'findAll'
解决方案
错误消息实际上是在告诉您发生了什么。代码行
z = zr.findAll("tr")
正在引发属性错误,因为 NoneType 对象没有findAll
属性。您正在尝试调用findAll
zr,假设该变量将始终是 BeautifulSoup 对象,但它不会。如果这一行:
zr = soup.find(class_="wikitable infobox infoboxstaat float-right")
在 html 中找不到与这些类匹配的对象,zr 将设置为None
. 因此,在您尝试抓取的页面之一上,这就是发生的事情。您可以使用 try/except 语句围绕它进行编码,如下所示:
for i in range(len(a)):
b = a[j]
URL = "https://de.wikipedia.org/wiki/"+b
page = requests.get(URL)
try:
soup = BeautifulSoup(page.content, 'html.parser')
l = soup.find(class_="firstHeading")
zr = soup.find(class_="wikitable infobox infoboxstaat float-right")
z = zr.findAll("tr")
a=""
#don't do this! should be 'for i in z' or something other variable name
for z in z:
a=a+z.text
h=a.find("Hauptstadt")
lol=a[h:-1]
lol=lol.replace("Hauptstadt", "")
lol=lol.strip()
fg=lol.find("\n")
lol=lol[0:fg]
lol=lol.strip()
j=j+1
print(lol)
print(l.text)
except:
pass
在此示例中,将跳过任何没有正确 html 标记的页面。
推荐阅读
- c# - 使单击的按钮重定向到特定页面
- r - 包设计:如何防止 R 不必要地加载 sp 包?
- token - 使用 usb uuid 作为集中式 2FA 服务器的令牌
- reactjs - 如何使用 gl-react-native 实现这种效果?
- ruby - 格式化程序“Teamcity::Cucumber::Formatter”正在使用已弃用的格式化程序 API
- redis - [vertx.redis.client]没有处理程序等待消息
- obiee - OBIEE 12c:饼图中的重叠标签
- python - 根据字典中的存在过滤numpy数组
- java - 如何使用 Apache Flink 从 Cassandra 读取数据?
- java - Chronicle:反序列化期间未初始化对象