首页 文章

BeautifulSoup和php / html文件

提问于
浏览
3

我一直在使用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 回答

  • 1

    回答我自己的问题...... :)

    我使用了解决方案#4:通过在它们周围插入HTML注释,以编程方式保护解析器中的所有 <?php ?> 标记 . 解析器然后跳过解释注释中的任何内容 . 稍后,当使用 soup.prettify()soup.contents 时,输出可以直接用 <? 替换 <!--<? ,同样用于关闭标签 .

    请注意,这不适用于在某些HTML标记内生成动态内容的PHP标记,例如:

    <a href= "<? echo foo_bar(); ?>" >
    

    当前版本的 html.parserlxmlhtml5lib 都将此解释为 <a> 的一系列无意义属性,即使PHP标记包含在HTML注释中也是如此 . 在这种情况下,我用regex手动提取标签,以解决我的问题 .

相关问题