【问题标题】:How to loop through a list of urls for web scraping with BeautifulSoup如何使用 BeautifulSoup 循环浏览网页抓取的 url 列表
【发布时间】:2017-06-29 10:59:09
【问题描述】:

有人知道如何通过 Beautifulsoup 从同一网站上抓取网址列表吗? list = ['url1', 'url2', 'url3'...]

================================================ =============================

我提取网址列表的代码:

url = 'http://www.hkjc.com/chinese/racing/selecthorsebychar.asp?ordertype=2'
url1 = 'http://www.hkjc.com/chinese/racing/selecthorsebychar.asp?ordertype=3'
url2 = 'http://www.hkjc.com/chinese/racing/selecthorsebychar.asp?ordertype=4'

r  = requests.get(url)
r1  = requests.get(url1)
r2  = requests.get(url2)

data = r.text
soup = BeautifulSoup(data, 'lxml')
links = []

for link in soup.find_all('a', {'class': 'title_text'}):
    links.append(link.get('href'))

data1 = r1.text

soup = BeautifulSoup(data1, 'lxml')

for link in soup.find_all('a', {'class': 'title_text'}):
    links.append(link.get('href'))

data2 = r2.text

soup = BeautifulSoup(data2, 'lxml')

for link in soup.find_all('a', {'class': 'title_text'}):
    links.append(link.get('href'))

new = ['http://www.hkjc.com/chinese/racing/']*1123

url_list = ['{}{}'.format(x,y) for x,y in zip(new,links)]

从单页 url 中提取的代码:

from urllib.request import urlopen  
from bs4 import BeautifulSoup  
import requests  
import pandas as pd  

url = 'myurl'

r = requests.get(myurl)

r.encoding = 'utf-8'

html_content = r.text

soup = BeautifulSoup(html_content, 'lxml')

soup.findAll('tr')[27].findAll('td')

column_headers = [th.getText() for th in
                  soup.findAll('tr')[27].findAll('td')]

data_rows =soup.findAll('tr')[29:67]
data_rows

player_data = [[td.getText() for td in data_rows[i].findAll('td', {'class':['htable_text', 'htable_eng_text']})]
            for i in range(len(data_rows))]

player_data_02 = []

for i in range(len(data_rows)):
    player_row = []

    for td in data_rows[i].findAll('td'):
        player_row.append(td.getText())

    player_data_02.append(player_row)

df = pd.DataFrame(player_data, columns=column_headers[:18])

【问题讨论】:

  • 您的问题并不完全可以理解。请改写它并从您要抓取网址的位置发布 realurl
  • 简而言之,我正在寻找从 url 列表(来自同一网站)中抓取 html 表的方法。
  • 再说一次,当我看不到网站本身时,我无法为您提供帮助。抽象一般来说是好的,但在这种情况下不是。如果您确定标记相同,请提供完整的 URL 或至少一个子集
  • 这怎么可能是个问题?将您的抓取代码放入一个函数中,然后在循环中调用它...

标签: python beautifulsoup


【解决方案1】:

根据您的链接子集,表数据集合如下:

from bs4 import BeautifulSoup as BS
import requests  
import pandas as pd  

url_list = ['http://www.hkjc.com/english/racing/horse.asp?HorseNo=S217','http://www.hkjc.com/english/racing/horse.asp?HorseNo=A093','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V344','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V077', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=P361', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=T103']


for link in url_list:
    r = requests.get(link)
    r.encoding = 'utf-8'

    html_content = r.text
    soup = BS(html_content, 'lxml')


    table = soup.find('table', class_='bigborder')
    if not table:
        continue

    trs = table.find_all('tr')

    if not trs:
        continue #if trs are not found, then starting next iteration with other link

    headers = trs[0]
    headers_list=[]
    for td in headers.find_all('td'):
        headers_list.append(td.text)
    headers_list+=['Season']
    headers_list.insert(19,'pseudocol1')
    headers_list.insert(20,'pseudocol2')
    headers_list.insert(21,'pseudocol3')

    res=[]
    row = []
    season = ''
    for tr in trs[1:]:
        if 'Season' in tr.text:
            season = tr.text

        else:
            tds = tr.find_all('td')
            for td in tds:
                row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip()) #clean data
            row.append(season.strip())
            res.append(row)
            row=[]

    res = [i for i in res if i[0]!='']

    df=pd.DataFrame(res, columns=headers_list)
    del df['pseudocol1'],df['pseudocol2'],df['pseudocol3']
    del df['VideoReplay']

    df.to_csv('/home/username/'+str(url_list.index(link))+'.csv')

如果你想将所有表中的数据存储到一个数据帧中,这个小小的修改就可以了:

from bs4 import BeautifulSoup as BS
import requests  
import pandas as pd  

url_list = ['http://www.hkjc.com/english/racing/horse.asp?HorseNo=S217','http://www.hkjc.com/english/racing/horse.asp?HorseNo=A093','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V344','http://www.hkjc.com/english/racing/horse.asp?HorseNo=V077', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=P361', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=T103']


res=[] #placing res outside of loop
for link in url_list:
    r = requests.get(link)
    r.encoding = 'utf-8'

    html_content = r.text
    soup = BS(html_content, 'lxml')


    table = soup.find('table', class_='bigborder')
    if not table:
        continue

    trs = table.find_all('tr')

    if not trs:
        continue #if trs are not found, then starting next iteration with other link


    headers = trs[0]
    headers_list=[]
    for td in headers.find_all('td'):
        headers_list.append(td.text)
    headers_list+=['Season']
    headers_list.insert(19,'pseudocol1')
    headers_list.insert(20,'pseudocol2')
    headers_list.insert(21,'pseudocol3')

    row = []
    season = ''
    for tr in trs[1:]:
        if 'Season' in tr.text:
            season = tr.text

        else:
            tds = tr.find_all('td')
            for td in tds:
                row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip())
            row.append(season.strip())
            res.append(row)
            row=[]

res = [i for i in res if i[0]!=''] #outside of loop

df=pd.DataFrame(res, columns=headers_list) #outside of loop
del df['pseudocol1'],df['pseudocol2'],df['pseudocol3'] 
del df['VideoReplay']

df.to_csv('/home/Username/'+'tables.csv') #outside of loop

【讨论】:

  • 伙计,我花了很多时间在这上面,应该真的值得
  • @JAY.Y,有什么反馈吗?我的解决方案有帮助吗?
  • 欣赏这一点。但它返回为:名称“季节”未定义。
  • 已修复,添加季节变量赋值,请重试
  • season 是一个从季节行中收集文本的变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多