【问题标题】:php how to scrape inside <li><a> using simplehtmldom?php 如何使用 simplehtmldom 在 <li><a> 内部进行抓取?
【发布时间】:2011-11-15 09:45:30
【问题描述】:

来自网站的 HTML

    <ul id="blahlist">
    <li><a href="http://blahblah.com">blah blah</a></li>
    <li><a href="http://blahblah2.com">blah blah 2</a></li>
    ......
    </ul>

我的代码

$dom = new simple_html_dom();
$dom->load_file( "blah.html" );

    $div_category = $dom->find("#blahlist");

    foreach ($div_category as &$ul){
    $a_list = $ul->find("a");
    foreach ( $a_list as &$anchor){
        $csv_array=array($anchor->plaintext, $anchor->getAttribute("href") );
        fputcsv($csv_out, $csv_array);
        print_r($anchor);
    }

问题是它只显示第一行(第一行)而不显示 blahlist 中的列表的其余部分。难道我做错了什么? &lt;li&gt; 可能在第一行之后就停止了?

【问题讨论】:

标签: php list loops foreach scrape


【解决方案1】:

怎么样

$dom->find("#blahlist li");

就是“抢”lis下的所有lis#blahlist

【讨论】:

  • 我觉得你应该再详细点,不是每个人都知道DOM
  • @Moe Sweet 我刚试过,结果还是一样。你能解释一下你的意思吗?详细说明一下我不确定我能为那些了解 DOM 的人提供什么?
  • @Truth 这不是 DOM 而是 SimpleHTMLDom。 SimpleHTMLDom 与 DOM 无关。 DOM 是一个与 W3C 语言无关的接口,SimpleHTMLDom 没有实现它。
  • @Truth 是的,我认为,但这不是 OP 使用的。 PHP 的 DOM 扩展是 W3C 接口的实现。而且它没有 find 方法,也不支持 CSS Selector 查询。
  • 这就是为什么我说他应该详细说明,我是那些会犯这个错误的人之一:P
【解决方案2】:

使用正则表达式抓取:

$html = <<<EOF
<ul id="blahlist">
    <li><a href="http://blahblah.com">blah blah</a></li>
    <li><a href="http://blahblah2.com">blah blah 2</a></li>
    <li><a href="http://blahblah2.com">blah blah 3</a></li>
    <li><a href="http://blahblah2.com">blah blah 4</a></li>
</ul>
EOF;

$ul_id = "blahlist";

if (preg_match("#<ul[^<>]+id=[\"']?{$ul_id}[\"']?[^<>]*>([\s\S]+?)</ul>#i", $html, $match)) 
{
    $lis = $match[1];
    preg_match_all("#<li[^<>]*>\s*<a[^<>]+href=[\"']?([^<>\"']+)[\"']?[^<>]*>([\s\S]+?)</a>#i", $lis, $matches);
    foreach ($matches[1] as $k => $href) {
        $href = strip_tags($href);
        $text = strip_tags($matches[2][$k]);
        print "$text [$href]<br>";
    }
}

你只需在这一行编辑 ul 列表的 id:

$ul_id = "blahlist";

结果:

blah blah [http://blahblah.com]
blah blah 2 [http://blahblah2.com]
blah blah 3 [http://blahblah2.com]
blah blah 4 [http://blahblah2.com]

【讨论】:

  • 感谢您的回答,但我更喜欢加载到 simpleHTMLDom 而不是正则表达式。原因是因为我的下一个函数将通过读取我发布的这个函数创建的 csv 来获取 url 中的所有内容等等。如果有办法,我可能更喜欢使用 Dom 而不是正则表达式。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2018-02-12
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多