【问题标题】:symfony 2 dom crawler to loop through and get linkssymfony 2 dom 爬虫循环并获取链接
【发布时间】:2021-03-29 16:00:38
【问题描述】:

我正在尝试传递 html,以便找到标题和链接。目前我可以同时获得所有的标题,当我真的想一个一个地循环浏览它们时。我也无法获得链接,方法 link();当我硬编码链接的实际名称时的方法返回,错误

          Current URI must be an absolute URL ("").

我需要一个 foreach 循环并获取标题和链接的东西,代码如下,请帮帮我

    $html <<<<ol>
        <li
              class="first-child ol1">
              <a href="http://link1"
               class="story">
               <span class="livestats-icon livestats-1">1:</span>  Skywatchers await solar eclipse</a>
                                </li>
                                            <li
                                              class="ol2">
                                              <a
                                                href="http://link2"
                                                class="story">
                                                <span
                                                  class="livestats-icon livestats-2">2: </span>Indians caught 'cheating' in exams</a>
                                            </li>
                                            <li
                                              class="ol3">
                                              <a
                                                href="http://link3"
                                                class="story">
                                                <span
                                                  class="livestats-icon  livestats-3">3: </span>Hunting for Prince's vault</a>
                                            </li>
                                                            </ol>>>>html
  $crawler = new Crawler($html);

 $message = $crawler->filterXPath('//ol')->text();

print_r($message);



$link = $crawler->selectLink('1: Skywatchers await solar eclipse')->link();


 print_r($link);     

【问题讨论】:

    标签: php symfony dom-events


    【解决方案1】:

    您可以使用过滤器并使用 css 选择器选择您的链接,例如:

    $links = $crawler->filter('a')->links();
    

    这将选择您拥有的所有 a 标签,如果您想要特定的标签,则需要一种方法来选择它们,如果您不这样做,然后将 css 类添加到您需要选择的标签中:

    $links = $crawler->filter('.myclass')->links());
    

    它将返回链接数组。

    编辑:

    真的只是尝试了你的代码,你需要一个 URI,因为错误说...我认为它在其他地方失败了,但它在爬虫构造中失败了...

    $crawler = new Crawler($html, 'http'); //http is not a valid uri obviously but it does the trick if you dont need the uri.
    

    【讨论】:

    • 谢谢,但您可能错误地在末尾添加了 ) 应该是 $links = $crawler->filter('a')->links(); ?然后这会返回相同的错误,尽管'当前 URI 必须是绝对 URL ("")' 我喜欢以与 simpleXml 类似的方式执行此操作的东西
    • @GAV 哦,是的,对不起,没有),这很奇怪,我最近已经使用过爬虫,这很有效,我无法帮助你使用 filterXPath,因为我从未使用过它,我更喜欢 css 选择器tho ,但是如果你转储 $crawler->filter('a') 会返回什么?
    • object(Symfony\Component\DomCrawler\Crawler)[263] protected 'uri' => null private 'defaultNamespacePrefix' => string 'default' (length=7) private 'namespaces' => 数组(size=0) empty private 'baseHref' => null
    • 我不确定你如何实例化你的爬虫,你能用 $crawler = new Crawler(); $crawler->addHtmlContent("你的 html");然后再试一次
    • $html =

      Hello World!

      Hello Crawler! 中午 HTML; $crawler = 新的爬虫(); $crawler->addHtmlContent($html); $message = $crawler->filter('a')->links(); var_dump($message);

    【解决方案2】:

    您收到的错误实际上是从 Symfony\DomCrawler\Link constructor 中抛出的 InvalidArgumentException。这意味着您提供给selectLink() 方法的值不是API 中看到的有效名称:

    按名称或 alt 值选择可点击图像的链接。

    DomCrawler 确实有 links() 方法,根据 API Documentation 将:

    返回列表中节点的 Link 对象数组。

    【讨论】:

    • 我收到此错误消息' public function __construct(\DOMElement $node, $currentUri, $method = 'GET') { if (!in_array(strtolower(substr($currentUri, 0, 4) ), array('http', 'file'))) { throw new \InvalidArgumentException(sprintf('当前 URI 必须是绝对 URL ("%s").', $currentUri)); } $this->setNode($node);
    • 您提供的第 2、3、5 个链接停止工作。仅供参考
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多