Python Webscraping:如何循环许多url请求? 导入请求 从bs4导入BeautifulSoup 卢尔=”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=[] 对于Lx中的Lx: a、 追加(Lx.text) a、 移除(“土地”) j=0 对于范围内的i(len(a)): b=a[j] URL=”https://de.wikipedia.org/wiki/“+b page=请求.get(URL) soup=BeautifulSoup(page.content,'html.parser') l=汤。查找(class=“firstHeading”) zr=soup.find(class=“wikitable infobox InfoboxStatat float right”) z=zr.findAll(“tr”) a=“” 对于z中的z: a=a+z 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 打印(lol) 打印(l.text)
这是代码。它获取每个国家的名称并将其打包到一个列表中。之后,该程序循环浏览该国的维基百科页面,获取该国的首都并打印出来。它适用于所有国家。但在一个国家/地区完成并再次启动代码后,它会停止do work,并出现以下错误:Python Webscraping:如何循环许多url请求? 导入请求 从bs4导入BeautifulSoup 卢尔=”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=[] 对于Lx中的Lx: a、 追加(Lx.text) a、 移除(“土地”) j=0 对于范围内的i(len(a)): b=a[j] URL=”https://de.wikipedia.org/wiki/“+b page=请求.get(URL) soup=BeautifulSoup(page.content,'html.parser') l=汤。查找(class=“firstHeading”) zr=soup.find(class=“wikitable infobox InfoboxStatat float right”) z=zr.findAll(“tr”) a=“” 对于z中的z: a=a+z 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 打印(lol) 打印(l.text),python,beautifulsoup,Python,Beautifulsoup,这是代码。它获取每个国家的名称并将其打包到一个列表中。之后,该程序循环浏览该国的维基百科页面,获取该国的首都并打印出来。它适用于所有国家。但在一个国家/地区完成并再次启动代码后,它会停止do work,并出现以下错误: Traceback(最近一次调用last):文件“main.py”,第19行,在 z=zr.findAll(“tr”)AttributeError:'NoneType'对象没有属性'findAll' 错误消息实际上是在告诉您发生了什么。代码行 z = zr.findAll("tr
Traceback(最近一次调用last):文件“main.py”,第19行,在
z=zr.findAll(“tr”)AttributeError:'NoneType'对象没有属性'findAll'
错误消息实际上是在告诉您发生了什么。代码行
z = zr.findAll("tr")
正在引发属性错误,因为非类型对象没有findAll
属性。您正试图在zr上调用findAll
,假设变量始终是一个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标记的页面都将被跳过。错误消息实际上是在告诉您发生了什么。代码行
z = zr.findAll("tr")
正在引发属性错误,因为非类型对象没有findAll
属性。您正试图在zr上调用findAll
,假设变量始终是一个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标记的页面都将被跳过。非类型表示您的行
zr=soup.find(class=“wikitable infobox infoboxstat float right”)
没有返回任何内容
错误在这个循环中:
for Lx in Lx:
a.append(Lx.text)
在那里你不能用同一个名字。请尝试使用此循环,并让我知道它是如何运行的:
for L in Lx:
a.append(Lx.text)
“NoneType”表示您的行
zr=soup.find(class=“wikitable infobox InfoboxStatat float right”)
没有返回任何内容
错误在这个循环中:
for Lx in Lx:
a.append(Lx.text)
在那里你不能用同一个名字。请尝试使用此循环,并让我知道它是如何运行的:
for L in Lx:
a.append(Lx.text)
您将国家列表存储在名为
a
的变量中,然后在脚本中使用其他值重写该变量。这会打乱你的迭代。预防此类问题的两个好方法:
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
mypy
countries
,而不是a
,这可以防止您覆盖它,我将极其混乱的I/j/a/b
迭代替换为国家中国家的一个非常简单的
循环。我还去掉了所有只使用过一次的变量,这样我就不用为它们取更好的名字了。我认为还有更多的工作要做,但我不知道这个内部循环在做什么,甚至不想尝试修复它。祝你好运
import requests
from bs4 import BeautifulSoup
countries = [x.text for x in BeautifulSoup(
requests.get(
"https://www.erkunde-die-welt.de/laender-hauptstaedte-welt/"
).content,
'html.parser'
).find_all(class_="column-2")]
countries.remove("Land")
for country in countries:
soup = BeautifulSoup(
requests.get(
"https://de.wikipedia.org/wiki/" + country
).content,
'html.parser'
)
heading = soup.find(class_="firstHeading")
rows = soup.find(
class_="wikitable infobox infoboxstaat float-right"
).findAll("tr")
a = ""
for row in rows:
a += row.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()
print(lol)
print(heading.text)
您将国家列表存储在名为
a
的变量中,然后在脚本中使用其他值重写该变量。这会打乱你的迭代。预防此类问题的两个好方法:
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
mypy
countries
,而不是a
,这可以防止您覆盖它,我将极其混乱的I/j/a/b
迭代替换为国家中国家的一个非常简单的
循环。我还去掉了所有只使用过一次的变量,这样我就不用为它们取更好的名字了。我认为还有更多的工作要做,但我不知道这个内部循环在做什么,甚至不想尝试修复它。祝你好运
import requests
from bs4 import BeautifulSoup
countries = [x.text for x in BeautifulSoup(
requests.get(
"https://www.erkunde-die-welt.de/laender-hauptstaedte-welt/"
).content,
'html.parser'
).find_all(class_="column-2")]
countries.remove("Land")
for country in countries:
soup = BeautifulSoup(
requests.get(
"https://de.wikipedia.org/wiki/" + country
).content,
'html.parser'
)
heading = soup.find(class_="firstHeading")
rows = soup.find(
class_="wikitable infobox infoboxstaat float-right"
).findAll("tr")
a = ""
for row in rows:
a += row.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()
print(lol)
print(heading.text)
好吧,到底是什么问题?你做过调试吗?好的,到底是什么问题?您调试过吗?非常感谢。你是对的,这个代码真的是一团糟。令人尴尬的是,我没有注意到我意外地覆盖了变量a。无论如何,非常感谢您花时间查看这段混乱的代码并注意到失败。现在它的工作是.PS。对不起,我的英语不好。非常感谢。你是对的,这个代码真的是一团糟。令人尴尬的是,我没有注意到我意外地覆盖了变量a。无论如何,非常感谢您花时间查看这段混乱的代码并注意到失败。现在它的工作是.PS。对不起,我英语不好