2024-08-12



from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import subprocess
import os
 
def html_to_pdf(input_html, output_pdf):
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    desired_capabilities = DesiredCapabilities.CHROME
    desired_capabilities['printing.print_to_pdf'] = True
    desired_capabilities['loggingPrefs'] = {'browser': 'ALL'}
    with webdriver.Chrome(desired_capabilities=desired_capabilities, options=chrome_options) as driver:
        driver.get(input_html)
        pdf_data = driver.get_screenshot_as_png()  # 获取网页截图作为PDF的替代
        with open(output_pdf, 'wb') as file:
            file.write(pdf_data)
 
# 使用示例
html_to_pdf('http://example.com', 'example.pdf')

这段代码使用了Selenium和Chrome的无头模式来获取网页的屏幕截图,并假设网页的内容可以通过屏幕截图来表示。这种方法并不是将HTML转换为PDF,而是将网页内容的屏幕截图保存为PDF文件。如果需要真正的HTML到PDF转换,请考虑使用其他库,如weasyprintpdfkit

2024-08-12



import re
 
def clean_html_from_text(text):
    """
    使用正则表达式清洗文本字段中的 HTML 标签。
    :param text: 文本字段,可能包含 HTML 标签。
    :return: 清洗后的文本。
    """
    return re.sub(r'<.*?>', '', text)
 
# 示例使用
text_with_html = "这里是一些文本,其中包含<b>HTML</b>标签。"
clean_text = clean_html_from_text(text_with_html)
print(clean_text)  # 输出: 这里是一些文本,其中包含HTML标签。

这段代码定义了一个名为clean_html_from_text的函数,它接受一个字符串参数text并返回一个新的字符串,其中所有的 HTML 标签都被清除了。这个函数使用了正则表达式<.*?>来匹配任何尖括号包围的内容,并用空字符串替换它们。这是一个简单而有效的方法,用于清洗文本中的 HTML 标签。

2024-08-12

lxml是一个Python库,用于处理XML和HTML。它提供了一个强大而灵活的API,可以用来分析、导航和修改XML和HTML文档。

以下是一个使用lxml库解析HTML的例子:




from lxml import html
import requests
 
# 获取HTML内容
url = 'https://www.example.com'
r = requests.get(url)
r.raise_for_status()  # 检查请求是否成功
 
# 解析HTML
tree = html.fromstring(r.text)
 
# 使用XPath选择器找到元素
# 例如,找到所有的段落
paragraphs = tree.xpath('//p')
 
# 打印段落文本
for p in paragraphs:
    print(p.text_content())

在这个例子中,我们首先导入了lxml的html模块和requests库。然后,我们使用requests获取了网页内容,并使用fromstring方法将文本解析为lxml的Element对象。接下来,我们使用XPath选择器找到所有的段落元素,并打印它们的文本内容。这个例子展示了lxml库的基本用法,是进行Web数据抓取的一个有效工具。

2024-08-12



from lxml import etree
 
# 解析XML字符串
xml_data = """
<root>
    <item id="1">First Item</item>
    <item id="2">Second Item</item>
</root>
"""
xml_tree = etree.fromstring(xml_data)
print(xml_tree)
 
# 解析HTML字符串
html_data = """
<html>
    <head><title>Sample Title</title></head>
    <body>
        <p id="first">This is the first paragraph.</p>
        <p id="second">This is the second paragraph.</p>
    </body>
</html>
"""
html_tree = etree.HTML(html_data)
print(html_tree)
 
# XPath查询
result = html_tree.xpath('//p[@id="first"]/text()')
print(result)  # 输出段落文本
 
# 序列化XML为字符串
xml_str = etree.tostring(xml_tree, pretty_print=True)
print(xml_str.decode('utf-8'))

这段代码展示了如何使用lxml库来解析XML和HTML字符串,并使用XPath进行查询。然后,它将解析后的树序列化回字符串,并以可读的格式打印输出。这是一个处理XML和HTML数据的实用示例。

2024-08-12

在Python web开发中,结合Bootstrap可以使用CSS进行快速原型设计或简化开发过程。以下是一个使用Flask框架和Bootstrap的简单示例:

首先,安装Flask和Bootstrap:




pip install Flask

然后,创建一个简单的Flask应用并使用Bootstrap:




