2017-01-26 16 views
1

私はクラスがu-ctitleであるtdのすべてのリンクを抽出したいと思います。xpath式で何が問題になっていますか?

import os 
import urllib 
import lxml.html 
down='http://v.163.com/special/opencourse/bianchengdaolun.html' 
file=urllib.urlopen(down).read() 
root=lxml.html.document_fromstring(file) 
namelist=root.xpath('//td[@class="u-ctitle"]/a') 
len(namelist) 

あなたが得るCA放火犯と[]、classis "U-ctitle" 非常に多くのTDがある場合の出力は、なぜそれを抽出することはできませんか?

enter image description here
私のpythonバージョンは2.7.9です。
enter image description here

ファイルを別の名前に変更することはできません。

enter image description here

+0

ウェブページからhtmlを共有できますか? – Shijo

+1

'len()'が整数を返さなければならないので、出力は空のリスト( '[]')ではありません...また 'XPath'はうまく動作します(' 'Python 3.5'で試されました。 ' - ' '34').. – Andersson

+0

Python 2.7.5で動作確認され、リストは空ではありません。出力として '[]'を得てもよろしいですか? –

答えて

1

あなたのXPathは正しいです。問題は無関係です。

あなたがHTMLを調べる場合は、メタタグ、次が表示されます:

<meta http-equiv="Content-Type" content="text/html; charset=GBK" /> 

そして、このコードで:

file=urllib.urlopen(down).read() 
root=lxml.html.document_fromstring(file) 

fileはこれにGBKでエンコードされたバイトからデコードを、実際にバイト配列であり、 Unicode文字列がdocument_fromstringメソッド内で発生しています。

問題は、HTMLエンコーディングが実際にGBKではなく、lxmlが間違ってデコードしてデータが失われることです。

>>> file.decode('gbk') 
Traceback (most recent call last): 
    File "down.py", line 9, in <module> 
    file.decode('gbk') 
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 7247-7248: illegal multibyte sequence 

試行錯誤の結果、実際のエンコーディングはGB_18030です。スクリプトを動作させるには、バイトを手動でデコードする必要があります。

root=lxml.html.document_fromstring(file.decode('GB18030')) 
+0

異なるバージョンのPython/urllib/lxmlで出力が異なる理由を説明できますか? Python 2.7.5/urllib 1.12/lxml 3.4.1 Python 2.7.9/urllib 1.18/lxml 3.6.4よりもはるかに多くのHTMLを取得できます。ありがとう! –

+0

私はまた知りたいです。 –

+0

私は、py3.4.3/lxml3.7.2、py2.7.6/lxml3.7.2およびpy2.7.6/lxml3.4.1において同じ結果を見る。しかし、とにかく、私はlxml *の異なるバージョンがこのような状況の扱いが少し異なるかもしれないと思います。とにかくおかげさまで – alexanderlukanin13

関連する問題