from bs4 import BeautifulSoup soup1 = BeautifulSoup(open("index.html"),features='lxml') print(soup1.prettify())
时间: 2023-10-28 12:55:42 浏览: 131
这段代码使用了Python的BeautifulSoup库来解析HTML文件。首先导入了BeautifulSoup模块,然后使用open函数打开名为"index.html"的文件,并使用lxml解析器来解析HTML。接着将解析后的HTML文件转换为Unicode编码,并使用prettify()方法美化输出,最后将结果打印出来。这样能够让HTML文件的结构更加清晰易读。
相关问题
优化这段代码:import requests import pandas as pd from bs4 import BeautifulSoup from lxml import etree import time import pymysql from sqlalchemy import create_engine from urllib.parse import urlencode # 编码 URL 字符串 start_time = time.time() #计算程序运行时间 def get_one_page(i): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36' } paras = {'reportTime': '2023-03-23', #可以改报告日期,比如2018-6-30获得的就是该季度的信息 'pageNum': i #页码 } url = 'http://s.askci.com/stock/a/?' + urlencode(paras) response = requests.get(url,headers = headers) if response.status_code == 200: return response.text return None except RequestException: print('爬取失败') def parse_one_page(html): soup = BeautifulSoup(html,'lxml') content = soup.select('#myTable04')[0] #[0]将返回的list改为bs4类型 tbl = pd.read_html(content.prettify(),header = 0)[0] # prettify()优化代码,[0]从pd.read_html返回的list中提取出DataFrame tbl.rename(columns = {'序号':'serial_number', '股票代码':'stock_code', '股票简称':'stock_abbre', '公司名称':'company_name', '省份':'province', '城市':'city', '主营业务收入(201712)':'main_bussiness_income', '净利润(201712)':'net_profit', '员工人数':'employees', '上市日期':'listing_date', '招股书':'zhaogushu', '公司财报':'financial_report', '行业分类':'industry_classification', '产品类型':'industry_type', '主营业务':'main_business'},inplace = True) return tbl def generate_mysql(): conn = pymysql.connect( host='localhost', user='root', password='******', port=3306, charset = 'utf8', db = 'wade') cursor = conn.cursor() sql = 'CREATE TABLE IF NOT EXISTS listed_company (serial_number INT(20) NOT NULL,stock_code INT(20) ,stock_abbre VARCHAR(20) ,company_name VARCHAR(20) ,province VARCHAR(20) ,city VARCHAR(20) ,main_bussiness_income VARCHAR(20) ,net_profit VARCHAR(20) ,employees INT(20) ,listing_date DATETIME(0) ,zhaogushu VARCHAR(20) ,financial_report VARCHAR(20) , industry_classification VARCHAR(20) ,industry_type VARCHAR(100) ,main_business VARCHAR(200) ,PRIMARY KEY (serial_number))' cursor.execute(sql) conn.close() def write_to_sql(tbl, db = 'wade'): engine = create_engine('mysql+pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db)) try: tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False) # append表示在原有表基础上增加,但该表要有表头 except Exception as e: print(e) def main(page): generate_mysql() for i in range(1,page): html = get_one_page(i) tbl = parse_one_page(html) write_to_sql(tbl) # # 单进程 if __name__ == '__main__': main(178) endtime = time.time()-start_time print('程序运行了%.2f秒' %endtime) # 多进程 from multiprocessing import Pool if __name__ == '__main__': pool = Pool(4) pool.map(main, [i for i in range(1,178)]) #共有178页 emdtime = time.time()-start_time print('程序运行了%.2f秒' %(time.time()-start_time))
这段代码已经很简洁了,但是可以通过以下方式进行优化:
1. 导入模块时可以将相同的模块放在一起,如将requests和pandas放在一起,将BeautifulSoup和lxml放在一起。
2. 导入模块时可以只导入需要的部分,如只导入urlencode函数。
3. 可以将函数或代码段封装成函数或类,使代码结构更清晰。
files_dir = "/Users/hh/Desktop/python/fileshunan" def savefiles(): # 当前页码 pageno = driver.find_element(By.CSS_SELECTOR, "ul.pagination li.active button").text print("page", pageno) # 获取规划文件列表 filelist = driver.find_elements(By.CSS_SELECTOR, "div.card-body ul li") # 循环规划文件 for file in filelist: # 获取规划文件链接标签 a = file.find_element(By.TAG_NAME, "a") # 规划文件名称 filename = a.text # 规划文件地址 url = a.get_attribute("href") # 只保存纲要文件 outlines = file.find_elements(By.CSS_SELECTOR, "span.badge-warning") if len(outlines) > 0: # 获取规划文件后面可能存在的PDF徽标 pdfs = file.find_elements(By.CSS_SELECTOR, "span.badge-light") if len(pdfs) > 0: # 如果存在PDF徽标,则为PDF格式文件 url = url.replace("plan", "planpdf") print(filename, url) r = requests.get(url) with open(files_dir + filename + ".pdf", 'wb') as f: f.write(r.content) else: # 如果不存在PDF徽标,则为HTML格式文件 print(filename, url) r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') with open(files_dir + filename + ".html", 'wt', encoding="utf-8") as f: f.write(soup.select_one("#plancontent").prettify())
根据你提供的代码,你似乎想要下载规划文件并保存到指定的文件夹中。我注意到你使用了 Selenium 和 BeautifulSoup 库来解析网页内容。
首先,确保你已经导入了需要的库,如下所示:
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import requests
```
然后,在 `savefiles()` 函数中,你可以使用以下代码来保存规划文件:
```python
def savefiles():
# 当前页码
pageno = driver.find_element(By.CSS_SELECTOR, "ul.pagination li.active button").text
print("page", pageno)
# 获取规划文件列表
filelist = driver.find_elements(By.CSS_SELECTOR, "div.card-body ul li")
# 循环规划文件
for file in filelist:
# 获取规划文件链接标签
a = file.find_element(By.TAG_NAME, "a")
# 规划文件名称
filename = a.text
# 规划文件地址
url = a.get_attribute("href")
# 只保存纲要文件
outlines = file.find_elements(By.CSS_SELECTOR, "span.badge-warning")
if len(outlines) > 0:
# 获取规划文件后面可能存在的PDF徽标
pdfs = file.find_elements(By.CSS_SELECTOR, "span.badge-light")
if len(pdfs) > 0:
# 如果存在PDF徽标,则为PDF格式文件
url = url.replace("plan", "planpdf")
print(filename, url)
r = requests.get(url)
with open(files_dir + filename + ".pdf", 'wb') as f:
f.write(r.content)
else:
# 如果不存在PDF徽标,则为HTML格式文件
print(filename, url)
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
with open(files_dir + filename + ".html", 'wt', encoding="utf-8") as f:
f.write(soup.select_one("#plancontent").prettify())
```
在上述代码中,我们首先获取当前页码,并打印出来。然后,通过 `driver.find_elements()` 方法获取规划文件列表。
接下来,我们循环遍历每个规划文件,并获取文件的链接标签、文件名称和文件地址。
我们使用 `file.find_elements()` 方法检查是否有纲要文件的标记。如果有,我们进一步检查是否存在 PDF 徽标,以确定文件的格式。如果存在 PDF 徽标,我们将构建相应的 URL,并使用 `requests.get()` 方法下载该文件,并将内容保存到指定的文件夹中。
如果不存在 PDF 徽标,则说明文件为 HTML 格式。我们使用 `requests.get()` 方法下载该文件,并使用 BeautifulSoup 解析 HTML 内容。然后,我们将解析后的内容写入到指定的 HTML 文件中。
请确保你已经设置好了 `files_dir` 变量,它指定了保存文件的目录路径。
请注意,以上代码仅供参考,并需要根据你的实际页面结构和需求进行适当的修改。另外,记得导入所需的库。
如果你有任何进一步的问题,请随时提问。
阅读全文