我一直在使用BeautifulSoup将一些古老的HTML文件中的相对URL从归档网站转换为绝对URL(大多数情况下,它们可以通过.htaccess规则更好地定位) . 这部分我已经下来了:搜索某些标签及其atts,使用urllib.parse.urljoin(这是Python3)来纠正 . 精细 .
但是,从本网站的后期开始,此集合中还有一些.php文件 . 他们大多使用3-5行来包含其他.php文件,其余的是HTML,尽管有一些例外 .
Problem: BeautifulSoup解析器尝试解释 <?php ?>
标记之间的内容 . 事实上,似乎有些情况下他们只是抛弃了尖括号,但留下了问号 - 我不明白地解决的行为:
for c in soup.contents:
c = str(c) # previously a BeautifulSoup Tag
# I don't need soup after this point, hence not reconstructing contents
c = ('<' if c.startswith('?') else '') + c
c = c + ('>' if c.endswith('?') else '')
但无论如何,我注意到整个 <?php ?>
标签经常被破坏,取决于解析器 . 例如,html5lib解析器采用以下行:
<?
//echo "BEGIN PAGE: " . $_SESSION["i"]."<br>";
include ('util.php');
并将标记解释为 >
结束 <br>
.
我更喜欢发生的是让php标签保持不变 . (显然,在一个理想的世界中,解析器会读取它们并处理任何内部HTML,但这似乎要求太多!)
Possible solutions
-
跳过.php文件,只能使用.html - 正在完成的工作不是必需的,只是一个优化,所以不会有大的损失;
-
找到更好处理这些案例的文档中未提及的BeautifulSoup解析器;
-
自我解析文本,提取所有
<?php ?>
块,并在使用BeautifulSoup完成工作后重新插入,注意回忆它们应该落在哪里(如果这些数千个文件中的任何一个在HTML行中间有<?php echo 'foobar' ?>
,则可能非常困难, 例如) -
与上述类似,以编程方式保护解析器中的所有
<?php ?>
标记,例如在他们周围插入HTML评论,然后在汤后删除保护
1 回答
回答我自己的问题...... :)
我使用了解决方案#4:通过在它们周围插入HTML注释,以编程方式保护解析器中的所有
<?php ?>
标记 . 解析器然后跳过解释注释中的任何内容 . 稍后,当使用soup.prettify()
或soup.contents
时,输出可以直接用<?
替换<!--<?
,同样用于关闭标签 .请注意,这不适用于在某些HTML标记内生成动态内容的PHP标记,例如:
当前版本的
html.parser
,lxml
和html5lib
都将此解释为<a>
的一系列无意义属性,即使PHP标记包含在HTML注释中也是如此 . 在这种情况下,我用regex手动提取标签,以解决我的问题 .