使用 python 3.5 从静态 HTML 文件中提取数据

Posted

技术标签:

【中文标题】使用 python 3.5 从静态 HTML 文件中提取数据【英文标题】:Extract data from STATIC HTML FILE using python 3.5 【发布时间】:2017-05-17 02:56:53 【问题描述】:

我在本地机器上保存了静态 html 页面。我尝试使用简单的文件打开和 BeautifulSoup。打开文件时,由于 unicode 错误,它不会读取整个 html 文件,而 BeautifulSoup 它适用于实时网站。

#with beautifulSoup
from bs4 import BeautifulSoup
import urllib.request
url="Stack Overflow.html"
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page.read())
universities=soup.find_all('a',class_='institution')
for university in universities:
    print(university['href']+","+university.string)


#Simple file read
with open('Stack Overflow.html', encoding='utf-8') as f:
    for line in f:
        print(repr(line))

阅读 HTML 后,我希望从 ulli 中提取没有任何属性的数据。欢迎任何建议。

【问题讨论】:

您遇到了哪些错误?您究竟想从页面中提取什么?发布 HTML 内容(相关部分)和您想要的输出。 问题已解决,感谢大家的帮助!! 【参考方案1】:

我不知道你到底是什么意思。我只是了解您想从本地存储中读取整个 html 数据并使用 bs4 解析一些 DOM。

对吗?

我在这里建议一些代码:

from bs4 import BeautifulSoup

with open("Stack Overflow.html", encoding="utf-8") as f:
    data = f.read()
    soup = BeautifulSoup(data, 'html.parser')
    # universities = soup.find_all('a', class_='institution')
    # for university in universities:
    #     print(university['href'] + "," + university.string)
    ul_list = soup.select("ul")
    for ul in ul_list:
        if not ul.attrs:
            for li in ul.select("li"):
                if not li.attrs:
                    print(li.get_text().strip())

【讨论】:

是的,我的机器上有一个 HTML 文件,我希望解析和提取列表标签之间的值,该标签没有 BS4 的任何属性 如何从标签示例中提取值 文本文件的内容: ,它没有值 @user73324 我修改了一些代码。请再次查看代码。但我不确定你到底想要什么。如果该代码有误,请让我看一些本地 html 示例并输出您期望的内容。 我尝试运行它但没有返回任何值: 依赖检查版本:1.4.3 报告生成时间:2016 年 12 月 30 日 13:33:27 UTC 扫描的依赖项: 0(0 个唯一) 易受攻击的依赖项: 0 发现漏洞: 0 漏洞抑制: 0 ... with open('dependency-check-report.html', encoding='utf-8') as f: data = f.read() soup = BeautifulSoup(data, 'html.parser' ) li_list = soup.select("li") for li in li_list: if not li.attrs: for i in li.select("li"): if not i.attrs: print(i.get_text().strip( ))【参考方案2】:

这个问题是关于如何构造一个 BeautifulSoup 对象。

要解析文档,请将其传递给 BeautifulSoup 构造函数。你 可以传入一个字符串或一个打开的文件句柄:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html"))

soup = BeautifulSoup("<html>data</html>")

给BeautifulSoup传递一个文件对象即可,不需要专门添加编码信息,BS会处理。

首先,将文档转换为 Unicode,然后将 HTML 实体转换为 转换为 Unicode 字符:

如果您在提取数据时遇到问题,您应该发布 html 代码。

摘录:

import bs4

html = '''<ul class="indent"> <li><i>dependency-check version</i>: 1.4.3</li> <li><i>Report Generated On</i>: Dec 30, 2016 at 13:33:27 UTC</li> <li><i>Dependencies Scanned</i>:&nbsp;0 (0 unique)</li> <li><i>Vulnerable Dependencies</i>:&nbsp;0</li> <li><i>Vulnerabilities Found</i>:&nbsp;0</li> <li><i>Vulnerabilities Suppressed</i>:&nbsp;0</li> <li class="scaninfo">...</li>'''

soup = bs4.BeautifulSoup(html, 'lxml')
for i in soup.find_all('li', class_=False):
    print(i.text)

出来:

dependency-check version: 1.4.3
Report Generated On: Dec 30, 2016 at 13:33:27 UTC
Dependencies Scanned: 0 (0 unique)
Vulnerable Dependencies: 0
Vulnerabilities Found: 0
Vulnerabilities Suppressed: 0

【讨论】:

依赖检查版本:1.4.3 报告生成时间:2016 年 12 月 30 日 13:33:27 UTC 扫描的依赖项: 0(0 个唯一) 易受攻击的依赖项: 0 发现漏洞: 0 漏洞被抑制: 0 ... with open('C:/dependency-check-report.html') as f: data = f.read() soup = BeautifulSoup(data, 'html.parser') li_list = soup. select('li') for li_list: dat = li.get_text() if dat.find(pairKeynameNumVulnDependencies) != -1: numVulnDependencies = re.findall(r'([0-9])', dat) if int(numVulnDependencies[0]) > 0: print("No") else: print("Go")

以上是关于使用 python 3.5 从静态 HTML 文件中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu下将python从2.7升级到3.5

python从2.7升级到3.5 需要主要的问题

如何使用内置的Python 3.5模块为登录脚本创建数据库

Python 3.5学习笔记(第二周)

python 3.5(socket)

在Pyspark中使用时,具有静态文件依赖性的python包无法读取静态文件