Python 如何按类查找元素

Python 如何按类查找元素,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我在使用Beautifulsoup解析带有“class”属性的HTML元素时遇到问题。代码如下所示 soup = BeautifulSoup(sdata) mydivs = soup.findAll('div') for div in mydivs: if (div["class"] == "stylelistrow"): print div 脚本完成后,我在同一行上得到一个错误 File "./beautifulcoding.py", line 130, in ge

我在使用Beautifulsoup解析带有“class”属性的HTML元素时遇到问题。代码如下所示

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div["class"] == "stylelistrow"):
        print div
脚本完成后,我在同一行上得到一个错误

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'

如何消除此错误?

首先尝试检查div是否具有class属性,如下所示:

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

首先尝试检查div是否具有class属性,如下所示:

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

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

mydivs=soup.find_all(“div”,“class”:“stylelistrow”})

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

mydivs=soup.find_all(“div”,“class”:“stylelistrow”})

直截了当的方法是:

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

确保取下findAll的外壳,它不是findAll

一个简单的方法是:

soup = BeautifulSoup(sdata)
for each_div in soup.findAll('div',{'class':'stylelist'}):
    print each_div
确保您取下findAll的外壳,它不是findAll

这对我有用:

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div
这对我很有用:

for div in mydivs:
    try:
        clazz = div["class"]
    except KeyError:
        clazz = ""
    if (clazz == "stylelistrow"):
        print div

从文件中:

soup.find_all("a", class_="sister")
在这种情况下:

soup.find_all("div", class_="stylelistrow")
它还将用于:

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")

从文件中:

soup.find_all("a", class_="sister")
在这种情况下:

soup.find_all("div", class_="stylelistrow")
它还将用于:

soup.find_all("div", class_="stylelistrowone stylelistrowtwo")

这对我访问class属性很有效(在Beautifulsoup4上,与文档中所说的相反)。KeyError是返回的列表,而不是字典

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']

这对我访问class属性很有效(在Beautifulsoup4上,与文档中所说的相反)。KeyError是返回的列表,而不是字典

for hit in soup.findAll(name='span'):
    print hit.contents[1]['class']

特定于BeautifulSoup 3:

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )
将发现所有这些:

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">

特定于BeautifulSoup 3:

soup.findAll('div',
             {'class': lambda x: x 
                       and 'stylelistrow' in x.split()
             }
            )
将发现所有这些:

<div class="stylelistrow">
<div class="stylelistrow button">
<div class="button stylelistrow">

更新:2016年 在最新版本的beautifulsoup中,方法“findAll”已重命名为 “找到所有人”

因此答案是

soup.find_all("html_element", class_="your_class_name")
更新:2016年 在最新版本的beautifulsoup中,方法“findAll”已重命名为 “找到所有人”

因此答案是

soup.find_all("html_element", class_="your_class_name")
如何按类查找元素 我在使用Beautifulsoup解析带有“class”属性的html元素时遇到问题

你可以通过一个类很容易地找到,但是如果你想通过两个类的交集来找到,那就有点困难了

从(增加强调)开始:

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

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]
还请注意,findAll已从camelCase重命名为更具Pythonic风格的
find_all

如何按类查找元素 我在使用Beautifulsoup解析带有“class”属性的html元素时遇到问题

你可以通过一个类很容易地找到,但是如果你想通过两个类的交集来找到,那就有点困难了

从(增加强调)开始:

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

css_soup.select("p.strikeout.body")
# [<p class="body strikeout"></p>]
还请注意,findAll已从camelCase重命名为更具Pythonic风格的find_all

这应该可以:

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div.find(class_ == "stylelistrow"):
        print div
这应该起作用:

soup = BeautifulSoup(sdata)
mydivs = soup.findAll('div')
for div in mydivs: 
    if (div.find(class_ == "stylelistrow"):
        print div
CSS选择器

单班第一场比赛

soup.select_one('.stylelistrow')
匹配项列表

soup.select('.stylelistrow')
soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')
复合类(即和另一类)

复合类名中的空格,例如
class=stylelistrow otherclassname
将替换为“.”。您可以继续添加类

课程列表(或-匹配当前的课程)


bs4.7.1+

innerText
包含字符串的特定类

soup.select_one('.stylelistrow:contains("some string")')
soup.select('.stylelistrow:contains("some string")')
注意

新增:为了避免与未来CSS规范冲突 更改后,非标准伪类现在将以:-soup开始- 前缀因此,:contains()现在将被称为 :-soup-contains(),尽管有一段时间它是不推荐的 :contains()仍将被允许,并警告用户应 迁移到:-soup-contains()

新建:添加了新的非标准伪类:-soup-contains-own() 操作类似于:-soup-contains(),只是它只查看 与当前作用域元素直接关联的文本节点,以及 不是它的后代

具有特定子元素的特定类,例如
a
标记

soup.select_one('.stylelistrow:has(a)')
soup.select('.stylelistrow:has(a)')
CSS选择器

单班第一场比赛

soup.select_one('.stylelistrow')
匹配项列表

soup.select('.stylelistrow')
soup.select_one('.stylelistrow.otherclassname')
soup.select('.stylelistrow.otherclassname')
复合类(即和另一类)

复合类名中的空格,例如
class=stylelistrow otherclassname
将替换为“.”。您可以继续添加类

课程列表(或-匹配当前的课程)


bs4.7.1+

innerText
包含字符串的特定类

soup.select_one('.stylelistrow:contains("some string")')
soup.select('.stylelistrow:contains("some string")')
注意

新增:为了避免与未来CSS规范冲突 更改后,非标准伪类现在将以:-soup开始- 前缀因此,:contains()现在将被称为 :-soup-contains(),尽管有一段时间它是不推荐的 :contains()仍将被允许,并警告用户应 迁移到:-soup-contains()

新建:添加了新的非标准伪类:-soup-contains-own() 操作类似于:-soup-contains(),只是它只查看 与当前作用域元素直接关联的文本节点,以及 不是它的后代

具有特定子元素的特定类,例如
a
标记

soup.select_one('.stylelistrow:has(a)')
soup.select('.stylelistrow:has(a)')

自美联4+起

如果只有一个类名,则只需将类名作为参数传递,如下所示:

mydivs = soup.find_all('div', 'class_name')
mydivs = soup.find_all('div', ['class1', 'class2'])
或者,如果您有多个类名,只需将类名列表作为参数传递,如下所示:

mydivs = soup.find_all('div', 'class_name')
mydivs = soup.find_all('div', ['class1', 'class2'])

自美联4+起

如果只有一个类名,则只需将类名作为参数传递,如下所示:

mydivs = soup.find_all('div', 'class_name')
mydivs = soup.find_all('div', ['class1', 'class2'])
或者,如果您有多个类名,只需传递