【问题标题】:Crawling option tag with Php使用 PHP 抓取选项标签
【发布时间】:2014-02-05 17:05:27
【问题描述】:

我尝试了很多东西,但我无法读取标签上的值。 我在这里和不同的博客上查看了类似的示例,但那里给出的解决方案并没有解决我的问题。

网站上的Html是这样的:

<div>
   <select name="ctl00$ContentPlaceHolder1$ddlCityID" id="ddlCityID">
    <option value="">Choose</option>
        <option value="14">Roma</option>
        <option value="15">Milan</option>
        <option value="16">Inter</option>
   </select>
</div>

我在 php 上的代码:

$pageTitle = 'select[@id="ddlCityID"]';
$html = file_get_html($url);

  if ($html != null )
  {
     foreach($html->find($pageTitle) as $element) 
     {
    $link = $element->find('option');
    callfunction($link[0]->option);
     }
  }

错误:

Notice: Undefined offset: 0 in C:\Aptana Studio 3 = a.php on line 57
Notice: Trying to get property of non-object in C:\Aptana Studio 3 = a.php on line 57

我的问题在哪里,如何获取标签的值以及标签中的文本。

谢谢;

【问题讨论】:

  • var_dump $link 看看它是否是一个数组。可能您必须以不同的方式访问它
  • $link = $element->find('option');是第 57 行
  • 不确定你在这里实际做什么。所以你的完整 HTML 页面在一个文件中,你想用 XPath 函数解析那个文件?您不应该使用 xml 函数解析任何网站。 Htmlpages 很少与 xml 兼容,并且很可能会使您的脚本崩溃。我会尝试使用 str_pos 和 substr 函数的更基本的方法。
  • 或者......你只是在你的 PHP 代码上使用了 JQuery 函数吗?
  • 如何用 str_pos 解析这段代码?

标签: php web-crawler


【解决方案1】:

继续使用 simplehtmldom 而不是 str_pos(不过我建议更改解析器,因为 simplehtmldom 非常繁重)。

您正在寻找的解决方案是这样的

include('simple_html_dom.php');

$str = '<div>
   <select name="ctl00$ContentPlaceHolder1$ddlCityID" id="ddlCityID">
    <option value="">Choose</option>
        <option value="14">Roma</option>
        <option value="15">Milan</option>
        <option value="16">Inter</option>
   </select>
</div>';

$pageTitle = 'select[id=ddlCityID]';
$html = str_get_html($str);

if ($html != null ) {
    foreach($html->find($pageTitle) as $element) {
        foreach($element->find('option') as $trueElement) {
            echo $trueElement->innertext;
        }
    }
}

请注意,innertext 将为您提供“选择”、“罗马”、“米兰”、“国际米兰”。 trueElement 现在包含每个 OPTION 标签。

'id'前面的'@'也是没用的。

更新:这是我测试的完整工作代码。

【讨论】:

  • 我试过你的解决方案,它没有进入第二个,没有在 $element 上找到选项标签。可能是什么问题?
  • 给我贴一些文字,我无法推断发生了什么(我在发布之前也对其进行了测试,效果很好)。
  • foreach($html->find($pageTitle) as $element) { echo "step1"; foreach($element->find('option') as $trueElement) { echo "step2"; echo $trueElement->innertext; } } 解决方案只是第一步
  • 没有错误,只是没有进入第二个循环,echo $element is ->
  • 这很奇怪,你确定你给我们的html是完全一样的吗?因为在 里面应该有三个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多