【问题标题】:Avoiding certain elements within a class when using xpath使用 xpath 时避免类中的某些元素
【发布时间】:2018-01-03 00:12:26
【问题描述】:

我想提取 a 标记中的文本,但我不希望 span class 中显示“新列表”的文本。使用 xpath,我怎样才能得到以下文本:

新!使命召唤:二战(Microsoft XBOX ONE DISC 2017)二战工厂 密封!

PHP 抓取器

$document = new DOMDocument( '1.0', 'UTF-8' );
$document->preserveWhiteSpace = false;
$internalErrors = libxml_use_internal_errors( true );
$ebayhtml = file_get_contents( $ebayurl );
$document->loadHTML( $ebayhtml );
libxml_use_internal_errors( $internalErrors );

$xpath = new DOMXpath( $document );
$headers = $xpath->query( '//h3[@class="lvtitle"]/a' );
$ebayx = 0;

foreach ( $headers as $title ) {
    if ( $ebayx > 9 ) {
        break;
    } else {
        $header = $title->nodeValue . PHP_EOL;
        $header = strlen($header) > 60 ? substr($header,0,60) . "..." : $header;
        echo '<pre>';
        echo $header;
        echo '</pre>';
        $ebayx++;
                }
            }

正在抓取 HTML 代码

<a href="https://www.ebay.com/itm/NEW-CALL-OF-DUTY-WWII-Microsoft-XBOX-ONE-DISC-2017-WW2-Factory-Sealed/173060343645?epid=237222746&amp;hash=item284b33475d:g:Xf4AAOSwI8laCc~I" class="vip" title="Click this link to access NEW! CALL OF DUTY: WWII (Microsoft XBOX ONE DISC 2017) WW2 Factory Sealed!"><span class="newly">New listing</span>
        NEW! CALL OF DUTY: WWII (Microsoft XBOX ONE DISC 2017) WW2 Factory Sealed!</a>

【问题讨论】:

  • eBay 不允许抓取
  • 因为它是非法的或者它不起作用?
  • 违反 Ebays 服务条款。
  • 只有在流量具有破坏性的情况下,如果以用户身份登录购买或出售物品,其他任何事情都只是违规行为。除非发生计算机滥用,否则仅访问不是人类或机器人强制执行的活动。作为访客,您不能违反从未同意的合同。
  • 好吧,当然欢迎你忽略别人的意愿。

标签: php xpath web-scraping


【解决方案1】:

如果这个 XPath,

//h3[@class="lvtitle"]/a

选择目标a 元素,然后选择这个XPath,

//h3[@class="lvtitle"]/a/text()

将只选择其直接文本节点子节点,因此会根据要求排除 span 子元素。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多