美丽的汤什么也没有

时间:2018-04-05 10:01:22

标签: python html beautifulsoup

这是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)

2 个答案:

答案 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

的官方文档中阅读相关内容

值得一读的还有关于findTrue以及其他类似方法的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所示。