pandas 如何避免“找不到表”,而在一个循环中的网址列表网页抓取?

7tofc5zh  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(112)

我知道这与循环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)
vc6uscn9

vc6uscn91#

检查你的网址,他们应该是有效的语法得到正确的回应回来-第一个你的例子去一个404.
另外,尽量保持你的脚本更简单,没有必要单独使用BeauftifulSoup,它仍然是很好的处理pandas的引擎盖下。

  • 在较新的代码中,避免使用旧语法findAll(),而使用find_all()select()css selectors-更多信息,请查看文档 *

示例

import pandas as pd
import requests

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:
    print(pd.read_html(requests.get('http://magicseaweed.com' + x).text)[2].iloc[:9, [0, 1, 2, 3, 4, 6, 7, 12, 15]])
    print(pd.read_html(requests.get('http://magicseaweed.com' + x).text)[0])
    print(pd.read_html(requests.get('http://magicseaweed.com' + x).text)[1])

相关问题