Python 使用Beautiful Soup/find()函数进行网页抓取时得到的结果=无

Python 使用Beautiful Soup/find()函数进行网页抓取时得到的结果=无,python,function,web-scraping,beautifulsoup,Python,Function,Web Scraping,Beautifulsoup,我试图从网页中提取一个值,但我无法在beautiful soup的find函数中获得确切的值 WP HTML代码的相关部分如下: <tr class="Celda 1"> <td height="17" width="48%" align="center" class="txt" style="padding: 3px;">21-04-2021

我试图从网页中提取一个值,但我无法在beautiful soup的find函数中获得确切的值

WP HTML代码的相关部分如下:

<tr class="Celda 1"> 
    <td height="17" width="48%" align="center" class="txt" style="padding: 3px;">21-04-2021</td>
    <td width="52%" align="center" class="txt">19.887700</td>
</tr>
import requests
from bs4 import BeautifulSoup
from datetime import datetime 

def calcular_tipo_cambio(self):
    dia = datetime.now().day
    mes = datetime.now().month
    año = str(datetime.now().year)
    if len(str(dia)) == 1:
        dia = '0' + str(dia)
    if len(str(mes)) == 1:
        dia = '0' + str(mes)
    url = f'https://www.dof.gob.mx/indicadores_detalle.php?cod_tipo_indicador=158' \
          f'&dfecha={dia}%2F{mes}%2F{año}&hfecha={dia}%2F{mes}%2F{año}'
    page = requests.get(url)
    print(page)
    soup = BeautifulSoup(page.content, 'html.parser')
    results = soup.find("tr", {"class": "Celda 1"})
    print(results)
在我的Python文件中,我使用了一个动态url,因为网页url每天都会根据日期而变化

当我打印(页面)时,我会得到
,这样就可以正确地连接到网页。然而,当我打印(结果)时,我什么也得不到

关于如何获得期望的结果有什么建议吗


提前多谢

您可以使用此示例了解如何从此页面获取数据:

import requests
from bs4 import BeautifulSoup
    
url = "https://www.dof.gob.mx/indicadores_detalle.php"

query = {
    "cod_tipo_indicador": "158",
    "dfecha": "21/04/2021",
    "hfecha": "21/04/2021",
}
    
soup = BeautifulSoup(requests.get(url, params=query).content, "html.parser")
    
for tr in soup.find_all(class_="Celda 1"):
    fecha, valor = [td.get_text(strip=True) for td in tr.find_all("td")]
    print("{:<20} {}".format(fecha, valor))

您可以使用此示例了解如何从此页面获取数据:

import requests
from bs4 import BeautifulSoup
    
url = "https://www.dof.gob.mx/indicadores_detalle.php"

query = {
    "cod_tipo_indicador": "158",
    "dfecha": "21/04/2021",
    "hfecha": "21/04/2021",
}
    
soup = BeautifulSoup(requests.get(url, params=query).content, "html.parser")
    
for tr in soup.find_all(class_="Celda 1"):
    fecha, valor = [td.get_text(strip=True) for td in tr.find_all("td")]
    print("{:<20} {}".format(fecha, valor))

当我纠正错误时,代码工作

dia = '0' + str(mes)
进入

所以这只是变量的一个小错误


顺便说一句:

<tr class="Celda 1"> 
    <td height="17" width="48%" align="center" class="txt" style="padding: 3px;">21-04-2021</td>
    <td width="52%" align="center" class="txt">19.887700</td>
</tr>
import requests
from bs4 import BeautifulSoup
from datetime import datetime 

def calcular_tipo_cambio(self):
    dia = datetime.now().day
    mes = datetime.now().month
    año = str(datetime.now().year)
    if len(str(dia)) == 1:
        dia = '0' + str(dia)
    if len(str(mes)) == 1:
        dia = '0' + str(mes)
    url = f'https://www.dof.gob.mx/indicadores_detalle.php?cod_tipo_indicador=158' \
          f'&dfecha={dia}%2F{mes}%2F{año}&hfecha={dia}%2F{mes}%2F{año}'
    page = requests.get(url)
    print(page)
    soup = BeautifulSoup(page.content, 'html.parser')
    results = soup.find("tr", {"class": "Celda 1"})
    print(results)
下次你们可以显示url并复制到浏览器,看看它是否给出了正确的页面

print(url)
您还可以检查您是否真的期望HTML

print(page.text.find('Celda'))
或者您可以将其保存在文件中并在web浏览器中打开

with open('output.html', 'w') as f:
    f.write(page.text)

import webbrowser
webbrowser.open('output.html') # it should open file in default program/browser   

当我纠正错误时,代码工作

dia = '0' + str(mes)
进入

所以这只是变量的一个小错误


顺便说一句:

<tr class="Celda 1"> 
    <td height="17" width="48%" align="center" class="txt" style="padding: 3px;">21-04-2021</td>
    <td width="52%" align="center" class="txt">19.887700</td>
</tr>
import requests
from bs4 import BeautifulSoup
from datetime import datetime 

def calcular_tipo_cambio(self):
    dia = datetime.now().day
    mes = datetime.now().month
    año = str(datetime.now().year)
    if len(str(dia)) == 1:
        dia = '0' + str(dia)
    if len(str(mes)) == 1:
        dia = '0' + str(mes)
    url = f'https://www.dof.gob.mx/indicadores_detalle.php?cod_tipo_indicador=158' \
          f'&dfecha={dia}%2F{mes}%2F{año}&hfecha={dia}%2F{mes}%2F{año}'
    page = requests.get(url)
    print(page)
    soup = BeautifulSoup(page.content, 'html.parser')
    results = soup.find("tr", {"class": "Celda 1"})
    print(results)
下次你们可以显示url并复制到浏览器,看看它是否给出了正确的页面

print(url)
您还可以检查您是否真的期望HTML

print(page.text.find('Celda'))
或者您可以将其保存在文件中并在web浏览器中打开

with open('output.html', 'w') as f:
    f.write(page.text)

import webbrowser
webbrowser.open('output.html') # it should open file in default program/browser   

类名不能有空格,因此您实际上是在寻找同时具有类
Celda
1
的元素-但是,
1
也不是有效的类名。它必须以字母或下划线开头。首先,你可以检查你是否真的得到了你想要的HTML。当我检查
page.text.find('Celda')
时,它在HTML中找不到
Celda
,这可能意味着你得到了不同的HTML,也就是说,它可能会为机器人提供验证码或警告。或者它可能使用JAvaScript添加此元素。或者它可能需要正确的头用户代理来发送正确的结果。您在
dia='0'+str(mes)
中分配了错误的值。类名不能有空格,因此您实际上是在寻找一个既有类
Celda
又有类
1
的元素。但是,
1
也不是有效的类名。它必须以字母或下划线开头。首先,你可以检查你是否真的得到了你想要的HTML。当我检查
page.text.find('Celda')
时,它在HTML中找不到
Celda
,这可能意味着你得到了不同的HTML,也就是说,它可能会为机器人提供验证码或警告。或者它可能使用JAvaScript添加此元素。或者它可能需要正确的头用户代理来发送正确的结果,您在
dia='0'+str(mes)