如何通过beautifulsoup获得隐藏输入的值?

时间:2019-10-08 17:45:06

标签: python html web-scraping beautifulsoup

在python3中,我想使用请求和beautifulsoup从页面中提取信息

import requests
from bs4 import BeautifulSoup

link = "https://portal.stf.jus.br/processos/listarPartes.asp?termo=AECIO%20NEVES%20DA%20CUNHA"

try:
    res = requests.get(link)
except (requests.exceptions.HTTPError, requests.exceptions.RequestException, requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
    print(str(e))
except Exception as e:
    print("Exceção")

html = res.content.decode('utf-8') 

soup =  BeautifulSoup(html, "lxml")

pag = soup.find('div', {'id': 'total'})

print(pag)

在这种情况下,信息位于以下HTML片段中:

<div id="total" style="display: inline-block"><input type="hidden" name="totalProc" id="totalProc" value="35">35</div>

我要访问的是值,在这种情况下为35。捕获数字“ 35”

这就是为什么我使用“ pag = soup.find('div',{'id':'total'}))”的原因。慢慢隔离数字35

但是返回的内容只是:<div id="total" style="display: inline-block"><img src="ajax-loader.gif"/></div>

请问有人只知道如何获取价值内容吗?

3 个答案:

答案 0 :(得分:2)

它是从另一个XHR调用中动态提取的,您可以在“网络”标签中找到

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://portal.stf.jus.br/processos/totalProcessosPartes.asp?termo=AECIO%20NEVES%20DA%20CUNHA&total=0')
soup = bs(r.content, 'lxml')
print(soup.select_one('#totalProc')['value'])

使用正则表达式

import requests, re

r = requests.get('https://portal.stf.jus.br/processos/totalProcessosPartes.asp?termo=AECIO%20NEVES%20DA%20CUNHA&total=0')
soup = bs(r.content, 'lxml')
print(re.search('value=(\d+)',r.text).groups(0)[0])

答案 1 :(得分:1)

我不确定这是否是标准解决方案,但是我个人喜欢使用正则表达式从BeautifulSoup结果中隔离值,因为它们可以帮助捕获任何类型的模式。例如,如果您决定使用正则表达式,则代码可能如下所示:

soup =  str(BeautifulSoup(html, "lxml"))

import regex
pag = regex.findall(r'(?<=value=")\d+', soup)

print(pag[0])

您可以验证正则表达式是否返回值here中的内容。

答案 2 :(得分:1)

正如我在评论中所解释的那样,浏览器自动化可以是解决此问题的快速解决方案。您应该做的第一件事就是在您的计算机上安装Google Chrome。公平地说,它可以与任何浏览器一起使用,但是我不确定如何正确设置代码,因为我以前从未做过。其次,您必须下载一个名为“ chrome webdriver”的工具。您可以找到它here。下载后,解压缩文件并将其放在python脚本的同一目录中,该目录应为:

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import time

ch = Options()
ch.add_argument("--disable-extensions")
ch.add_argument("--disable-gpu")
ch.add_argument("--headless")

browser = webdriver.Chrome(options = ch)
page = browser.get("https://portal.stf.jus.br/processos/listarPartes.asp?termo=AECIO%20NEVES%20DA%20CUNHA")
time.sleep(1)
pag = browser.find_element_by_id('totalProc')

print(pag.get_attribute('value'))
browser.quit()

在执行它之前,请不要忘记在终端中执行pip install selenium来安装实际的硒模块。 该脚本大约需要10到20秒才能运行,但是应该可以正常运行。 让我知道您是否有任何麻烦,但您绝对不应该。