Intereting Posts
PHP слишком медленный, может ли кто-нибудь увидеть способ сделать это быстрее? Использование метода PUT с библиотекой PHP cUrl Silex: перенаправить администратор на админ-домашний путь после входа в систему отправлять данные на localhost в приложении для Android Как написать текстовый файл с условием с помощью PHP Включить функции семафора PHP на MAMP Безумное поведение когтей. продолжает отменять процессы bash Как префикс положительного числа с знаком плюса в PHP Удаление цифр после двух десятичных знаков без округления значения PHP Regex Получить текст между тегами BBCode В чем разница между echo и printf Удалить нулевые значения из массива PHP Что происходит, когда соединения с MongoDB не закрыты? Замена недопустимых символов UTF-8 на вопросительные знаки, mbstring.substitute_character кажется проигнорированным Как передать выбранное значение в модальном поле PHP?

Извлечение данных сайта через веб-искатель выводит ошибку из-за неправильного совпадения индекса массива

Я пытался извлечь текст таблицы сайта вместе со своей ссылкой из данной таблицы (которая находится в site1.com) на мою страницу php с помощью веб-искателя.

Но, к сожалению, из-за неправильного ввода индекса массива в php-код в него выводилась ошибка.

site1.com

<table border="0" cellpadding="0" cellspacing="0" width="100%" class="Table2"> <tbody><tr> <td width="1%" valign="top" class="Title2">&nbsp;</td> <td width="65%" valign="top" class="Title2">Subject</td> <td width="1%" valign="top" class="Title2">&nbsp;</td> <td width="14%" valign="top" align="Center" class="Title2">Last Update</td> <td width="1%" valign="top" class="Title2">&nbsp;</td> <td width="8%" valign="top" align="Center" class="Title2">Replies</td> <td width="1%" valign="top" class="Title2">&nbsp;</td> <td width="9%" valign="top" align="Center" class="Title2">Views</td> </tr> <tr> <td width="1%" height="25">&nbsp;</td> <td width="64%" height="25" class="FootNotes2"><a href="/files/forum/2017/1/837110.php" target="_top" class="Links2">Serious dedicated study partner for U World</a> - step12013</td> <td width="1%" height="25">&nbsp;</td> <td width="14%" height="25" class="FootNotes2" align="center">02/11/17 01:50</td> <td width="1%" height="25">&nbsp;</td> <td width="8%" height="25" align="Center" class="FootNotes2">10</td> <td width="1%" height="25">&nbsp;</td> <td width="9%" height="25" align="Center" class="FootNotes2">318</td> </tr> </tbody> </table> 

Php. веб-гусениц как ::

 <?php function get_data($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL,$url); $result=curl_exec($ch); curl_close($ch); return $result; } $returned_content = get_data('http://www.usmleforum.com/forum/index.php?forum=1'); $first_step = explode( '<table class="Table2">' , $returned_content ); $second_step = explode('</table>', $first_step[0]); $third_step = explode('<tr>', $second_step[1]); // print_r($third_step); foreach ($third_step as $key=>$element) { $child_first = explode( '<td class="FootNotes2"' , $element ); $child_second = explode( '</td>' , $child_first[1] ); $child_third = explode( '<a href=' , $child_second[0] ); $child_fourth = explode( '</a>' , $child_third[0] ); $final = "<a href=".$child_fourth[0]."</a></br>"; ?> <li target="_blank" class="itemtitle"> <?php echo $final?> </li> <?php if($key==10){ break; } } ?> 

Теперь Индекс массива на указанном выше PHP-коде может быть виновником. (я думаю) Если да, может кто-нибудь объяснить мне, как сделать эту работу.

Но каково мое последнее требование от этого кода: для получения второго текста со ссылкой, связанной с ним.

Любая помощь приветствуется.

Используя библиотеку Simple HTML DOM Parser , вы можете использовать следующий код:

 <?php require('simple_html_dom.php'); // you might need to change this, depending on where you saved the library file. $html = file_get_html('http://www.usmleforum.com/forum/index.php?forum=1'); foreach($html->find('td.FootNotes2 a') as $element) { // find all <a>-elements inside a <td class="FootNotes2">-element $element->href = "http://www.usmleforum.com" . $element->href; // you can also access only certain attributes of the elements (eg the url). echo $element.'</br>'; // do something with the elements. } ?> 

Вместо написания собственного решения парсера вы можете использовать существующий компонент, например, компонент Symfony DomCrawler: http://symfony.com/doc/current/components/dom_crawler.html

 $crawler = new Crawler($returned_content); $linkTexts = $crawler->filterXPath('//a')->each(function (Crawler $node, $i) { return $node->text(); }); 

