-1

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

我已经设法从整个 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 个字符之间,但它总是出现在“比特币:”和“?”之间。有没有我可以使用的正则表达式?

谢谢

4

3 回答 3

1

你真的不需要正则表达式。基本的字符串操作工作得很好:

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-textbitcoin:

soup.find_all('div', {'data-text': lambda value: value.startswith('bitcoin:')})
于 2013-06-10T18:57:50.640 回答
0

好吧,在过去你可以使用正则表达式来做到这一点。但是,正则表达式不适用于解析。既然你已经解析了 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 谈发电机

于 2013-06-10T19:09:37.677 回答
0

这很容易使用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)

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

于 2013-06-10T19:08:02.070 回答