使用Beautiful Soup搜索属性的片段

时间:2015-09-27 02:44:02

标签: python html beautifulsoup html-parsing

我想使用Beautiful Soup来提取以下格式的任何内容:

div class="dog-a b-cat"

如果通过执行以下操作知道“a”和“b”是什么,我可以得到一个特定的实例(假设a=aardvarkb=boy):

soup.find_all("div",class_="dog-aardvark boy-cat")

有什么方法可以用狗和猫以及两个破折号拉出所有实例(不管破折号之间的两个单词)?

2 个答案:

答案 0 :(得分:2)

@bourbaki4481472一般都在正确的轨道上,但由于多种原因,建议的解决方案无法正常工作,首先是指定的正则表达式将一次与单个类匹配,因为class是一个特殊的multi-valued attribute,结尾只是语法错误

我建议您制作一个filtering function来检查第一个类值是以dog-开头,第二个以-cat结尾。您可以通过另外检查标签名称或在需要时存在多少类值来改进它:

def class_filter(elm):
    try:
        classes = elm["class"]
        return classes[0].startswith("dog-") and classes[1].endswith("-cat")
    except (KeyError, IndexError, TypeError):
        return False

完整示例:

from bs4 import BeautifulSoup

data = """
<div class="dog-test test-cat">test1</div>
<div class="dog-test">test2</div>
<div class="test-cat">test3</div>
<div class="dog">test4</div>
<div class="cat">test5</div>
<div class="irrelevant">test6</div>
"""

soup = BeautifulSoup(data)

def class_filter(elm):
    try:
        classes = elm["class"]
        return classes[0].startswith("dog-") and classes[1].endswith("-cat")
    except (KeyError, IndexError, TypeError):
        return False

for elm in soup.find_all(class_filter):
    print(elm.text)

仅打印test1

答案 1 :(得分:0)

尝试使用regular expressions来概括您的参数。

import re
soup.find_all("div", class= re.compile(r"dog-.+ boy-.+")

以上内容会查找字符串dog-后跟一个或多个字符,后跟[空格],然后是boy-后跟一个或多个字符。