【问题标题】:HTML when downloaded with "Save As" slightly different than HTML downloaded using Python Requests使用“另存为”下载的 HTML 与使用 Python 请求下载的 HTML 略有不同
【发布时间】:2019-05-12 20:54:03
【问题描述】:

我使用 Beautiful Soup 和 Requests 来抓取表格,并测试我已经下载了一个网页,方法是右键单击并使用“另存为”下载完整的 HTML 文件。但是当我针对实际网站测试我的网络爬虫时,输出略有偏差。所以我使用 Requests 使用以下代码将页面下载到另一个 html 文件中:

import requests

r = requests.get("URL")
with open('page_content.html', 'w') as fid:
    fid.write(r.text)
fid.close()

并注意到我想要抓取的相关部分(表格)与几个未闭合的标签相同。 Save As html 页面已正确关闭标签,但 Requests 页面缺少某些标签的结尾。例如,“另存为”文档的所有标签都已关闭:

<td>
    <td>stuff</td>
</td>

但下载的请求文档缺少一些结束标记:

<td>
   <td>stuff
</td>

网站本身的格式正确,当我使用 Inspect 时,所有标签都已关闭。但是当我使用查看页面源时,我会看到缺少的标签。在 Chrome 中打开“请求下载”页面时,其格式正确。

这在尝试使用 BeautifulSoup 解析数据时给我带来了一些麻烦。

如何在不进入并右键单击下载我想要的每个页面的情况下获取带有正确关闭标签的 HTML 文档?

【问题讨论】:

  • 您将 DOM 上的视图(HTML 的浏览器解释)与原始 HTML 混淆了。

标签: python html python-requests urllib


【解决方案1】:

在网络开发中,“标签汤”是一个贬义词,指的是为网页编写的语法或结构不正确的 HTML。

网络浏览器有自己的解析器可以纠正丢失的 html 标签,幸运的是美丽的汤有html5lib 解析器也可以完成这项工作。

引自 bs4 官方文档:

这是使用 html5lib 解析的文档

BeautifulSoup("<a></p>", "html5lib")
# <html><head></head><body><a><p></p></a></body></html>
# Instead of ignoring the dangling </p> tag, html5lib pairs it with an opening <p> tag. 

这个解析器还会给文档添加一个空标签。

这是用 Python 内置的 HTML 解析器解析的同一个文档:

BeautifulSoup("<a></p>", "html.parser")
# <a></a>

进一步阅读和参考: bs4-difference between parsers, wikipedia tag soup

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多