我知道这与循环URL有关,但我认为我的for循环是正确的。
一些了不起的人帮助我从一个站点抓取特定表格的代码如下:
import io
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup
url = "https://magicseaweed.com/Belmar-Surf-Report/3683/"
html = requests.get(url).content
soup = BeautifulSoup(html, "html.parser")
# table 1
regex = re.compile("^table table-primary.*")
table1 = soup.find("table", {"class": regex})
df1 = pd.read_html(io.StringIO(str(table1)))[
0].iloc[:9, [0, 1, 2, 3, 4, 6, 7, 12, 15]]
res1 = [df1.columns.values.tolist(), *df1.values.tolist()]
# print(res1)
# table 2
tables = soup.findAll("table")
table2 = tables[0]
df2 = pd.read_html(io.StringIO(str(table2)))[0]
res2 = df2.values.tolist()
# print(res2)
# table 3
table3 = tables[1]
df3 = pd.read_html(io.StringIO(str(table3)))[0]
res3 = df3.values.tolist()
print(res3)
这太神奇了。我想在它的基础上构建,从多个URL中抓取这三个表。我在一个for循环中添加了ID列表,但我不明白为什么我会得到“找不到表”的结果。我正在努力更好地学习这些东西-有人能解释一下为什么会发生这种情况/我做错了什么吗?我觉得我很接近了,但还是卡住了。
import io
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup
id_list = [
'/Belmar-Surf-Report/3683',
'/Manasquan-Surf-Report/386/',
'/Ocean-Grove-Surf-Report/7945/',
'/Asbury-Park-Surf-Report/857/',
'/Avon-Surf-Report/4050/',
'/Bay-Head-Surf-Report/4951/',
'/Belmar-Surf-Report/3683/',
'/Boardwalk-Surf-Report/9183/',
]
for x in id_list:
url = 'https://magicseaweed.com' + x
html = requests.get(url).content
soup = BeautifulSoup(html, "html.parser")
# table 1
regex = re.compile("^table table-primary.*")
table1 = soup.find("table", {"class": regex})
df1 = pd.read_html(io.StringIO(str(table1)))[
0].iloc[:9, [0, 1, 2, 3, 4, 6, 7, 12, 15]]
res1 = [df1.columns.values.tolist(), *df1.values.tolist()]
print(res1)
# table 2
tables = soup.findAll("table")
table2 = tables[0]
df2 = pd.read_html(io.StringIO(str(table2)))[0]
res2 = df2.values.tolist()
print(res2)
# table 3
table3 = tables[1]
df3 = pd.read_html(io.StringIO(str(table3)))[0]
res3 = df3.values.tolist()
print(res3)
1条答案
按热度按时间vc6uscn91#
检查你的网址,他们应该是有效的语法得到正确的回应回来-第一个你的例子去一个404.
另外,尽量保持你的脚本更简单,没有必要单独使用
BeauftifulSoup
,它仍然是很好的处理pandas
的引擎盖下。findAll()
,而使用find_all()
或select()
与css selectors
-更多信息,请查看文档 *示例