BeautifulSoup标识属性的周围字符

时间:2018-12-29 18:37:13

标签: python beautifulsoup

我想知道一个属性是否被''或''包围还是非常简单。 例如:

html = """<input class="form-control" name='searchString' type=text value= "myString"/>"""

对此标签的属性值进行循环将返回不包含周围字符的值,在名称中为“'',类型为不包含周围字符,在值中为“”。 所以有什么办法可以用beautifulsoup做到这一点,还是我自己应该使用正则表达式/解析字符串? 预先感谢。

2 个答案:

答案 0 :(得分:0)

解析器将“更正”您提供给BeautifulSoup的标记。

from bs4 import BeautifulSoup
html = """<input class="form-control" name='searchString' type=text value= "myString"/>"""
print(BeautifulSoup(html,'lxml'))
print(BeautifulSoup(html,'html5lib'))
print(BeautifulSoup(html,'html.parser'))
#<html><body><input class="form-control" name="searchString" type="text" value="myString"/></body></html>
#<html><head></head><body><input class="form-control" name="searchString" type="text" value="myString"/></body></html>
#<input class="form-control" name="searchString" type="text" value="myString"/>

您可以看到所有引号现在都是"。要回答您的问题-我认为BeautiifulSoup不可能。正则表达式是可能的(您必须将其应用于请求响应)。

答案 1 :(得分:0)

html.parser使用以下正则表达式提取元素属性

html = """<input class="form-control" name='searchString' type=text value= "myString"/>"""

attrfind = re.compile(
    r'((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*'
    r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*')
attrs = attrfind.findall(html)

for attr in attrs:
    print('{}: {}'.format(attr[0], attr[2]))

结果

class: "form-control"
name: 'searchString'
type: text
value: "myString"