在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>
请问有人只知道如何获取价值内容吗?
答案 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秒才能运行,但是应该可以正常运行。
让我知道您是否有任何麻烦,但您绝对不应该。