Или, если вы хотите пройти дерево DOM самостоятельно, вы можете использовать DOMDocument loadHTML http://php.net/manual/en/domdocument.loadhtml.php

 $document = new DOMDocument(); $document->loadHTML($returned_content); foreach ($document->getElementsByTagName('a') as $link) { $text = $link->nodeValue; } 

РЕДАКТИРОВАТЬ:

Чтобы получить нужные ссылки, код предполагает, что у вас есть переменная $returned_content return_content с HTML, который вы хотите проанализировать.

 // creating a new instance of DOMDocument (DOM = Document Object Model) $domDocument = new DOMDocument(); // save previous libxml error reporting and set error reporting to internal // to be able to parse not well formed HTML doc $previousErrorReporting = libxml_use_internal_errors(true); $domDocument->loadHTML($returned_content); libxml_use_internal_errors($previousErrorReporting); $links = []; /** @var DOMElement $node */ // getting all <a> element from the HTML foreach ($domDocument->getElementsByTagName('a') as $node) { $parentNode = $node->parentNode; // checking if the <a> is under a <td> that has class="FootNotes2" $isChildOfAFootNotesTd = $parentNode->nodeName === 'td' && $parentNode->getAttribute('class') === 'FootNotes2'; // checking if the <a> has class="Links2" $isLinkOfLink2Class = $node->getAttribute('class') == 'Links2'; // as I assumed you wanted links from the <td> this check makes sure that both of the above conditions are fulfilled if ($isChildOfAFootNotesTd && $isLinkOfLink2Class) { $links[] = [ 'href' => $node->getAttribute('href'), 'text' => $parentNode->textContent, ]; } } print_r($links); 

Это создаст вам массив, похожий на:

 Array ( [0] => Array ( [href] => /files/forum/2017/1/837242.php [text] => Q@Q Drill Time ① - cardio69 ) [1] => Array ( [href] => /files/forum/2017/1/837356.php [text] => study partner in Houston - lacy ) [2] => Array ( [href] => /files/forum/2017/1/837110.php [text] => Serious dedicated study partner for U World - step12013 ) ... 

Я попробовал тот же код для другого сайта. и он работает как шарм .. Пожалуйста, взгляните на него:

 <?php function get_data($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL,$url); $result=curl_exec($ch); curl_close($ch); return $result; } $returned_content = get_data('http://www.usmle-forums.com/usmle-step-1-forum/'); $first_step = explode( '<tbody id="threadbits_forum_26">' , $returned_content ); $second_step = explode('</tbody>', $first_step[1]); $third_step = explode('<tr>', $second_step[0]); // print_r($third_step); foreach ($third_step as $element) { $child_first = explode( '<td class="alt1"' , $element ); $child_second = explode( '</td>' , $child_first[1] ); $child_third = explode( '<a href=' , $child_second[0] ); $child_fourth = explode( '</a>' , $child_third[1] ); echo $final = "<a href=".$child_fourth[0]."</a></br>"; } ?> 

