如何跨行从html抓取文本

2024-09-27 21:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个html文件如下。我想要Python做的是,当它看到关键字“存款到现金账户”时,它将抓取“存款到现金账户”的class=“s14”和与其最近的$数字(12.32)的class=“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。你知道吗

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”。感觉lineClass变量在for循环完成后被清除了。为什么


Tags: textinforstyletoplinewidthleft
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:45

如果您不能使用第三方模块,例如beautifulsoup,那么可以使用Python的内置html.parserdoc)生成“穷人”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

然而,最好使用成熟的库,如beautifulsoupseleniumscrapylxml。有了它们,您可以使用XPath、CSS选择器等丰富的api轻松地获取数据。你知道吗

相关问题 更多 >

    热门问题