2015-09-08 254 views
2
<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/> 

我想提取圖像地址http://xxxx1.png
我使用/ IMG/@#src,卻得到nothing.it包含#字符。的XPath屬性包含特殊字符

有什麼建議嗎? 感謝您的幫助。

+1

爲什麼會出現'#'?我不認爲這是有效的HTML –

+1

@JamieRees:它不是。儘管瀏覽器像現在這樣運行,但如果它真的在瀏覽器中被解析,我不會感到驚訝。但它絕對不是有效的XML或HTML。 – Abel

+0

它是HTML,而不是xml格式。 – toolater

回答

2
<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/> 

不幸的是,你不能使用XPath做到這一點,因爲這片段是無效的XML。 An XML NameChar cannot start, or contain, the hash symbol。 XPath只能處理XML樹,並且從這個片段中,您不能創建這樣的樹(任何XML解析器都將在該片段上中斷)。

要解決此問題,請通過刪除該符號來預處理您的非真正XML並使其正確無誤。或者,如果您有權訪問此源,請先從源頭修復它,方法是先不生成無效名稱。

注意:在XML(或HTML)中沒有使用某種轉義序列的機制。實體引用只能用於值和文本節點。

+0

謝謝,我通過將#src替換爲其他標記來解決問題, – toolater

0

如果它不是有效的XML,則不能使用XPath來查詢該屬性,因爲名稱在XPath表達式中是無效的語法。

因爲它甚至不是一個有效的HTML屬性名,您將需要一個寬鬆的HTML解析器不上該屬性窒息甚至可以保留它的結果,而不是忽略無效的屬性名稱。用於解析的BeautifulSoup與html5lib的組合似乎可行。該屬性上的Python標準庫扼流器中的HTML解析器和lxml.html默默忽略它。

In [33]: import bs4 

In [34]: source 
Out[34]: '<img width="410" height="410" #src="http://XXXX1.png" src="http://xxxx2.png" alt=""/>' 

In [35]: doc = bs4.BeautifulSoup(source, 'html5lib') 

In [36]: doc.img.attrs 
Out[36]: 
{u'#src': u'http://XXXX1.png', 
u'alt': '', 
u'height': u'410', 
u'src': u'http://xxxx2.png', 
u'width': u'410'} 

In [37]: doc.img.attrs['#src'] 
Out[37]: u'http://XXXX1.png'