首页 > 解决方案 > 如何使用漂亮的汤从保存的 html 页面中删除 td 行号和行内容类

问题描述

我通过查看源代码保存了网页 html 内容。我这样做是因为我无法连接到网页,因为它处于 citrix 环境中。我遇到的问题是,当我读取保存的html文件并使用漂亮的汤来读取内容时,它创建了一个额外的表格元素,该元素在 td 元素中具有实际的 html 内容。

我检查了这一点,因为起初我试图简单地使用该find_all函数来查找h2元素,但它是一个空列表。相反,我必须先找到html, body,table元素,然后从那里我能够td从其中的页面中获取所有具有实际 html 内容的元素,就像这样;

from bs4 import BeautifulSoup

url = open("C:\\Users\\m\Documents\common\\cramer.html")
content = url.read()
soup = BeautifulSoup(content, "lxml")
html = soup.find('html')
body = html.find('body')
table = body.find('table')
tds = table.find_all('td')

这会产生;

[
 <td class="line-number" value="380"></td>,
 <td class="line-content"><span class="html-tag">&lt;/tr&gt;</span></td>,
 <td class="line-number" value="381"></td>,
 <td class="line-content"><span class="html-tag">&lt;/table&gt;</span></td>,
 <td class="line-number" value="382"></td>,
 <td class="line-content"><span class="html-tag">&lt;/div&gt;</span></td>,
 <td class="line-number" value="383"></td>,
 <td class="line-content"><span class="html-end-of-file"></span></td>]

可以看出,它创建了两个额外的td元素,一个带有“line-number”类,另一个带有“line-content”类,其中包含元素内站点页面的实际html内容span。有没有正确的方法来获得这个而不是介于两者&lt之间&gt

解决了

我是从视图页面源中保存它的。相反,我只需要另存为。

标签: web-scrapingbeautifulsoup

解决方案


我可以通过在页面上右键单击鼠标然后单击“另存为..”(热键Ctrl+s)而不是右键单击鼠标然后单击“查看页面源代码”(热键Ctrl+U)来解决此问题,这会打开代码的源页面。

所以使用代码;

from bs4 import BeautifulSoup
from pathlib import Path


data_folder = Path("C:/Users/user/common/")
file_to_open = data_folder  / "mbh.html"
content = open(file_to_open)
content = content.read()
soup = BeautifulSoup(content, "lxml")

在没有额外表格元素的情况下使用soup.find('div',{'class':'content'})产生了正确的结果;

In [5]: soup.find('div',{'id':'content'})
Out[5]: 
<div id="content">
<h1>Some content Header</h1>
<p class="info">Some info, many more elements</p>

推荐阅读