from flask import Flask, render_template
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == '__main__':
    app.run(debug=True)

在你的模板目录中创建index.html,并导入Bootstrap CDN:




<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask with Bootstrap Example</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-4">
        <h1 class="display-4 text-center">Hello, Bootstrap!</h1>
        <div class="alert alert-primary" role="alert">
            This is a simple alert—check it out!
        </div>
    </div>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</body>
</html>

这个例子展示了如何在Flask应用中使用Bootstrap。通过CDN链接,你可以利用Bootstrap提供的预定义样式和组件快速设计你的网页。

2024-08-12

在Python中执行JavaScript代码可以使用多种方法,以下是几种常见的方法:

  1. 使用execjs库:



import execjs
 
# 编译JavaScript的运行环境
context = execjs.compile('''
  function say_hello(name) {
    return "Hello, " + name + "!";
  }
''')
 
# 调用JavaScript函数
result = context.call('say_hello', 'World')
print(result)  # 输出: Hello, World!
  1. 使用Node.js内置的vm模块:



import subprocess
 
js_code = 'console.log("Hello, World!");'
subprocess.run(['node', '-e', f'console.log("Hello, World!");'])
  1. 使用PyV8库(需要预先安装):



import PyV8
 
def exec_js(js_code):
    with PyV8.JSContext() as context:
        context.eval(js_code)
 
exec_js('console.log("Hello, World!");')
  1. 使用selenium结合浏览器驱动来执行JavaScript:



from selenium import webdriver
 
driver = webdriver.Chrome()
driver.execute_script('console.log("Hello, World!");')
driver.quit()
  1. 使用requests结合html模板来执行JavaScript(例如在浏览器环境中):



import requests
from html import unescape
 
js_code = 'console.log("Hello, World!");'
response = requests.get(f'data:text/html,<script>{unescape(js_code)}</script>')

选择合适的方法取决于具体需求和环境配置。以上方法可以执行JavaScript代码,但请注意,某些方法可能需要额外的配置或依赖项,如Node.js、PyV8或WebDriver。

2024-08-12



from bs4 import BeautifulSoup
 
# 假设html_doc是包含HTML表格的字符串
html_doc = """
<table>
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <tr>
        <td>张三</td>
        <td>28</td>
    </tr>
    <tr>
        <td>李四</td>
        <td>35</td>
    </tr>
</table>
"""
 
soup = BeautifulSoup(html_doc, 'html.parser')
table = soup.find('table')
 
# 使用列表推导式来获取所有单元格数据
rows = [tr.find_all('td') for tr in table.find_all('tr')]
 
# 打印结果
for row in rows:
    print([cell.text for cell in row])

这段代码首先导入了BeautifulSoup库,并定义了一个包含HTML表格的字符串。然后使用BeautifulSoup解析这个字符串,并找到表格元素。接着使用列表推导式遍历所有行(tr元素),并获取每行的单元格(td元素)。最后,打印出每个单元格的文本内容。这个例子展示了如何使用Python和BeautifulSoup库来处理HTML表格数据。

2024-08-12



import requests
import json
 
# 定义一个函数来处理AJAX GET请求
def fetch_ajax_get(url, params=None, headers=None):
    # 发送请求
    response = requests.get(url, params=params, headers=headers)
    # 如果请求成功,解析JSON数据
    if response.status_code == 200:
        return response.json()
    else:
        print(f"请求失败,状态码:{response.status_code}")
        return None
 
# 示例URL和参数
ajax_url = "https://example.com/api/data"
params = {
    "param1": "value1",
    "param2": "value2"
}
headers = {
    "User-Agent": "your-user-agent",
    "Accept": "application/json"
}
 
# 调用函数获取数据
data = fetch_ajax_get(ajax_url, params=params, headers=headers)
 
# 输出获取到的数据
if data:
    print(json.dumps(data, indent=2))

这段代码定义了一个fetch_ajax_get函数,用于发送AJAX GET请求并获取JSON响应。它展示了如何使用requests库发送带参数和头信息的GET请求,以及如何检查请求是否成功,并处理返回的JSON数据。

2024-08-12

题目描述:

给定一个字符串s,请你找出一个字符串t,使得t是s的一个子序列且由字符"a"、"b"、"c"三种字符构成,且必须满足下列条件:

  1. "a" 只能在 "b" 前面;
  2. "b" 只能在 "c" 前面;
  3. 每种字符在t中出现的次数不超过s中该字符出现的次数。

