1

検索クエリから返されたHTMLコードの結果の数を解析しようとしていますが、find / index()を使用すると、間違った位置が返されるようです。検索している文字列にはアクセントがあるので、Unicode形式で検索してみます。

解析されるHTMLコードのスニペット:

<div id="WPaging_total">
  Aproximádamente 37 resultados.
</div>

そして私はこのようにそれを検索します:

str_start = html.index(u'Aproxim\xe1damente ')
str_end = html.find(' resultados', str_start + 16)#len('Aproxim\xe1damente ')==16
print html[str_start+16:str_end] #works by changing 16 to 24

printステートメントは次を返します。

damente 37

期待される結果が次の場合:

37

str_startは、検索している文字列の先頭から始まっているのではなく、8桁後ろから始まっているようです。

print html[str_start:str_start+5]

出力:

l">

ただし、コードスニペットを使用する場合は発生せず、HTML文字列全体を検索する場合にのみ発生するため、問題を再現するのは困難です。str_start+16をstr_start+24に変更するだけで、意図したとおりに機能させることができますが、それでは問題を理解するのに役立ちません。Unicodeの問題ですか?うまくいけば、誰かがこの問題に光を当てることができます。

ありがとうございました。

リンク: http: //guiasamarillas.com.mx/buscador/?actividad = Chedraui&localidad =&id_page = 1

サンプルコード

from urllib2 import Request, urlopen

url = 'http://guiasamarillas.com.mx/buscador/?actividad=Chedraui&localidad=&id_page=1'
post = None
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)'}          
req = Request(url, post, headers)
conn = urlopen(req)

html = conn.read()

str_start = html.index(u'Aproxim\xe1damente ')
str_end = html.find(' resultados', str_start + 16)
print html[str_start+16:str_end]
4

2 に答える 2

3

問題は、Python 2.xでは、str型がバイトのシーケンスをunicode表し、型が文字のシーケンスを表すという事実に要約されます。1つの文字は複数のバイトでエンコードできるため、文字列のタイプ表現の長さは、同じ文字列のタイプ表現の長さ、および同じように表現のインデックスとunicodeは異なる場合があります。文字列のは、表現上の同じインデックスとは異なるテキストの部分を指している場合があります。strunicodestr

何が起こっているのかというとstr_start = html.index(u'Aproxim\xe1damente ')、Pythonは、html変数がutf-8でエンコードされていると想定して、変数を自動的にデコードします。(実際、私のPCでは、UnicodeDecodeErrorその行を実行しようとすると、単にが表示されます。テキストエンコーディングに関連するシステム設定の一部は異なる必要があります。)したがって、がnの場合、それはn番目の文字に表示されるstr_startことを意味します。 HTML。ただし、後でスライスインデックスとして使用して、(n + 16)番目の文字の後にコンテンツを取得しようとすると、実際に取得されるのは(n + 16)番目のバイトの後のものです。この場合はそうではありません。ページの以前のコンテンツには、utf-8でエンコードされたときに2バイトを占めるアクセント付き文字が含まれていたため、同等です。u'Aproxim\xe1damente '

最善の解決策は、受け取ったときにhtmlをユニコードに変換することです。サンプルコードへのこの小さな変更は、エラーや奇妙な振る舞いなしであなたが望むことをします:

from urllib2 import Request, urlopen

url = 'http://guiasamarillas.com.mx/buscador/?actividad=Chedraui&localidad=&id_page=1'
post = None
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2)'}          
req = Request(url, post, headers)
conn = urlopen(req)

html = conn.read().decode('utf-8')

str_start = html.index(u'Aproxim\xe1damente ')
str_end = html.find(' resultados', str_start + 16)
print html[str_start+16:str_end] 
于 2012-12-01T21:40:19.963 に答える
0

re何をしようとしているのかは明確ではありませんが、HTMLファイルからおおよその結果数を取得しようとしていると正しく推測している場合は、次のモジュールを使用している方がよいでしょう。正規表現。

import re
re.search(ur'(?<=Aproxim\xe1damente )\d+', s).group(0)

# returns:
#   u'37'

最終的に、あなたの最善の策は、実際にはまたはのようなパッケージですlxmlBeautifulSoup、より多くのコンテキストがなければ、これらについてより具体的なヘルプを提供することはできません。

于 2012-12-01T20:45:03.720 に答える