繁体   English   中英

解析HTML中的比特币地址

[英]Parsing bitcoin address in html

我正在尝试使用漂亮的汤库来解析网页并找到比特币地址。

我设法从整个html文档中拉出了包含生成地址的类:

<div class="roundpic qrcode" data-height="80" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="80" style="margin: auto"></div>, <div class="roundpic qrcode" data-height="160" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="160" style="padding: 10px"></div>

隔离地址的最佳方法是什么? 我知道长度可以在27-34个字符之间,但始终会出现在“ bitcoin:”和“?”之间。 我可以使用正则表达式吗?

谢谢

您真的不需要正则表达式。 基本的字符串操作可以正常工作:

import re
from bs4 import BeautifulSoup

html = '''
<div class="roundpic qrcode" data-height="80" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="80" style="margin: auto"></div>
<div class="roundpic qrcode" data-height="160" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="160" style="padding: 10px"></div>
'''

soup = BeautifulSoup(html)

for div in soup.find_all('div', {'data-text': re.compile(r'^bitcoin:')}):
    address, amount = div.get('data-text').replace('bitcoin:', '').split('?amount=')

soup.find_all('div', {'data-text': re.compile(r'^bitcoin:')})找到所有<div>元素,其中data-text属性的值以bitcoin:开头。 您还可以使用:

soup.find_all('div', {'data-text': lambda value: value.startswith('bitcoin:')})

使用python正则表达式非常容易:

import re
in_str=<div class="roundpic qrcode" data-height="80" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="80" style="margin: auto"></div>, <div class="roundpic qrcode" data-height="160" data-text="bitcoin:1JL7kugm1vDLqyzrVPAPdcbjH3PTxcPcud?amount=0.0573" data-width="160" style="padding: 10px"></div>
bitcoin_addresses=re.findall(r'bitcoin:(.*?)\?amount',in_str)

可能令人困惑的一件事是? 是正则表达式中的特殊字符,但您也尝试将其匹配。 您需要使用*吗? 执行惰性匹配,然后\\? 实际匹配?。 反斜杠是转义字符,表示“我不是指特殊字符吗?是指实际的问号。”

好吧,在过去您可以使用正则表达式来做到这一点。 但是,正则表达式不适用于解析。 既然您已经解析了DOM,为什么不直接访问它呢? :)

# imports
from bs4 import BeautifulSoup as Soup

# parse the HTML
s = Soup("<html><body><div data-text='bitcoin:a'></div><div data-text='bitcoin:b'></div><div data-text='bitcoin:c'></div></body></html>")

# find the divs with "data-text"-attribute
divs = ( d for d in s.findAll(name="div") if d.has_key('data-text') )

# extract the value of "data-text"
data_texts = map(lambda x: x["data-text"], divs)

# find only bitcoins
bitcoins = filter(lambda s: s.startswith("bitcoin:"), data_texts)

# strip the prefix
extract = map(lambda s: s[8:], bitcoins)

# result
print extract

结果:

['a', 'b', 'c']

希望对您有所帮助。

干杯!

//编辑:Blender的答案在BeautifulSoup中使用了正则表达式。 尽管这很整洁,但您可以通过简单的后过滤完全忽略正则表达式!

这也利用了生成器流水线,这确实非常强大。 戴维·比兹利(David Beazley)谈发电机

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM