我有两个号码(NUM1; NUM2)我试图提取具有相同格式的网页:
<div style="margin-left:0.5em;">
<div style="margin-bottom:0.5em;">
NUM1 and NUM2 are always followed by the same text across webpages
</div>
我认为正则表达式可能是这些特定领域的方法。这是我的尝试(借鉴各种来源):
def nums(self):
nums_regex = re.compile(r'\d+ and \d+ are always followed by the same text across webpages')
nums_match = nums_regex.search(self)
nums_text = nums_match.group(0)
digits = [int(s) for s in re.findall(r'\d+', nums_text)]
return digits
本身,在函数之外,此代码在指定文本的实际源时起作用(例如,nums_regex.search(text))。但是,我正在修改另一个人的代码,而我以前从未真正使用过类或函数。以下是他们的代码示例:
@property
def title(self):
tag = self.soup.find('span', class_='summary')
title = unicode(tag.string)
return title.strip()
正如您可能已经猜到的那样,我的代码无效。我收到错误:
nums_match = nums_regex.search(self)
TypeError: expected string or buffer
看起来我没有正确地提供原始文本,但我该如何解决?
答案 0 :(得分:0)
您可以使用相同的正则表达式模式通过文本查找 // blendColors uses the Porter-Duff over method
// for combing two colors with alpha channels
func blendColors(c1 color.Color, c2 color.Color) color.Color {
r1, g1, b1, a1 := extractComponents(c1)
r2, g2, b2, a2 := extractComponents(c2)
var (
a = a1 + a2*(1.0-a1)
r = (r1*a1 + r2*a2*(1.0-a1)) / a
g = (g1*a1 + g2*a2*(1.0-a1)) / a
b = (b1*a1 + b2*a2*(1.0-a1)) / a
)
return color.RGBA{
R: clampColorValue(int(r)),
G: clampColorValue(int(g)),
B: clampColorValue(int(b)),
A: clampColorValue(int(a * 255)),
}
}
,然后提取所需的数字:
BeautifulSoup
请注意,由于您尝试匹配文本的一部分而不是与HTML结构相关的任何内容,我认为将正则表达式应用于完整文档是非常好的。
下面填写完整的工作示例代码示例。
使用import re
pattern = re.compile(r"(\d+) and (\d+) are always followed by the same text across webpages")
for elm in soup.find_all("div", text=pattern):
print(pattern.search(elm.text).groups())
正则表达式/“按文字”搜索:
BeautifulSoup
仅限正则表达式搜索:
import re
from bs4 import BeautifulSoup
data = """<div style="margin-left:0.5em;">
<div style="margin-bottom:0.5em;">
10 and 20 are always followed by the same text across webpages
</div>
</div>
"""
soup = BeautifulSoup(data, "html.parser")
pattern = re.compile(r"(\d+) and (\d+) are always followed by the same text across webpages")
for elm in soup.find_all("div", text=pattern):
print(pattern.search(elm.text).groups())