И HTML для него:

 <tbody id="threadbits_forum_26"> <tr> <td class="alt2" colspan="2"><img src="/images/icons/promo_red.png" alt="Advertisement" border="0" title="Advertisement"> </td> <td class="alt1" id="td_threadtitle_50499" title=""> <div> <span style="float:right"><img class="inlineimg" src="/images/misc/tag.png" alt="Ads-Services, USMLE-Success-Academy-" title="Ads-Services, USMLE-Success-Academy-"><img class="inlineimg" src="/images/misc/sticky.gif" alt="Sticky Thread" title="Sticky Thread"> </span> <a href="http://www.usmle-forums.com/usmle-step-1-forum/50499-pass-your-step-1-exam-100-guaranteed.html" id="thread_gotonew_50499"><img class="inlineimg" src="/images/buttons/firstnew.gif" alt="Go to first new post" border="0" title="Go to first new post"></a> Sticky: <a href="http://www.usmle-forums.com/usmle-step-1-forum/50499-pass-your-step-1-exam-100-guaranteed.html" id="thread_title_50499" style="font-weight:bold">Pass Your Step 1 Exam - 100% Guaranteed!</a> </div> <div class="smallfont"> <span style="cursor:pointer" onclick="window.open('http://www.usmle-forums.com/members/usmle-success-academy.html', '_self')">USMLE-Success-Academy</span> </div> </td> <td class="alt2" title="Replies: 51, Views: 32,107"> <div class="smallfont" style="text-align:right; white-space:nowrap"> 3 Days Ago <br>by <a href="http://www.usmle-forums.com/members/hematocrit.html">hematocrit</a> <a href="http://www.usmle-forums.com/usmle-step-1-forum/50499-pass-your-step-1-exam-100 guaranteed.html#post1400458"><img class="inlineimg" src="/images/buttons/lastpost.gif" alt="Go to last post" border="0" title="Go to last post"></a> </div> </td> <td class="alt1" align="center"><a rel="nofollow" href="http://www.usmle-forums.com/misc.php?do=whoposted&amp;t=50499" onclick="who(50499); return false;">51</a> </td> <td class="alt2" align="center">32,107 </td> </tr> <tr> <td class="alt2" colspan="2"><img src="/images/icons/favorite.png" alt="Star" border="0" title="Star"> </td> <td class="alt1" id="td_threadtitle_247650" title=""> <div> <span style="float:right"><img class="inlineimg" src="/images/misc/sticky.gif" alt="Sticky Thread" title="Sticky Thread"></span> <a href="http://www.usmle-forums.com/usmle-step-1-forum/247650-usmle-step-1-live-prep-boot-camp-chicago.html" id="thread_gotonew_247650"><img class="inlineimg" src="/images/buttons/firstnew.gif" alt="Go to first new post" border="0" title="Go to first new post"></a> Sticky: <a href="http://www.usmle-forums.com/usmle-step-1-forum/247650-usmle-step-1-live-prep-boot-camp-chicago.html" id="thread_title_247650" style="font-weight:bold">USMLE Step 1 Live prep/Boot Camp in Chicago</a> </div> <div class="smallfont"> <span style="cursor:pointer" onclick="window.open('http://www.usmle-forums.com/members/medical-legends.html', '_self')">Medical-Legends</span> </div> </td> <td class="alt2" title="Replies: 11, Views: 4,248"> <div class="smallfont" style="text-align:right; white-space:nowrap"> 1 Week Ago <br>by <a href="http://www.usmle-forums.com/members/svbobbili.html">svbobbili</a> <a href="http://www.usmle-forums.com/usmle-step-1-forum/247650-usmle-step-1-live-prep-boot-camp-chicago.html#post1396290"><img class="inlineimg" src="/images/buttons/lastpost.gif" alt="Go to last post" border="0" title="Go to last post"></a> </div> </td> <td class="alt1" align="center"> <a rel="nofollow" href="http://www.usmle-forums.com/misc.php?do=whoposted&amp;t=247650" onclick="who(247650); return false;">11</a> </td> <td class="alt2" align="center">4,248 </td> </tr> <tr> <td class="alt2" colspan="2"><img src="/images/icons/promo_red.png" alt="Advertisement" border="0" title="Advertisement"> </td> <td class="alt1" id="td_threadtitle_47902" title=""> <div> <span style="float:right"> <img class="inlineimg" src="/images/misc/tag.png" alt="Ads-Services, USMLEstat-" title="Ads-Services, USMLEstat-"> <a href="http://www.usmle-forums.com/usmle-step-1-forum/#" onclick="attachments(47902); return false"> <img class="inlineimg" src="/images/misc/paperclip.gif" border="0" alt="1 Attachment(s)" title="1 Attachment(s)"></a> <img class="inlineimg" src="/images/misc/sticky.gif" alt="Sticky Thread" title="Sticky Thread"></span> <a href="http://www.usmle-forums.com/usmle-step-1-forum/47902-new-completely-free-usmle-step-1-resource-usmlestat.html" id="thread_gotonew_47902"><img class="inlineimg" src="/images/buttons/firstnew.gif" alt="Go to first new post" border="0" title="Go to first new post"></a> Sticky: <a href="http://www.usmle-forums.com/usmle-step-1-forum/47902-new-completely-free-usmle-step-1-resource-usmlestat.html" id="thread_title_47902" style="font-weight:bold">New, Completely free USMLE Step 1 resource - USMLEstat</a> </div> <div class="smallfont"> <span style="cursor:pointer" onclick="window.open('http://www.usmle forums.com/members/usmlestat.html', '_self')">USMLEstat</span> </div> </td> <td class="alt2" title="Replies: 98, Views: 1,120,979"> <div class="smallfont" style="text-align:right; white-space:nowrap"> 1 Week Ago <br>by <a href="http://www.usmle-forums.com/members/svbobbili.html">svbobbili</a> <a href="http://www.usmle-forums.com/usmle-step-1-forum/47902-new-completely-free-usmle-step-1-resource-usmlestat.html#post1396274"><img class="inlineimg" src="/images/buttons/lastpost.gif" alt="Go to last post" border="0" title="Go to last post"></a> </div> </td> <td class="alt1" align="center"><a rel="nofollow" href="http://www.usmle-forums.com/misc.php?do=whoposted&amp;t=47902" onclick="who(47902); return false;">98</a></td> <td class="alt2" align="center">1,120,979</td> </tr> </tbody> 

Я знаю его слишком много, чтобы спросить, но можете ли вы сделать код из этих двух, которые заставляют искателя работать.

@jkmak