使用html2text将目录设置为包含子目录

时间:2014-06-26 14:21:13

标签: php html mysql subdirectory

长期读者,第一次海报。我知道php很危险,这是我第一个使用它的BIG项目。

一些背景知识:

我有超过100万(是的,百万).html文件是从旧的新闻采集程序生成的。这些.html文件包含需要每天搜索的重要存档信息。我还没有到达其他服务器,这些服务器可能会有更多,所以2-3百万+不是不可能的。

我正在使用这些.html文件并将它们转移到mysql数据库中。至少,到目前为止,代码已经完成了几百个测试文件。我会在最后附上代码。

问题在.html文件存档时开始,并且它是生成无法更改的存档的框的功能,文件是否进入文件夹。他们像这样分解

  

档案>年>&月GT; file.html

所以一个例子是

archives>2002>05may>lots and lots of files.html
archives>2002>06june>lots and lots of files.html
archives>2002>07july>lots and lots of files.html

通过帮助和研究,我编写了代码来删除包含html2text和simple_html_dom的标记文件,并将每个标记的信息放在我的数据库的正确字段中,这非常有用。但是所有文件都需要移动到同一目录才能工作。同样,超过一百万甚至更多的其他服务器需要花费很长时间才能移动。我现在使用批处理文件来复制文件。

我的问题是:

我可以使用某种通配符来定义所有子目录,这样我就不必移动所有文件了,它们可以在各自的目录中显示数据吗?

我的代码顶部:

// Enter absolute path of folder with HTML files in it here (include trailing slash):
$directory = "C:\\wamp1\\www\\name\\search\\files\\";

子目录位于files目录下。

在我搜索答案时,我已经看到了#34;你为什么要这样做?"或者其他问题询问目录中的.exe文件或.bat文件以及它们如何危险,所以不要这样做。我的问题只是针对这些html文件,所以没有任何东西被调用或运行,没有危险。

这是我将html剥离到数据库的代码。再次,效果很好,但我想跳过必须将所有文件移动到一个目录的步骤。

<?php

// Enter absolute path of folder with HTML files in it here (include trailing slash):
$directory = "C:\\wamp1\\www\\wdaf\\search\\files\\";

// Enter MySQL database variables here:
$db_hostname = "localhost";
$db_username = "root";
$db_password = "password";
$db_name = "dbname";
$db_tablename = "dbtablename";

/////////////////////////////////////////////////////////////////////////////////////
// Include these files to strip all characters that we don't want
include_once("simple_html_dom.php");
include_once("html2text.php");

//Connect to the database
mysql_connect($db_hostname, $db_username, $db_password) or trigger_error("Unable to connect to the database host: " . mysql_error()); 
mysql_select_db($db_name) or trigger_error("Unable to switch to the database: " . mysql_error()); 

//scan the directory and look for all the htmls files
$files = scandir($directory);
for ($filen = 0; $filen < count($files); $filen++)  {
    $html = file_get_html($directory . $files[$filen]);

    // first check if $html->find exists
    if (method_exists($html,"find")) {

        // then check if the html element exists to avoid trying to parse non-html
        if ($html->find('html')) {

                    //Get the filename of the file from which it will extract   
            $filename = $files[$filen];

            //define the path of the files
            $path = "./files/";

            //Combine the patha and filename
            $fullpath = $path . $filename;


            // Get our variables from the HTML: Starts with 0 as the title field so use alternate ids starting with 1 for the information
            $slug = mysql_real_escape_string(convert_html_to_text($html->find('td', 8)));
            $tape = mysql_real_escape_string(convert_html_to_text($html->find('td', 9)));
            $format0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 10)));
            $time0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 11)));
            $writer = mysql_real_escape_string(convert_html_to_text($html->find('td', 12)));
            $newscast = mysql_real_escape_string(convert_html_to_text($html->find('td', 13)));
            $modified = mysql_real_escape_string(convert_html_to_text($html->find('td', 14)));
            $by0 = mysql_real_escape_string(convert_html_to_text($html->find('td', 15)));
            $productionCues = mysql_real_escape_string(convert_html_to_text($html->find('td', 16)));
            $script = mysql_real_escape_string(convert_html_to_text($html->find('td', 18)));

            // Insert variables into a row in the MySQL table:
            $sql = "INSERT INTO " . $db_tablename . " (`path`, `fullpath`, `filename`, `slug`, `tape`, `format0`, `time0`, `writer`, `newscast`, `modified`, `by0`, `productionCues`, `script`) VALUES ('" . $path . "', '" . $fullpath . "', '" . $filename . "', '" . $slug . "', '" . $tape . "', '" . $format0 . "', '" . $time0 . "', '" . $writer . "', '" . $newscast . "', '" . $modified . "', '" . $by0 . "', '" . $productionCues . "', '" . $script . "');"; 
            $sql_return = mysql_query($sql) or trigger_error("Query Failed: " . mysql_error()); 
        }
    }
}
?>

提前致谢, 麦克

2 个答案:

答案 0 :(得分:0)

只是想更新这篇文章,回答我的问题很有效。在一些帮助下,我们发现scandir递归使用来创建一个数组是可行的。 我以为我会发布这个,所以如果其他人想要做类似的事情,他们将不会看得太远!我知道我喜欢看到答案!

代码来自第二个用户提供的注释,只有一些修改:http://php.net/manual/en/function.scandir.php

所以在上面的代码中,我替换了

//scan the directory and look for all the htmls files
$files = scandir($directory);
for ($filen = 0; $filen < count($files); $filen++)  {
    $html = file_get_html($directory . $files[$filen]);

function import_dir($directory, $db_tablename) { 

   $cdir = scandir($directory); 
   foreach ($cdir as $key => $value) 
   { 
      if (!in_array($value,array(".",".."))) 
      { 
         if (is_dir($directory . DIRECTORY_SEPARATOR . $value)) 
         { 
            // Item in this directory is sub-directory...
            import_dir($directory . DIRECTORY_SEPARATOR . $value,$db_tablename); 
         } 
         else 
            // Item in this directory is a file...
         { 
            $html = file_get_html($directory . DIRECTORY_SEPARATOR . $value);

然后对于文件名,替换

//Get the filename of the file from which it will extract   
            $filename = $files[$filen];

            //define the path of the files
            $path = "./files/";

            //Combine the patha and filename
            $fullpath = $path . $filename;

//Get the filename of the file from which it will extract   
                    $filename = mysql_real_escape_string($value);

                    //define the path of the files
                    $path = mysql_real_escape_string($directory . DIRECTORY_SEPARATOR);

                    //Combine the patha and filename
                    $fullpath = $path . $value;

感谢那些回答的人!

麦克

答案 1 :(得分:-1)

我不确定在你的PHP查询超时之前还需要多长时间,但是有一个内置函数RecursiveDirectoryIterator,听起来它可能对你有用。