使用PHP Simple HTML DOM Parser定位特定的“第n个”HTML标记

时间:2013-12-27 03:54:24

标签: php dom html-parsing web-scraping

我正在使用PHP Simple HTML DOM Parser(http://simplehtmldom.sourceforge.net/)来浏览网站并输出特定信息。

我正在尝试输出每个表中特定的tr标签的内容,以及特定的p,标签的内容,而不是所有的表和所有段落。

因此,理想情况下,我想设置一些涉及数字参数的PHP代码,这些参数引用目标特定的“nth”,td或p,标记。


作为一名PHP新手,我非常感谢StackOverflow上的专业知识。 感谢您抽出时间和帮助解决我的问题。

第一个问题集就在这里,代码之上。第二个问题集可以在本文的底部找到PHP代码。


第一个问题集:

一个。如何输出每个表的第2和第3个?

B中。如何在每个表之后输出第4个段落并排除它包含的a,标记?

以下HTML代码

使用

PHP Simple HTML DOM Parser,如以下PHP代码所示

除非

你有一个不同的建议,你认为更好


下面是示例HTML代码,后跟PHP代码和另一个相关问题集。

这是我感兴趣的主要HTML。

<a name=“arbitrary_a_tag_Begin_Item_01”></a>
<h2>Item No. 1 </h2>

<table>

<tbody>

<tr>
<td>Item Description:</td>
<td>Big blue ball</td>
</tr>

<tr>
<td>Property Location:</td>
<td>Storage Closet</td>
</tr>

<tr>
<td>Owner:</td>
<td>Gym</td>
</tr>

<tr>
<td>Cost</td>
<td>20.00</td>
</tr>

<tr>
<td>Vendor:</td>
<td>Jim’s Gym Toys</td>
</tr>

</tbody>
</table>

<p>
Approximate minimum acceptable grage sale price: $10
<br>
6 month redemption period
</p>

<p>
<img src="../dec/Item01.jpg">
</p>

<p>
<a target="new" href="http://pictures/Item01.jpg”>Picture of Item 01</a>
</p>

<p>
Current status: In Stock
<a name=“arbitrary_a_tag_Begin_Item_02></a>
</p>


<h2>Item No. 2 </h2>

<table>

<tbody>

<tr>
<td>Item Description:</td>
<td>Green tennis racket</td>
</tr>

<tr>
<td>Property Location:</td>
<td>Gear Lockers</td>
</tr>

<tr>
<td>Owner:</td>
<td>Tennis Team</td>
</tr>

<tr>
<td>Cost</td>
<td>50.00</td>
</tr>

<tr>
<td>Vendor:</td>
<td>Jim’s Gym Toys</td>
</tr>

</tbody>
</table>

<p>
Approximate minimum acceptable grage sale price: $25
<br>
6 month redemption period
</p>

<p>
<img src="../dec/Item02.jpg">
</p>

<p>
<a target="new" href="http://pictures/Item02.jpg”>Picture of Item 02</a>
</p>

<p>
Current status: In Stock
<a name=“arbitrary_a_tag_Begin_Item_03></a>
</p>


<h2>Item No. 3 </h2>

<table>

<tbody>

<tr>
<td>Item Description:</td>
<td>Red Soccer Ball</td>
</tr>

等。等等。

PHP代码使用“PHP Simple HTML DOM Parser”:

<?php
// Include the library
include('simple_html_dom.php');

$url = 'http://www.URL.com';

// Create DOM from URL or file
$html = file_get_html($url);

foreach($html->find('table') as $table) 
{
echo '<table><tbody>';
foreach($table->find('tr') as $tr) 
{   
echo '<tr>';
foreach($tr->find('td') as $td)  
{   
echo '<td>';
echo $td->innertext;
echo '</td>';
}
echo '</tr>';
}
echo '</tbody></table><br />';
}

我遇到过一些尝试实现访问特定标记但未成功的事情:


第一个概念

$e = $html->find('table', 0)->find('tr', 1)->find('td');
foreach($e as $d){
echo $d;
}

第二个概念:

$file = file_get_contents($url);
preg_match_all('#<p>([^<]*)</p>#Usi', $file, $matches);
foreach ($matches as $match)
{
echo $match;
}

第二个问题集:

关于上述第一个概念, 如何设置while循环来迭代,让我们说12个表? 例如,这个:$ e = $ html-&gt; find('table',0) 只读第一个表。 然而,我不知道如何用变量替换0,例如$ i,它可以自动增量。

$i = 1;
while($i<=12){
What goes here??
}
$i++

关于第二个概念, 我如何使用这个(或第一个概念):

  1. 在每个表

  2. 之后返回所有p标签的数组
  3. 读取每个p标签中的字符串内容(“内容”),并根据字符串(“密钥”)进行检查

  4. 只有在内容中找到密钥字符串时才返回字符串“contents”

  5. 在输出以匹配字符串为特征的返回“内容”之前,从要输出的信息中排除/删除第二个匹配的字符串(例如,在第一个问题集中,我想抓住特定内容中的所有内容, p,tag,但排除a,tag中的所有内容。


  6. 非常感谢您的时间和帮助!

0 个答案:

没有答案