使用“另存为”下载的HTML与使用Python请求下载的HTML略有不同

时间:2019-05-12 20:54:03

标签: python html python-requests urllib

我使用了Beautiful Soup and Requests对表进行网页抓取,并测试我是否已经通过右键单击并使用“另存为”下载完整的HTML文件下载了网页。但是,当我在实际网站上测试网络抓取工具时,输出略有下降。因此,我使用请求使用以下代码将页面下载到另一个html文件中:

import { intercept } from '@loopback/context';
import {Log} from './Log'
  @intercept(log) // `log` is an interceptor function and above object
export class PingController {
//Your code
 }

并注意到,我要进行网络抓取的相关部分(表格)直到几个未关闭的标签都是一样的。 “另存为html”页面已正确关闭了标签,但是“请求”页面缺少某些标签的结尾。例如,“另存为”文档的所有标签均已关闭:

import requests

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

在Web开发中,“标记汤”是一个贬义性术语,指的是在语法上或结构上为网页编写的HTML。

Web浏览器有自己的解析器,可以纠正缺少的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 parserswikipedia tag soup