如果我有一个如下所示的html,并且使用漂亮的汤来解析它,则如何访问<head>
元素之前的行。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
例如,访问head元素的标准方法是soup.head
或body是soup.body
。我认为那是因为头和身体都是标准标签。
是否可以访问<head>
之前的元素?
答案 0 :(得分:1)
您可以通过选择head标签并遍历previous_elements:
from bs4 import BeautifulSoup
from w3lib.html import remove_tags
html= '<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>'
soup= BeautifulSoup(html,"html.parser")
x= soup.head
while x.previous_element != None:
if not isinstance(x.previous_element, bs4.element.Tag):
p = x.previous_element.PREFIX + str(x.previous_element) +
x.previous_element.SUFFIX
prev_head = prev_head + p
else:
prev_head = str(x.previous_element) + prev_head
x = x.previous_element
prev_head = remove_tags(prev_head, which_ones= ("head",))
BeautifulSoup(prev_head)
此过程之后,您将<head>
中prev_head
上方的所有代码作为字符串
然后,您可以BeautifulSoup(prev_head)
来获取用于后验的BS对象。
PS:
请注意,我删除了<head>
标签,因为<html>
是它的第一个previous_element
。我还格式化了非标记元素,因为它们的平面str格式不包含其前缀和后缀,从而使它们无法在BS对象中使用。