【问题标题】:How to avoid errors when just one page URL- Python - Web scraping只有一页 URL-Python-Web 抓取时如何避免错误
【发布时间】:2017-12-07 17:31:09
【问题描述】:

大家好,我是初学者,我尝试在网页抓取中使用带有 url 链接的 IF ELSE 函数。 我想选择部门 64 到 66 中的所有页面。 我的网址是:http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/{}/0({} = 64 或 65 或 66)。 我的循环工作并为 64 选择了我的所有页面。但是当我在 65 内时,我看到我只有一页,所以我的代码行 last_page = soup.find('ul', class_='pagination').find('li', class_='next').a['href'].split('=')[1] 无法工作。这是我的代码:

import requests
from bs4 import BeautifulSoup
url_list = ['http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/{}/0']
for link in url_list:
    r=requests.get(link)
    soup = BeautifulSoup(r.content, "html.parser")
    page_Url_test=[link.format(i) for i in range(64, 66)]
    for depart_page in page_Url_test:
        depart_page1=str(depart_page)+"?page={}"
        r=requests.get(depart_page1)
        soup = BeautifulSoup(r.content, "html.parser")
        last_page = soup.find('ul', class_='pagination').find('li', class_='next').a['href'].split('=')[1]
        dept_page_Url=[depart_page1.format(i) for i in range(0, int(last_page)+1)]
print(dept_page_Url)

我尝试像这样合并一个 IF ELSE:

for depart_page in page_Url_test:
    depart_page1=str(depart_page)+"?page={}"
    r=requests.get(depart_page1)
    soup = BeautifulSoup(r.content, "html.parser")
    if len(depart_page1) == 0 :
        dept_page_Url=depart_page1
    else:
        last_page = soup.find('ul', class_='pagination').find('li', class_='next').a['href'].split('=')[1]
        dept_page_Url=[depart_page1.format(i) for i in range(0, int(last_page)+1)]
print(dept_page_Url)

但它不起作用。我该如何对我的代码说:如果我只有一个页面,请选择第一个页面,否则执行下一步? 有什么线索吗?我没有足够的知识独自寻找...... 十分感谢

【问题讨论】:

  • 第65页没有.pagination元素,所以你的条件应该是if soup.find(class_='pagination'):

标签: python loops if-statement url web-scraping


【解决方案1】:

正如 t.m.adam 先生已经指出的那样,您可以尝试以下方法。我还修剪了您的代码以使其简洁。

import requests
from bs4 import BeautifulSoup

url_list = 'http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/{}/0'
for link in [url_list.format(page) for page in range(64,67)]:
    res = requests.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    depart_page = str(link) + "?page={}"
    if soup.find('ul', class_='pagination'):
        last_page = soup.find('ul', class_='pagination').find('li', class_='next').a['href'].split('=')[1]
        dept_page_Url = [depart_page.format(i) for i in range(0, int(last_page)+1)]
        print(dept_page_Url)

需要时的其他方法:

if soup.find('ul', class_='pagination'):
    last_page = soup.find('ul', class_='pagination').find('li', class_='next').a['href'].split('=')[1]
    dept_page_Url = [depart_page.format(i) for i in range(0, int(last_page)+1)]
    print(dept_page_Url)
else:   
    print(link)

结果:

['http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/64/0?page=0', 'http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/64/0?page=1', 'http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/64/0?page=2']
['http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/66/0?page=0', 'http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/66/0?page=1', 'http://www.pour-les-personnes-agees.gouv.fr/annuaire-accueil-de-jour/66/0?page=2']

【讨论】:

  • 非常感谢您的解释,我的代码更加简洁。我学到了很多。我有一个问题:在这部分之后,我需要废弃数据,我的代码适用于 64 和 66 部门,但不适用于 65。我知道这是因为我只有一页,但实际上我也需要废弃这些数据!!!在我的代码下方:
  • for test in dept_page_Url:``r = requests.get(test)``soup = BeautifulSoup(r.content, "html.parser")``for maison in soup.find_all("div", {"id":"cnsa_results-list"}):``for general in maison.find_all("div", {"class":"row"}):``for description in general.find_all("div", {"class":"cnsa_results-tags2 col col-xs-10 col-sm-10"}):``description_name=description.text``print(description_name)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2023-01-02
  • 1970-01-01
  • 2021-10-03
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多