如何按类查找元素

Neo*_*Neo 344 html python beautifulsoup web-scraping

我使用Beautifulsoup解析带有"class"属性的html元素时遇到问题.代码看起来像这样

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"] == "stylelistrow"):
        print div
Run Code Online (Sandbox Code Playgroud)

我在脚本完成后"同一行"收到错误.

File "./beautifulcoding.py", line 130, in getlanguage
  if (div["class"] == "stylelistrow"):
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup.py", line 599, in __getitem__
   return self._getAttrMap()[key]
KeyError: 'class'
Run Code Online (Sandbox Code Playgroud)

我该怎么摆脱或这个错误?

Kla*_*sen 565

您可以优化搜索,只使用BS3查找具有给定类的div:

mydivs = soup.findAll("div", {"class": "stylelistrow"})
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于完全匹配.`<.. class ="stylelistrow">`匹配但不是`<.. class ="stylelistrow button">`. (38认同)
  • 从beautifulsoup4开始,findAll现在是find_all (20认同)
  • @pyCthon查看@jmunsch的答案,BS现在支持`class_`,它可以正常工作. (4认同)
  • 如果您有多个类,_class 将仅匹配确切的类字符串。在这种情况下,您可以使用: `soup.select("p.stylelistrow.another")` 它将匹配 `&lt;p class="stylelistrow another YetAnother"&gt;` 例如 (4认同)
  • 谢谢你。它不仅适用于@class,也适用于任何事物。 (3认同)
  • @Wernight 目前使用 BS4 (4.7.1) 和 `soup.find_all("div", {"class": "stylelistrow"})` 适用于精确的 `&lt;.. class="stylelistrow"&gt;` 并包含 `&lt; .. class="stylelistrow button"&gt;` 匹配。 (2认同)

jmu*_*sch 235

从文档:

从Beautiful Soup 4.1.2开始,您可以使用关键字参数通过CSS类进行搜索 class_:

soup.find_all("a", class_="sister")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将是:

soup.find_all("div", class_="stylelistrow")
Run Code Online (Sandbox Code Playgroud)

它也适用于:

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用列表:`soup.find_all("a",["stylelistrowone","stylelistrow"])`如果没有很多类,它会更安全. (4认同)
  • 这应该是公认的答案,它比其他选择更正确和简洁. (4认同)
  • 补充@NunoAndré 对 BeautifulSoup 3 的回答:`soup.findAll("a", {'class':['stylelistrowone', 'stylelistrow']})`。 (3认同)
  • 需要注意的一件事是,当您给出 `class_="class_1 class2"` 时,它会匹配“精确字符串”,因此即使是 `“class_2 class_1”` 也不会匹配。要搜索多个类(全部必需),您应该使用选择器`soup.select('div.class_1.class_2')`,它匹配`"class_1 class_2"`和`"class_2 class_1"`。 (2认同)

ove*_*ord 45

更新:2016在最新版本的beautifulsoup中,方法'findAll'已重命名为'find_all'.链接到官方文档

方法名称列表已更改

因此,答案将是

soup.find_all("html_element", class_="your_class_name")
Run Code Online (Sandbox Code Playgroud)


Jos*_*ush 17

如果您想在不声明 HTML 标记的情况下class_=查找元素,请使用。

对于单个元素:

soup.find(class_='my-class-name')
Run Code Online (Sandbox Code Playgroud)

对于多个元素:

soup.find_all(class_='my-class-name')
Run Code Online (Sandbox Code Playgroud)


小智 15

一个直接的方式是:

soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
    print each_div
Run Code Online (Sandbox Code Playgroud)

确保你使用findAll的外壳,它不是findall

  • 这仅适用于完全匹配.`<.. class ="stylelistrow">`匹配但不是`<.. class ="stylelistrow button">`. (4认同)

Fli*_*McF 15

具体到BeautifulSoup 3:

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )
Run Code Online (Sandbox Code Playgroud)

将找到所有这些:

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">
Run Code Online (Sandbox Code Playgroud)

  • `lambda x:'stylelistrow'在x.split()中简单而美观 (2认同)

小智 10

从 BeautifulSoup 4+ 开始,

如果您只有一个类名,则可以将类名作为参数传递,例如:

mydivs = soup.find_all('div', 'class_name')
Run Code Online (Sandbox Code Playgroud)

或者,如果您有多个类名,只需将类名列表作为参数传递,例如:

mydivs = soup.find_all('div', ['class1', 'class2'])
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 9

如何按类查找元素

我使用Beautifulsoup解析带有"class"属性的html元素时遇到问题.

你可以很容易地找到一个班级,但如果你想通过两个班级的交集来找到它,那就更难了,

文档(重点添加):

如果要搜索与两个或更多 CSS类匹配的标记,则应使用CSS选择器:

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]
Run Code Online (Sandbox Code Playgroud)

要清楚,这只选择了三角形和三角形的标签.

要查找一组类中的任何一个的交集(不是交集,而是联合),您可以为class_关键字参数提供一个列表(从4.1.2开始):

soup = BeautifulSoup(sdata)
class_list = ["stylelistrow"] # can add any other classes to this list.
# will find any divs with any names in class_list:
mydivs = soup.find_all('div', class_=class_list) 
Run Code Online (Sandbox Code Playgroud)

另请注意,findAll已从camelCase重命名为更多Pythonic find_all.


QHa*_*arr 6

CSS选择器

单班第一场比赛

soup.select_one('.stylelistrow')
Run Code Online (Sandbox Code Playgroud)

比赛清单

soup.select('.stylelistrow')
Run Code Online (Sandbox Code Playgroud)

复合类(即AND另一类)

soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')
Run Code Online (Sandbox Code Playgroud)

复合类名称中的空格例如class = stylelistrow otherclassname用“。”代替。您可以继续添加类。

类列表(或-匹配存在的任何一个

soup.select_one('.stylelistrow, .otherclassname')
soup.select('.stylelistrow, .otherclassname')
Run Code Online (Sandbox Code Playgroud)

bs4 4.7.1 +

innerText包含字符串的特定类

soup.select_one('.stylelistrow:contains("some string")')
soup.select('.stylelistrow:contains("some string")')
Run Code Online (Sandbox Code Playgroud)

具有特定子元素(例如a标签)的特定类

soup.select_one('.stylelistrow:has(a)')
soup.select('.stylelistrow:has(a)')
Run Code Online (Sandbox Code Playgroud)