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)
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)
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
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)
小智 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)
如何按类查找元素
我使用Beautifulsoup解析带有"class"属性的html元素时遇到问题.
你可以很容易地找到一个班级,但如果你想通过两个班级的交集来找到它,那就更难了,
从文档(重点添加):
如果要搜索与两个或更多 CSS类匹配的标记,则应使用CSS选择器:
Run Code Online (Sandbox Code Playgroud)css_soup.select("p.strikeout.body") # [<p class="body strikeout"></p>]
要清楚,这只选择了三角形和三角形的标签.
要查找一组类中的任何一个的交集(不是交集,而是联合),您可以为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.
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)
| 归档时间: |
|
| 查看次数: |
407632 次 |
| 最近记录: |