这是HTML代码:
<div xmlns="" style="box-sizing: border-box; width: 100%; margin: 0 0 10px 0; padding: 5px 10px; background: #fdc431; font-weight: bold; font-size: 14px; line-height: 20px; color: #fff;">42263 - Unencrypted Telnet Server</div>
我正在尝试使用Beautiful Soup打印42263 - Unencrypted Telnet Server
,但输出是空元素,即[]
这是我的Python代码:
from bs4 import BeautifulSoup
import csv
import urllib.request as urllib2
with open(r"C:\Users\sourabhk076\Documents\CBS_1.html") as fp:
soup = BeautifulSoup(fp.read(), 'html.parser')
divs = soup.find_all('div', attrs={'background':'#fdc431'})
print(divs)
答案 0 :(得分:2)
regexes的解决方案:
from bs4 import BeautifulSoup
import re
with open(r"C:\Users\sourabhk076\Documents\CBS_1.html") as fp:
soup = BeautifulSoup(fp.read(), 'html.parser')
让我们找到与以下正则表达式匹配的div:background:\s*#fdc431;
。 \s
匹配单个Unicode空白字符。我假设可能有0个或更多的空格,所以我添加了*
修饰符以匹配前面RE的0或更多次重复。您可以阅读有关正则表达式here的更多信息,因为它们有时会派上用场。我还建议您online regex tester。
div = soup.find('div', attrs={'style': re.compile(r'background:\s*#fdc431;')})
但这相当于:
div = soup.find('div', style=re.compile(r'background:\s*#fdc431;'))
您可以在BeautifulSoup
的官方文档中阅读相关内容值得一读的还有关于find
和True
以及其他类似方法的kinds of filters部分。
您可以提供字符串,正则表达式,列表,>>> div.text
'42263 - Unencrypted Telnet Server'
或函数,如Keyur Potdar所示。
假设div存在,我们可以通过以下方式获取其文本:
Price | Rate p/lot | Total Comm|
947.2 1.25 CAD 1.25
129.3 2.1 CAD 1.25
161.69 0.8 CAD 2.00
答案 1 :(得分:2)
background
不是div
标记的属性。 div
标记的属性为:
{'xmlns': '', 'style': 'box-sizing: border-box; width: 100%; margin: 0 0 10px 0; padding: 5px 10px; background: #fdc431; font-weight: bold; font-size: 14px; line-height: 20px; color: #fff;'}
所以,你要么必须使用
soup.find_all('div', attrs={'style': 'box-sizing: border-box; width: 100%; margin: 0 0 10px 0; padding: 5px 10px; background: #fdc431; font-weight: bold; font-size: 14px; line-height: 20px; color: #fff;'}
或者,您可以使用lambda
函数检查background: #fdc431
属性值中是否style
,如下所示:
soup = BeautifulSoup('<div xmlns="" style="box-sizing: border-box; width: 100%; margin: 0 0 10px 0; padding: 5px 10px; background: #fdc431; font-weight: bold; font-size: 14px; line-height: 20px; color: #fff;">42263 - Unencrypted Telnet Server</div>', 'html.parser')
print(soup.find(lambda t: t.name == 'div' and 'background: #fdc431' in t['style']).text)
# 42263 - Unencrypted Telnet Server
或者,您可以使用RegEx,如Jatimir in his answer所示。