python - 使用 Beautifulsoup 的带有空格的类的正则表达式

标签 python beautifulsoup

我发现方法 BeautifulSoup.find() 用空格分割类属性。 在这种情况下,我无法使用正则表达式,如下面的代码所示。 你能帮我找到所有“树 child ”元素的正确方法吗:

import re
from bs4 import BeautifulSoup 

r_html = "<div class='root'>" \
       "<div class='tree children1'>text children 1 </div>" \
       "<div class='tree children2'>text children 2 </div>" \
       "<div class='tree children3'>text children 3 </div>" \
   "</div>"

bs_tab = BeautifulSoup(r_html, "html.parser")
workspace_box_visible = bs_tab.findAll('div', {'class':'tree children1'})
print workspace_box_visible # result: [<div class="tree children1">textchildren 1 </div>]
workspace_box_visible = bs_tab.findAll('div', {'class':re.compile('^tree children\d')})
print workspace_box_visible # result: [] >>>> empty array because 
                                         #class name was splited by whitespace character<<<<

# >>>>>> print all element classes <<<<<<<
def print_class(class_):
    print class_
    return False

workspace_box_visible = bs_tab.find('div', {'class': print_class})

# expected: 
# root
# tree children1
# tree children2
# tree children3

# actual:
# root
# tree
# children1
# tree
# children2
# tree
# children3

提前致谢,

====评论==========

stackoverflow 网站不允许添加超过 500 个字符的评论, 所以我在这里添加了评论:

上面是一个示例,展示了如何在 BeautifulSoup 中寻找所需的类。

但是,如果我有这样的 DOM 结构:

 r_html = "<div class='root'>" \
       "<div class='tree children'>zero</div>" \
       "<div class='tree children first'>first</div>" \
       "<div class='tree children second'>second</div>" \
       "<div class='tree children third'>third</div>" \
   "</div>"

当需要选择具有类属性的控件时:“树子级”和“树子级优先 ', 您(Padraic Cunningham)帖子中描述的所有方法都不起作用。

我找到了使用正则表达式的解决方案:

controls = bs_tab.findAll('div')
for control in controls:
    if re.search("^tree children|^tree children first", " ".join(control.attrs['class']  if control.attrs.has_key('class') else "")):
    print control

另一个解决方案:

bs_tab.findAll('div', class_='tree children') + bs_tab.findAll('div', class_='tree children first')

我知道,这不是一个好的解决方案。我希望 BeautifulSoup 模块有适当的方法。

最佳答案

根据 html 的结构,有几种不同的方法,它们是 css 类,因此您可以使用 class_=.. 或使用 .select:

In [3]: bs_tab.find_all('div', class_="tree")
Out[3]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
 <div class="tree children3">text children 3 </div>]

In [4]: bs_tab.select("div.tree")
Out[4]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
 <div class="tree children3">text children 3 </div>]

但是如果您在其他地方有另一个类,那么也可以找到。

您可以使用选择器来查找类中包含的 div:

In [5]: bs_tab.select("div[class*=children]") 
Out[5]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
 <div class="tree children3">text children 3 </div>]

但是,如果还有其他名称中包含子级的标签类,它们也会被选取。

您可以使用正则表达式更具体一些,并查找子元素后跟一个或多个数字:

In [6]: bs_tab.find_all('div', class_=re.compile("children\d+"))
Out[6]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
 <div class="tree children3">text children 3 </div>]

或者找到所有 div.tree 并查看 tag["class"] 中的姓氏是否 starstwith children.

In [7]: [t for t in bs_tab.select("div.tree") if t["class"][-1].startswith("children")]
Out[7]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
 <div class="tree children3">text children 3 </div>]

或者查找子元素并查看第一个 css 类名是否等于tree

In [8]: [t for t in bs_tab.select("div[class*=children]") if t["class"][0] == "tree"]
Out[8]: 
[<div class="tree children1">text children 1 </div>,
 <div class="tree children2">text children 2 </div>,
<div class="tree children3">text children 3 </div>]

关于python - 使用 Beautifulsoup 的带有空格的类的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824121/

相关文章:

python - BeautifulSoup 每次都有不同的结果

python - 无法从 Amazon.in 产品详细信息页面获取产品价格作为输出

Python爬取表格元素

python - BeautifulSoup错误AttributeError : 'NoneType' object has no attribute 'getText'

python - 如何使用 BeautifulSoup 查找没有 id 或类名的 html 标签?

python - 增加一个值,但不超过另一个值sql

python - Pandas 中的插值水平独立于每行

python - django admin 中的用户组分配跟踪

python - Pylons "global name ' c' 未定义”

python - 防止意外的标准输入读取并锁定子进程