2016-06-22 4 views
-2

私は大きな文字列 - htmlページを持っています。フラッシュドライブの名前をすべて検索する必要があります。 つまり、コンテンツを二重引用符で囲む必要があります(data-name="USB Flash-drive Leef Fuse 32Gb">)。だから、data-name="">の間の文字列が必要です。してください、BeautifulSoupは言及しないでください、私はBeautifulSoupなしでそれを行う必要があります正規表現なしで、より良いが、正規表現も受け入れています。Python。一致した部分文字列のすべての出現を見つける方法?

私はこれを使用してみました:

p = re.compile('(?<=")[^,]+(?=")') 
result = p.match(html_str) 
print(result) 

をしかし、結果はNoneです。 しかし、それは働いたregex101.com上: enter image description here

+0

HTMLのDOMパーサーを使用して属性の値を抽出すると何が問題になりますか? –

+0

@Vasili Syrakis私は特定のタスクを持っています - それはPythonを使用しています。 –

+0

fyi bs4 = python;このリンクの最初の段落を参照してください:https://www.crummy.com/software/BeautifulSoup/bs4/doc/ –

答えて

2

PY2:https://docs.python.org/2/library/htmlparser.html

PY3:https://docs.python.org/3/library/html.parser.html


from html.parser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     # tag = 'sometag' 
     for attr in attrs: 
      # attr = ('data-name', 'USB Flash-drive Leef Fuse 32Gb') 
      if attr[0] == 'data-name': 
       print(attr[1]) 

parser = MyHTMLParser() 
parser.feed('<sometag data-name="USB Flash-drive Leef Fuse 32Gb">hello world</sometag>') 

出力:

USB Flash-drive Leef Fuse 32Gb 

を私はいくつかのコメントを追加しましたshへのコードへどのような種類のデータ構造体がパーサーによって返されますか?

ここから簡単に構築できます。

ちょうどHTMLをフィードして、それをうまく解析します。ドキュメントを参照して、試してください。

+0

ありがとう、神はあなたを祝福します。 –

0

あなたは、基本的なPythonの文字列はここパースでそれをしたい場合は

s="html string" 
start = s.find('data-name="') 
end = s.find('">') 
output = s[start:end] 

方法ですこれは、スクリプトのこの部分が動作するかどうか私に教えて

>>> s='junk...data-name="USB Flash-drive Leef Fuse 32Gb">...junk' 
>>> start = s.find('data-name="') 
>>> end = s.find('">') 
>>> output = s[start:end] 
>>> output 
'data-name="USB Flash-drive Leef Fuse 32Gb' 

私のPythonシェルで何が起こるかであります別途

+0

は動作しません、出力は空です –

+0

あなたのサンプルはうまくいきますが、大きなHTML文字列ではありません –

+0

私はあなたの長いHTML文字列を貼り付けてテストすることができますか? – user3404344

関連する問題