请你输出满足条件的t的数量。

注意:子序列不一定需要连续。

输入描述:

输入为一行字符串s,只包含"a"、"b"、"c"三种字符。

输出描述:

输出一个整数,表示满足条件的t的数量。

示例:

输入:"abb"

输出:2

解释:满足条件的t有"a","ab","ac","bc"。

解题思路:

这是一个动态规划问题。我们可以定义一个三维数组dp,其中dp[i][j][k]表示s[0..i]中选择字符'a'j次,'b'k次的方案数。

状态转移方程为:

  • 如果s[i] == 'a',dp[i][j][k] = dp[i-1][j-1][k]
  • 如果s[i] == 'b',dp[i][j][k] = dp[i-1][j][k-1]
  • 如果s[i] == 'c',dp[i][j][k] = dp[i-1][j][k]

初始化:dp[0][0][0] = 1。

最终的答案是dp[s.length()-1][a\_count][b\_count],其中a\_count和b\_count分别是s中'a'和'b'的数量。

代码实现:

Java版本:




public class Main {
    public static void main(String[] args) {
        String s = "abb";
        System.out.println(countValidT(s));
    }
 
    public static int countValidT(String s) {
        int[] aCount = {0, 0};
        int[] bCount = {0, 0};
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (c == 'a') {
                aCount[0]++;
            } else if (c == 'b') {
                aCount[1]++;
            } else {
                bCount[1]++;
            }
        }
        return dp(chars.length, aCount[0], bCount[0]);
    }
 
    public static int dp(int n, int aCount, int bCount) {
        int[][][] dp = new int[n][aCount + 1][bCount + 1];
        dp[0][0][0] = 1;
        for (int i = 0; i < n; i++) {
            char c = i < n ? (char) ('a' + (int) (Math.random() * 3)) : 'c';
            for (int j = 0; j <= aCount; j++) {
                for (int k = 0; k <= bCount; k++) {
                    if (c == 'a') {
                        if (j - 1 >= 0) {
                            dp[i][j][k] += dp[i - 1][j - 1][k];
                        }
                    } else if (c == 'b') {
                        if (k - 1 >= 0) {
                            dp[i][j][k] += dp[i - 1][j][k - 1];
                        }
                    } else {
                        dp[i][j][k] += dp[i - 1][j][k];
                    }
2024-08-11

为了在Flutter中实现与Python后端的验证码登录功能,你需要完成以下步骤:

  1. 在Flutter端构建登录页面,并从用户那里获取用户名和密码。
  2. 在Flutter端发送HTTP请求到Python后端,携带用户名和密码。
  3. 在Python后端,验证用户名和密码,并生成验证码。
  4. 在Python后端,验证验证码的正确性并返回验证结果。

以下是实现这些步骤的简要代码示例:

Flutter端(Dart):




import 'package:http/http.dart' as http;
 
Future<void> login(String username, String password, String captcha) async {
  final url = 'http://your-python-backend-url/login';
  final response = await http.post(
    Uri.parse(url),
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'username': username,
      'password': password,
      'captcha': captcha,
    }),
  );
 
  if (response.statusCode == 200) {
    // 登录成功处理
    print('登录成功: ${response.body}');
  } else {
    // 登录失败处理
    print('登录失败: ${response.body}');
  }
}

Python后端(Flask):




from flask import Flask, request, jsonify
import redis
 
app = Flask(__name__)
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
 
@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')
    captcha = request.json.get('captcha')
 
    # 假设验证码正确,实际应用中需要验证验证码是否与存储的相符
    if captcha and captcha == redis_client.get(username):
        # 验证用户名和密码
        if username == 'user' and password == 'pass':
            return jsonify({'message': '登录成功'}), 200
        else:
            return jsonify({'message': '用户名或密码错误'}), 401
    else:
        return jsonify({'message': '验证码错误'}), 401
 
if __name__ == '__main__':
    app.run(debug=True)

确保Redis服务器运行在默认端口6379上,并且你已经安装了Flask和redis的Python库。

在实际应用中,你需要加入更多的安全措施,比如密码加密、CSRF保护、session管理等。这只是一个简化示例,用于演示如何在Flutter和Python之间实现验证码登录。