Php 为什么我的简单html dom允许&x27ä';对于wikipedia而不是wikisource?

Php 为什么我的简单html dom允许&x27ä';对于wikipedia而不是wikisource?,php,parsing,character-encoding,wikipedia,simple-html-dom,Php,Parsing,Character Encoding,Wikipedia,Simple Html Dom,我的问题是,下面的脚本与一些IRI一起工作,而与其他IRI不一起工作,我的问题是为什么它会以这种方式工作,以及如何解决它。 我认为字符集有问题,但这只是一个猜测,因为在维基百科中它是有效的 <?php include('C:\xampp\htdocs\php\simple_html_dom.php'); $html = file_get_html('http://de.wikisource.org/wiki/Am_B%C3%A4chle'); //Titel foreach($html-&

我的问题是,下面的脚本与一些IRI一起工作,而与其他IRI不一起工作,我的问题是为什么它会以这种方式工作,以及如何解决它。 我认为字符集有问题,但这只是一个猜测,因为在维基百科中它是有效的

<?php
include('C:\xampp\htdocs\php\simple_html_dom.php');
$html = file_get_html('http://de.wikisource.org/wiki/Am_B%C3%A4chle');
//Titel
foreach($html->find('span#ws-title') as $f)
echo $f->plaintext;

//1   http://de.wikisource.org/wiki/7._August_1929           OK
//2   http://de.wikisource.org/wiki/%E2%80%99s_ist_Krieg!    -
//3   http://de.wikisource.org/wiki/Am_B%C3%A4chle           -
//4   http://de.wikipedia.org/wiki/Guillaume-Aff%C3%A4re     OK
//5   http://de.wikisource.org/wiki/Solidit%C3%A4t           -
?>
有没有办法让脚本为维基百科或Wikisource中的每个IRI工作?(我知道并不总是有一个
span#ws title
,这不是我的问题。)

好问题!:)

它们似乎是通过用户代理进行过滤的,请尝试以下操作

<?php
ini_set("user_agent", "Descriptive user agent string");
file_get_contents("http://de.wikisource.org/wiki/".urlencode("Am_Bächle"));
?>

您可能可以跳过urlencode部分,因为我只是用它来测试编码是否正确


请注意,wikisource显然不喜欢自动解析网页上的内容。尽管如此,Wikibot等可能有一个API可用,询问他们或搜索社区页面。无论如何,API将更容易处理。

问题与字符或编码无关。你得到403是因为,上面写着:

脚本应使用带有联系信息的信息用户代理字符串,否则可能会在不通知的情况下被IP阻止

这就是您应该做的:将User-Agent头设置为标识您的应用程序并在出现问题时用于与您联系的内容


也就是说,直接访问页面可能是获取所需日期的最糟糕方式。你应该改为使用,或者,如果你想访问很多页面,就使用。

仅供参考:这些不是IRI,它们只是带有编码字符的普通URL。好的,但IRI的URL不是允许国际化web寻址的吗?如果您使用哪种ar代表德国,情况不是这样吗?我的理解是IRI中有实际的UTF-8字符,即
http://example.com/fööbär
而不是编码字符(仅限ASCII),即
http://example.com/f%F6%F6b%E4r
)。(不是专家,所以希望有更有知识的人能插话。)非常感谢您快速而有用的回答。这对我来说很有效:)我会在社区里询问解析的问题,但我不明白为什么我可以解析一些页面,而其他页面却不能。。。我会问他们:)你不应该通过欺骗用户代理来模拟浏览器。您应该改用描述性用户代理。@斯维克:您根本不应该这样做。Wikisource有理由不允许某些用户代理。我只使用了不同的用户代理来证明这是可能的。这就是为什么我在回答中写了最后一段。谢谢!我刚下载了我需要的文件:)
<?php
ini_set("user_agent", "Descriptive user agent string");
file_get_contents("http://de.wikisource.org/wiki/".urlencode("Am_Bächle"));
?>