每当我在终端中打印出抓取的数据时,它都会很好地显示抓取的数据,但每当我尝试使用 Python Flask 提供它时,我使用的 HTML 模板不会在 Web 浏览器中呈现数据。如果您能帮我修复此代码。
Python(Flask)文件:
from flask import Flask, render_template
from bs4 import BeautifulSoup as BS
import requests
src = requests.get('https://webscraper.netlify.app/').text
scraper = BS(src, 'lxml')
# head = scraper.find('main').select_one('article:nth-of-type(4)').div.text
# author = scraper.find('main').select_one('p').text
head = scraper.body.header.h1.text
snd_author = scraper.body.main.select_one('article:nth-of-type(2)').p.text
fst_article = scraper.body.main.article.div
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', **locals())
app.run(debug=True)
HTML(视图)文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=2.0"/>
<title>Python Flask Web Scraper</title>
</head>
<body>
<!-- Python Flask Variables go here: -->
<h1> {{ head }} </h1>
<p>{{ snd_author }}</p>
<article>{{ fst_article }}</article>
</body>
</html>
问题出在尝试直接在 HTML 模板中呈现
fst_article
(这是一个
BeautifulSoup
对象)这一事实。Flask 模板引擎(Jinja)不知道如何直接呈现
BeautifulSoup
对象。
可以通过以下两种主要方法来解决此问题:
方法 1:在 Python 代码中提取和传递文本内容
这是更安全、更推荐的方法。与其传递整个
BeautifulSoup
对象,不如先提取想要在 HTML 模板中显示的文本内容。
from flask import Flask, render_template
from bs4 import BeautifulSoup as BS
import requests
src = requests.get('https://webscraper.netlify.app/').text
scraper = BS(src, 'lxml')
head = scraper.body.header.h1.text
snd_author = scraper.body.main.select_one('article:nth-of-type(2)').p.text
# 从 fst_article 对象中提取文本内容
fst_article_content = scraper.body.main.article.div.text
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html',
head=head,
snd_author=snd_author,
fst_article=fst_article_content)
app.run(debug=True)
在的 HTML 模板中,可以像这样使用
fst_article
:
<article>{{ fst_article }}</article>
方法 2:将 BeautifulSoup 对象转换为字符串(风险更大)
警告: 此方法可能存在安全风险,因为它可能会呈现来自抓取网站的意外 HTML 和 JavaScript,从而导致跨站点脚本 (XSS) 攻击。如果确定抓取的内容是安全的,则只能使用此方法。
在这种方法中,可以直接在 Python 代码中将
fst_article
对象转换为字符串:
from flask import Flask, render_template
from bs4 import BeautifulSoup as BS
import requests
# ... (其他代码相同)
fst_article = str(scraper.body.main.article.div)
# ... (其他代码相同)
然后,可以在 HTML 模板中按原样使用
fst_article
。
建议:
- 优先考虑方法 1, 因为它更安全,并且可以更好地控制在 HTML 模板中呈现的内容。
- 如果 必须 使用方法 2,请确保了解所涉及的安全风险,并对抓取的内容进行适当的清理和验证。
通过这两种方法中的任何一种,的 Flask 应用程序现在都应该能够在 Web 浏览器中正确呈现抓取的网站数据。
标签:python,html,flask,web-scraping From: 71043919