【问题标题】:Pagination with BeautifulSoup使用 BeautifulSoup 进行分页
【发布时间】:2018-05-22 19:50:55
【问题描述】:

我正在尝试从以下网站获取一些数据。 https://www.drugbank.ca/drugs

对于表格中的每种药物,我需要深入了解名称和其他一些特定功能,例如类别、结构化指示(请单击药物名称以查看我将使用的功能)。

我编写了以下代码,但问题是我无法让我的代码处理分页(如您所见,超过 2000 页!)。

import requests
from bs4 import BeautifulSoup


def drug_data():
url = 'https://www.drugbank.ca/drugs/'
r = requests.get(url)
soup = BeautifulSoup(r.text ,"lxml")
for link in soup.select('name-head a'):
    href = 'https://www.drugbank.ca/drugs/' + link.get('href')
    pages_data(href)


def pages_data(item_url):
r = requests.get(item_url)
soup = BeautifulSoup(r.text, "lxml")
g_data = soup.select('div.content-container')

for item in g_data:
    print item.contents[1].text
    print item.contents[3].findAll('td')[1].text
    try:
        print item.contents[5].findAll('td',{'class':'col-md-2 col-sm-4'})
    [0].text
    except:
        pass
    print item_url
    drug_data()

如何抓取所有数据并正确处理分页?

【问题讨论】:

  • 所有页面使用几乎相同的 url - &page=... - 因此您可以轻松地为下一页生成 url。
  • 怎么样?你有一个例子吗?谢谢你弗拉斯 :)
  • 正常url = https://www.drugbank.ca/drugs?page=" + str(page_number)
  • 您可以使用forwhile 循环并在无法读取页面时捕获页面末尾。下一页的链接也位于页面上的按钮“>”中,因此您可以使用BeautifulSoup 获取它。

标签: python pagination beautifulsoup


【解决方案1】:

此页面对所有页面使用几乎相同的 url,因此您可以使用 for 循环来生成它们

def drug_data(page_number):
    url = 'https://www.drugbank.ca/drugs/?page=' + str(page_number)
    ... rest ...

# --- later ---

for x in range(1, 2001):
    drug_data(x)

或者使用whiletry/except 获得超过2000页

# --- later ---
page = 0

while True:
    try:
        page += 1
        drug_data(page)
    except Exception as ex:
        print(ex)
        print("probably last page:", page)
        break # exit `while` loop

您还可以在 HTML 中找到下一页的网址

<a rel="next" class="page-link" href="/drugs?approved=1&amp;c=name&amp;d=up&amp;page=2">›</a>

所以您可以使用BeautifulSoup 获取此链接并使用它。

显示当前网址,找到下一页的链接(使用class="page-link" rel="next")并加载它

import requests
from bs4 import BeautifulSoup

def drug_data():
    url = 'https://www.drugbank.ca/drugs/'

    while url:
        print(url)
        r = requests.get(url)
        soup = BeautifulSoup(r.text ,"lxml")

        #data = soup.select('name-head a')
        #for link in data:
        #    href = 'https://www.drugbank.ca/drugs/' + link.get('href')
        #    pages_data(href)

        # next page url
        url = soup.findAll('a', {'class': 'page-link', 'rel': 'next'})
        print(url)
        if url:
            url = 'https://www.drugbank.ca' + url[0].get('href')
        else:
            break

drug_data()

顺便说一句:永远不要使用except:pass,因为你可能会遇到你没有预料到的错误,而且你不会知道它为什么不起作用。更好的显示错误

 except Exception as ex:
      print('Error:',  ex)

【讨论】:

  • 我添加了找到下一页链接的示例。
  • 非常感谢,这很有帮助!
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 2021-03-26
  • 2021-11-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2021-05-24
  • 2020-10-04
相关资源
最近更新 更多