使用 Python 在 html 标签中提取/搜索所需的字符串/文本

Extract/search for wanted string/text within html tag using Python

提问人:AriffKmy 提问时间:8/3/2023 更新时间:8/3/2023 访问量:33

问:

我有一个 html 文件,其中包含 400 个 html 标签,我想从标签中提取一些特定的文本。此文件是本地文件,而不是联机网页。我只是先尝试使用 1 个 html 文件来检查和确认逻辑。在实际需求中,我将使用一批 html 文件(超过 50 个 html 文件)运行它。

我想提取的是位于这些标签之间的任何文本:

我想要的文本

在 html 文件中,此标记可能被多次使用 1。

我确实尝试使用此代码从文件中提取文本

 global count
 with open(file_path, 'r', encoding ="utf8") as fp:
          
            lines = fp.readlines() 
            text= '<div class="th-choice-list-name headerViewModeElementLoc th-choice-list-   description-value">'

            for line in lines:                              
                
                if line.find(text) != -1:                       
                        count = count + 1
                        result = re.search('<div class="th-choice-list-name headerViewModeElementLoc th-           choice-list-   description-value">(.*)</div>', line)                       
                        print(result.group(1))
                        print(count)
                            

我的问题是:

  1. 它只能识别 line.find(...) 的第一次搜索,而不能识别下一个类似的标记。
  2. 它无法提取我想要的确切文本,因为有重复的“......' 标记,因此它将采用从第一个 <div class=“th-choice-list-name headerViewModeElementLoc ...并以任何结尾

这将是作为输入的 html 文件的“简化”版本(粗体是我想要的文本)

  </div><div id="th-templateEditor-section17-header" class="th-section" componentid="17"><div id="th-17-button_submenu" class="x-btn button_submenu inline_div x-btn-default-small"><div class="th-choice-list-name headerViewModeElementLoc th-choice-list-description-value">**Text I wanted 1**</div><em id="th-17-button_submenu-btnWrap" class=""><button id="th-17-button_submenu-btnEl" type="button" hidefocus="true" role="button" autocomplete="off" title="Menu" class="x-btn-center" aria-label="Menu"><span id="th-17-button_submenu-btnInnerEl" class="x-btn-inner" style="">&nbsp;</span><span id="th-17-button_submenu-btnIconEl" class="x-btn-icon  x-hide-display">&nbsp;</span></button></em></div><div class="th-choice-list-name headerViewModeElementLoc th-choice-list-description-value">**Text I wanted 2**</div><div id="th-templateEditor-section17-header-invalid-message" class="invalidElementMessage">
python html 文件 python-re python-os

评论

0赞 Barmar 8/3/2023
不要使用正则表达式来处理 HTML,请使用像 Beautiful Soup 这样的 HTML 解析器。

答:

0赞 tax evader 8/3/2023 #1

正如@Barmar所建议的那样,我认为您应该使用像 BeautifulSoup 这样的第三方库,使用 find_all() 解析和查找具有给定条件的标签,因为它比使用正则表达式更容易简化解析和搜索

from bs4 import BeautifulSoup

html = '''
<div id="th-templateEditor-section17-header" class="th-section" componentid="17"><div id="th-17-button_submenu" class="x-btn button_submenu inline_div x-btn-default-small"><div class="th-choice-list-name headerViewModeElementLoc th-choice-list-description-value">**Text I wanted 1**</div><em id="th-17-button_submenu-btnWrap" class=""><button id="th-17-button_submenu-btnEl" type="button" hidefocus="true" role="button" autocomplete="off" title="Menu" class="x-btn-center" aria-label="Menu"><span id="th-17-button_submenu-btnInnerEl" class="x-btn-inner" style="">&nbsp;</span><span id="th-17-button_submenu-btnIconEl" class="x-btn-icon  x-hide-display">&nbsp;</span></button></em></div><div class="th-choice-list-name headerViewModeElementLoc th-choice-list-description-value">**Text I wanted 2**</div><div id="th-templateEditor-section17-header-invalid-message" class="invalidElementMessage"></div>
'''

search_classes = 'th-choice-list-name headerViewModeElementLoc th-choice-list-description-value'.split(' ')

parsed_html = BeautifulSoup(html, "html.parser")
divs = parsed_html.find_all('div', {'class': search_classes})

for div in divs:
    print(div.text)