2011-03-11 48 views
1

在網頁上使用xmlstarlet時,我大部分時間都面臨實體引用錯誤。 這使得它從網頁中提取無用。xmlstarlet解析器錯誤:實體'*'未定義

爲HTML頁面沒有良好的XML(有一些選項來處理HTML也?) 我將它們轉換與

tidy -asxhtml 

到XHTML,這裏整齊放聲明

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

然後用xmlstarlet處理後

curl http://www.xfree86.org/current/index.html | tidy -asxhtml | \ 
    xmlstarlet sel --net -T -t -m hr -v . - 

it throw always s ame error

-:13: parser error : Entity 'reg' not defined 
<h1>Documentation for XFree86&reg; version 4.8.0</h1> 

有沒有人知道如何讓xmlsttarlet知道實體引用文件。

+0

更正了-asxml,-asxhtml選項的不匹配。 – Sharad 2011-03-17 08:18:50

回答

6

試着告訴整齊的字符實體轉換爲數值的人是這樣的:

curl --silent -q http://www.xfree86.org/current/index.html | \ 
tidy -q -numeric -asxhtml --show-warnings no | \ 
xmlstarlet sel -N xhtml="http://www.w3.org/1999/xhtml" -t -m "//xhtml:hr" -c . -n 2>/dev/null 

在這裏,我添加了以下選項:

  • 告訴捲曲保持緘默--silent-q
  • 讓整潔安靜與-q--show-warnings no
  • 告訴ti DY到實體轉換爲數值那些與-numeric
  • 給xmlstarlet XHTML命名空間用來與-N和名稱的XPath它XHTML
  • 更改XPath來匹配名稱空間中,hrxhtml

該作品擺脫實體未定義的錯誤,使以前的命令全部沉默,並選擇你想要的元素。

然而,當我試圖用xmlstarlet 1.0.6這樣做,我還是得到這樣的:如果

Entity: line 1: parser warning : xmlParsePITarget: invalid name prefix 'xml' 
<?xmlstarlet version="1.0"?> 

不知道這真的很重要,但似乎這是可以安全忽略警告...所以我只需將stderr輸出到/ dev/null與2>/dev/null