【问题标题】:Problem with AJAX and PHP!AJAX 和 PHP 的问题!
【发布时间】:2011-06-25 06:49:25
【问题描述】:

我有一个 PHP 页面,它将从 downloads.nl 收集 mp3 链接。结果将转换为 XML 并呈现良好。
当我尝试使用 ajax 读取该 XML 时,就会出现问题。这些文件在同一个域上,这真的让我很困惑。这是我的 php 爬虫。

    <?php
header("Content-type: text/xml");
$artistname = $_GET['artistname'];
$trackname = $_GET['trackname'];
$newartistname = str_replace(" ","+",$artistname);
$newtrackname = str_replace(" ","+",$trackname);
$target_url = "http://www.downloads.nl/results/mp3/1/".$newartistname."+".$newtrackname;
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';
error_reporting(0);

// make the cURL request to $target_url
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html= curl_exec($ch);
if (!$html) {
    echo "<br />cURL error number:" .curl_errno($ch);
    echo "<br />cURL error:" . curl_error($ch);
    exit;
}

// parse the html into a DOMDocument
$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
echo '<?xml version="1.0"?>';
echo '<downloads>';
echo '<trackname>'.$newartistname."+".$newtrackname.'</trackname>';
for ($i = 0; $i < $hrefs->length; $i++) {
    $href = $hrefs->item($i);
    $url = $href->getAttribute('href');
        if(strpos($url, ".cgi")){
            echo '<link>http://downloads.nl'.htmlspecialchars($url,ENT_QUOTES).'</link>';
          }
}
echo '</downloads>';
?>

这是我的 javascript 函数

 function getDownloadLink(artistname,trackname){
        var xmlhttp4;
        if (window.XMLHttpRequest){
            xmlhttp4 = new XMLHttpRequest();
        }
        else{
            xmlhttp4 = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp4.onreadystatechange=function(){
            alert(xmlhttp4.readyState);
            if (xmlhttp4.readyState==4 && xmlhttp4.status==200){
                try{
                    var downloadlink = xmlhttp4.responseXML.documentElement.getElementsByTagName("downloads");
                    for (var i=0;i<downloadlink.length;i++){
                        alert(i);
                    }
                }
                catch(er){
                    alert(xmlhttp4.responseText);
                }
            }
            else{
                alert("ReadyState: "+xmlhttp4.readyState+" Status: "+xmlhttp4.status);
            }
        }
        xmlhttp4.open("GET","http://localhost/bone/searchmusic.php?artistname="+artistname+"&trackname="+trackname,true);
        xmlhttp4.send(null);
    }

我不知道问题是什么。是我没有正确呈现 XML 还是缺少我的 ajax?
谢谢,
山姆

【问题讨论】:

  • 感谢史蒂夫。我选择了解决我问题的答案。我不知道这个功能。
  • 你没有在任何地方提到问题是什么
  • 如果您可以使用 JavaScript 库,例如 jQueryPrototypeYUI 仅举三例,它可以处理您的大量手工 AJAX问题。我通常会尝试使用经过验证的、经过良好测试的代码而不是手工制作来最小化我的代码库。我的代码也更少=可能出错的更少;-)
  • 感谢您的评论安迪。我会试试的
  • PHP爬虫工作正常吗?如果是这样,我有 AJAX 部分的解决方案。我只是无法让 PHP 工作,curl 目前不适合我。

标签: php javascript xml ajax web-crawler


【解决方案1】:

以下页面,使用 jQuery JavaScript 框架,对我有用……

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function(){
            $('.getMp3').click(function() {
                var artist = $('.artist', this).text();
                var track = $('.track', this).text();
                getDownloadLink(artist, track);
            });

            function getDownloadLink(artist, track) {
                $.ajax({
                    url:'downloads.xml',
                    dataType:'xml',
                    success: function(xml) {
                        $(xml).find('link').each(function() {
                            $('#results').append('<li><a href="'+$(this).text()+'">track</a></li>');
                        });
                    }
                });
            }
        });
    </script>
</head>
<body>
<p>
    <a href="#" class="getMp3">Get <span class="artist">Lady GaGa</span> - <span class="track">Bad Romance</span> tracks</a>
</p>
<ul id="results"></ul>
</body>
</html>

...假设您有一个名为 downloads.xml 的文件,格式如下:

<?xml version="1.0"?>
<downloads>
  <trackname>LadyGaga+BadRomance</trackname>
  <link>a</link>
  <link>b</link>
  <link>c</link>
  <link>d</link>
</downloads>

此代码实际上并未使用艺术家和曲目,但我添加它们是为了让您了解它的工作原理。

【讨论】:

    【解决方案2】:

    感谢您的解决方案 Andyb。它现在就像一个魅力。我之前看过 jQuery Ajax,但从没想过它不够强大。这是我现在正在使用的代码。

        function getDownloadLink(artist, track) {
            $.ajax({
                url:'http://localhost/bone/searchmusic.php?artistname='+artist+'&trackname='+track,
                dataType:'xml',
                success: function(xml) {
                    $(xml).find('link').each(function() {
                        $('#download').append('<li><a href="'+$(this).text()+'">track</a></li>');
                        });
                    }
                });
            }
    </script>
    

    再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2011-08-11
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多