无法使用 bs4 和 re 定位 html 标签

Not able to position the html tag with bs4 and re

提问人:Howard Zhu 提问时间:11/16/2023 更新时间:11/16/2023 访问量:31

问:

我正在尝试使用 BS4 来取消收入发布的公开文件,有一个名为“reconciliation(s)”的关键字,所以我尝试使用 Regex 进行搜索。我发现所有的 reconciliation 关键字都应该在某个 div 标签中,所以我将我的搜索函数设置为:,但不知何故,我发现返回的结果为空的情况,这是其中之一:for text_tag in soup.find_all('div', text=re.compile('(reconciliation)|(reconciliations)', re.IGNORECASE), recursive=True):

         <div style="clear:both;max-width:100%;position:relative;">
          <p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
           <font style="font-size:11pt;">
            PENSKE AUTOMOTIVE GROUP, INC.
           </font>
          </p>
          <p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
           <font style="font-size:11pt;">
            Consolidated Non-GAAP Reconciliations
           </font>
          </p>

它位于带有单词协调的 div 标签下

我什么也没尝试,因为我不知道从哪里开始修复它......

蟒蛇 网页抓取 beautifulsoup python-re

评论


答:

1赞 Dean Van Greunen 11/16/2023 #1

只需执行此操作,提供一个自定义函数,该函数将过滤 div 并仅返回将此值作为文本(小写)的 div

# imports
from bs4 import BeautifulSoup

# function to search in the divs
def contains_reconciliation(tag):
    return 'reconciliation' in tag.text.lower()

# Search results
result_divs = soup.find_all(contains_reconciliation, 'div')

# do something with the results
for div in result_divs:
    print(div)

根据您发布的 html 代码,您要搜索元素而不是fontdiv

# imports
from bs4 import BeautifulSoup

# function to search in the divs
def contains_reconciliation(tag):
    return 'reconciliation' in tag.text.lower()

# Search results
result_fonts = soup.find_all(contains_reconciliation, 'font ')

# do something with the results
for font in result_fonts:
    # you can get the parent div if thats what you are looking for
    div = font.parent().parent()
    print(div)
    print(font)

评论

1赞 Howard Zhu 11/16/2023
是的,但遗憾的是数据非常不一致,其中一些在 p 或 b 或其他标签中,但我发现它们都在 underdiv 标签
2赞 Andrej Kesely 11/16/2023 #2

您可以使用:lambda:

from bs4 import BeautifulSoup

html_text = """\
         <div style="clear:both;max-width:100%;position:relative;">
          <p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
           <font style="font-size:11pt;">
            PENSKE AUTOMOTIVE GROUP, INC.
           </font>
          </p>
          <p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
           <font style="font-size:11pt;">
            Consolidated Non-GAAP Reconciliations
           </font>
          </p>
         </div>"""

soup = BeautifulSoup(html_text, "html.parser")


for text_tag in soup.find_all(
    lambda tag: tag.name == "div" and "reconciliation" in tag.get_text().lower()
):
    print(text_tag)

指纹:

<div style="clear:both;max-width:100%;position:relative;">
<p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
<font style="font-size:11pt;">
            PENSKE AUTOMOTIVE GROUP, INC.
           </font>
</p>
<p style="font-family:'Times New Roman','Times','serif';font-size:10pt;line-height:1.19;text-align:center;margin:0pt;">
<font style="font-size:11pt;">
            Consolidated Non-GAAP Reconciliations
           </font>
</p>
</div>

评论

0赞 Howard Zhu 11/17/2023
非常感谢你,你是否也介意告诉我为什么我的原始代码不起作用?我正在尝试学习图书馆。