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

时间:2021-04-21 23:10:33

标签: python function web-scraping beautifulsoup

我试图从网页中提取一个值,但我无法在美丽汤的查找功能中获得确切的值。

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>

我想提取数字 19.887700,该值在此类网页上每天都在变化。 这是URL with today's date

我当前的 Python 代码如下:

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 每天都会根据日期变化。

当我打印(页面)时,我得到 <Response [200]>,因此与网页的连接正确完成。但是,当我打印(结果)时,我得到 None。

关于如何获得所需结果的任何建议?

非常感谢!

2 个答案:

答案 0 :(得分:3)

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

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))

打印:

21-04-2021           19.887700

答案 1 :(得分:1)

代码在我更正时有效

dia = '0' + str(mes)

进入

mes = '0' + str(mes)

所以这只是变量的小错误。


顺便说一句:

下次你可以显示url并复制到浏览器,看看它是否给出了正确的页面

print(url)

您还可以检查您是否真的期望 HTML

print(page.text.find('Celda'))

或者您可以将其保存在文件中并在网络浏览器中打开

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