Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用BeautifulSoup连接两个html文件体?_Python_Html_Beautifulsoup - Fatal编程技术网

Python 如何用BeautifulSoup连接两个html文件体?

Python 如何用BeautifulSoup连接两个html文件体?,python,html,beautifulsoup,Python,Html,Beautifulsoup,我需要将两个html文件的主体连接成一个html文件,中间有一点任意html作为分隔符。我有用于此的代码,但当我从Xubuntu 11.10(或者是11.04?)升级到12.10时停止了工作,可能是因为BeautifulSoup更新(我目前使用的是3.2.1;我不知道以前的版本)或vim更新(我使用vim从纯文本自动生成html文件)。这是代码的精简版本: from BeautifulSoup import BeautifulSoup soup_original_1 = BeautifulSou

我需要将两个html文件的主体连接成一个html文件,中间有一点任意html作为分隔符。我有用于此的代码,但当我从Xubuntu 11.10(或者是11.04?)升级到12.10时停止了工作,可能是因为BeautifulSoup更新(我目前使用的是3.2.1;我不知道以前的版本)或vim更新(我使用vim从纯文本自动生成html文件)。这是代码的精简版本:

from BeautifulSoup import BeautifulSoup
soup_original_1 = BeautifulSoup(''.join(open('test1.html')))
soup_original_2 = BeautifulSoup(''.join(open('test2.html')))
contents_1 = soup_original_1.body.renderContents()
contents_2 = soup_original_2.body.renderContents()
contents_both = contents_1 + "\n<b>SEPARATOR\n</b>" + contents_2
soup_new = BeautifulSoup(''.join(open('test1.html')))
while len(soup_new.body.contents):
    soup_new.body.contents[0].extract()
soup_new.body.insert(0, contents_both)                       
\n'和
内容\u 2
'\n\n分隔符\n\n
for element in soup_original_2.body:
    soup_original_1.body.append(element)

试图将HTML作为文本读取,只是为了将其插入HTML中,并在两个方向上进行编码和解码,这会产生大量额外的工作,很难做到正确

最简单的就是不要那样做。您希望在test1主体中的所有内容之后插入test2主体中的所有内容,对吗?那么就这么做吧:

要首先附加分隔符,只需对分隔符执行相同的操作:

就这样


有关涵盖所有这些内容的教程,请参见文档部分。

正如abarnert对答案的评论中所述,append存在问题

这是Martijn Pieters写的♦ 他做这项工作

从BeautifulSoup 4.4(2015年7月发布)开始,您可以使用:


我在html文档和元素循环方面遇到了问题。我发现BeautifulSoup没有成功解析我的一些HTML文件。最后,我在body标记内的所有元素周围插入了一个标记:


:
这意味着所有元素都包含在一个span元素中并成功处理。我想深入了解当我不这么做的时候到底发生了什么,但这是解决你可能遇到的问题的一种方法

def insertSpan(htmlString):
'''
在所有正文内容周围插入范围标记:
....
'''
subRe=re.compile(r'()(.*)()',re.DOTALL)
htmlString=subRe.sub(“\g\g\g”,htmlString)
返回htmlString

如果您试图将HTML正文作为文本而不是HTML插入,则无法停止BeautifulSoup对文本进行编码,因为否则结果将毫无意义。您可能想做的是将两个实体的所有子实体连接为HTML,然后将其包装回一个实体标记中?作为旁注,
'.join(open('test1.HTML'))
使事情变得过于复杂。你把文件分成几行,只是为了把这些行重新连接成一个大字符串。为什么不首先使用
read
方法将文件作为一个大字符串获取?(另外,你真的不应该像这样泄露文件;使用
with
语句来关闭它们。)@abarnert原始版本确实使用
with
语句,我只是想要一个单行程序,以便于测试。关于代码>阅读>代码>的好处。另一方面,你确实应该考虑升级到漂亮的汤4。尤其是当你刚刚升级到一个你不理解的版本时。当3.2.1已经过时、不再受支持且没有很好的文档记录时,如果你可以学习当前版本,为什么还要费心学习它的所有细节呢?我的可能副本在将元素从一个“汤”添加到另一个“汤”时遇到了麻烦。追加
copy.deepcopy(元素)
help。是的,.append有问题--它从源代码中删除内容。因此,如果您正在对输入进行循环,比如说“soup.contents中的for ii”,那么由于源条目ii在第一次追加后被删除,循环将无法正常工作。@EricSmith我们如何定义
soup
?就像是
soup=beautifulsou(“”)
?因为我得到了
AttributeError:“NoneType”对象没有属性“body”
当我尝试以下行时:
soup.soup\u original\u 1.body.append(b)
@Newskooler这只是一个打字错误,它应该是
soup\u original\u 1.body.append(b)
(用下划线
\u而不是点
)。
for element in soup_original_2.body:
    soup_original_1.body.append(element)
b = soup.new_tag('b')
b.append('SEPARATOR')
soup.original_1.body.append(b)
for element in soup_original_2.body:
    soup_original_1.body.append(element)
import copy

document2.body.append(copy.copy(element))
<body><span id="entirebody">
:
</span></body>
def insertSpan(htmlString):
    '''
    Insert a span tag around all of body contents:

    <body><span id="entirebody">....</span></body>
    '''
    subRe = re.compile(r'(<body>)(.*)(<\/body>)', re.DOTALL)
    htmlString = subRe.sub("\g<1><span id=\"entirebody\">\g<2></span>\g<3>",htmlString)
    return htmlString