cURL 不适用于标签

Posted

技术标签:

【中文标题】cURL 不适用于标签【英文标题】:cURL not working on tag 【发布时间】:2014-08-17 07:29:50 【问题描述】:

我尝试从webpage复制一个句子

我的代码是:

$request_url ='https://***.com/questions/391005/convert-html-css-to-pdf-with-php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request_url);    // The url to get links from
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // We want to get the respone
$result = curl_exec($ch);
$regex='/<h1 itemprop="name">(.*)<\/h1>/i';
preg_match_all($regex,$result,$parts);
$links=$parts[1];
foreach($links as $link)
    echo $link."<br>";

curl_close($ch);

有效,但是当我尝试在第 6 行更改时它不起作用

$regex='/itemprop="name">(.*)<\/h1>/i';

我要复制的这个网站的脚本是:

<h1 itemprop="name">
<a class="question-hyperlink" href="/questions/391005/convert-html-css-to-pdf-with-php">Convert HTML + CSS to PDF with PHP?</a></h1>

我想打印“使用 PHP 将 HTML + CSS 转换为 PDF?”请告诉我如何从这个锚标签中复制和打印这句话。

【问题讨论】:

正则表达式不再起作用,因为您的行首/第一个字符未包含在正则表达式中。应该是/^.*itemprop="name"&gt;(.*)&lt;\/h1&gt;/i @smoes 没有输出。空白页。 @smoes 此代码 /^.*itemprop="name">(.*)/si 有效,但它不打印“使用 PHP 将 HTML + CSS 转换为 PDF?” .它的打印比这句话更多。 我发布了一个答案,并将在答案中添加新问题。如果它符合您的需求,请接受答案。 【参考方案1】:

或者,您也可以将DOMDocumentDOMXpath 一起使用。考虑这个例子:

$request_url ='http://***.com/questions/391005/convert-html-css-to-pdf-with-php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request_url); // The url to get links from
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // We want to get the response
libxml_use_internal_errors(true);
$result = curl_exec($ch);
$dom = new DOMDocument();
$dom->loadHTML($result);
libxml_clear_errors();
$xpath = new DOMXpath($dom);
// target the title
$title = $xpath->query('//div[@id="question-header"]/h1[@itemprop="name"]/a[@class="question-hyperlink"]')->item(0)->nodeValue;
echo $title; // Convert HTML + CSS to PDF with PHP?

旁注:这是最奇怪的抓取问题,抓取 SO。

【讨论】:

【参考方案2】:

您需要修改正则表达式以将输入解析为单行。更准确地说,您需要告诉您正则表达式与换行符不匹配,因为换行符不是 . 的一部分

这个can be done通过在行尾的i中添加一个s

s (PCRE_DOTALL) 如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,换行符被排除在外。这个修饰符等价于 Perl 的 /s 修饰符。诸如 [^a] 之类的否定类始终匹配换行符,与此修饰符的设置无关。

您的正则表达式将如下所示:

/itemprop="name">(.*)<\/h1>/is 

你现在需要做的就是把其他标签中的文本也去掉。目前,您采用 h1-tag 的内部。请注意在 a-tag 之前处理换行符:

/itemprop="name">.*<a.*>(.*)<\/a><\/h1>/is

会成功的!

【讨论】:

以上是关于cURL 不适用于标签的主要内容,如果未能解决你的问题,请参考以下文章

UITapGeatureRecogniser 不适用于 2 个标签

标签 css 不适用于“a”标签中的文本

Struts 2 Ajax url 和 div 标签不适用于 struts 文件标签

为啥 innerText,innerHTML 属性不适用于 javascript 中的输入标签?

为啥@click 不适用于 vue js 中的 h1 标签

为啥 HTML 5 视频标签不适用于将 YouTube 视频用作源?