![](/img/trans.png)
[英]How to grab internal text from matching lines in multiline text in python?
[英]How to grab text from html across lines
我有一个如下所示的 html 文件。 我想让 Python 做的是,当它看到关键字“存款到现金帐户”时,它会抓取“类=”s14”的“存款到现金帐户”和最接近它的“类=”的 $number(12.32) s14""。与 (5.34) 中的“资产转入”相同。
<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 7pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Deposits to Cash account</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 7pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$12.32</p>
</td>
</tr>
<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 2pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Asset transfers in</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 2pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$5.34</p>
</td>
</tr>
我尝试使用 FOR 循环逐行浏览 html,我使用 Regex 来获取带有“存款到现金帐户”的行,但不知道如何12.32
获取12.32
。
for line in htmlfile:
if ('Deposits to Cash account' in line):
lineClass = re.findall(r"<p (.*) style",line) #grab "class="s14"
print("inside for loop: ",lineClass)
if (lineClass[0] in line) and ('$' in line)
number = re.findall(r"\$(.*)",line)
print("outside for loop: ",lineClass)
预期结果应该是一个字典:
["Deposits to Cash account": 12.32,
"Asset transfers":5.34]
错误消息是NameError: name 'lineClass' is not defined
此外,“inside for loop: "Class=s14"" 将被打印,而“outside for loop:” 将被打印,其中丢失了“Class=s14”。 感觉像在 for 循环完成后清除了 lineClass 变量。 这是为什么
如果您不能使用诸如beautifulsoup
类的 3rd 方模块,您可以使用 Python 的内置html.parser
( doc ) 制作“穷人” HTML 解析器:
data = '''<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 7pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Deposits to Cash account</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 7pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$12.32</p>
</td>
</tr>
<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 2pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Asset transfers in</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 2pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$5.34</p>
</td>
</tr>'''
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
grab_data_fn = lambda data: None
parsed_data = []
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if tag=='p' and 'class' in attrs and 's14' in attrs['class']:
MyHTMLParser.grab_data_fn = lambda data: MyHTMLParser.parsed_data.append(data.strip())
def handle_endtag(self, tag):
MyHTMLParser.grab_data_fn = lambda data: None
def handle_data(self, data):
MyHTMLParser.grab_data_fn(data)
parser = MyHTMLParser()
parser.feed(data)
parsed_data = parser.parsed_data
deposits = parsed_data[parsed_data.index('Deposits to Cash account') + 1]
transfers = parsed_data[parsed_data.index('Asset transfers in') + 1]
print('Deposits =',deposits)
print('Transfers =',transfers)
打印:
Deposits = $12.32
Transfers = $5.34
但是,最好使用像beautifulsoup
、 selenium
、 scrapy
或lxml
这样的成熟库。 有了它们,您可以使用丰富的 API(如 XPath、CSS 选择器等)来轻松获取数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.