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">(.*)<\/h1>/i
@smoes 没有输出。空白页。
@smoes 此代码 /^.*itemprop="name">(.*)/si 有效,但它不打印“使用 PHP 将 HTML + CSS 转换为 PDF?” .它的打印比这句话更多。
我发布了一个答案,并将在答案中添加新问题。如果它符合您的需求,请接受答案。
【参考方案1】:
或者,您也可以将DOMDocument
与DOMXpath
一起使用。考虑这个例子:
$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 个标签
Struts 2 Ajax url 和 div 标签不适用于 struts 文件标签