[英]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.