Python 使用BeautifulSoup分析格式错误的属性
我正在尝试提取包含无效未替换引号的属性:Python 使用BeautifulSoup分析格式错误的属性,python,html,beautifulsoup,Python,Html,Beautifulsoup,我正在尝试提取包含无效未替换引号的属性: <meta content="mal"formed"> 正如预期的那样,结果是mal 有没有一种方法可以让BeautifulSoup将未替换的引号视为属性的一部分,因此结果将是mal“formed?以下是我试图修复的损坏的HTML: -html.parser,html5lib,lxml 印刷品: <html><head><meta content="mal" formed></head>&
<meta content="mal"formed">
正如预期的那样,结果是mal
有没有一种方法可以让BeautifulSoup将未替换的引号视为属性的一部分,因此结果将是
mal“formed
?以下是我试图修复的损坏的HTML:
- -
,html.parser
,html5lib
lxml
-
印刷品:
<html><head><meta content="mal" formed></head></html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta content="mal" formed"="" /></head><body></body></html>
在使用regex进行了一些尝试和错误之后,这是我迄今为止最好的解决方案:
解释:起初,我试图只在所需元素上运行正则表达式。但是,在执行html = re.sub('(content="[^"=]+)"([^"=]+")', r'\1"\2', html) soup = BeautifulSoup(html) soup.find('meta')['content']
时,BeautifulSoup不会返回原始html,而是一个重新格式化的html,它已经不包含属性的str(element)
组成的
(无效)部分 因此,我的解决方案是在整个HTML中搜索这种格式错误的属性,并使用正则表达式进行修复。当然,这是针对我的情况的
一个更好的解决方案(希望不那么粗俗)会很受欢迎。我的解决方案不起作用。我不知道是否有解决方案。标签的
部分会怎么样?两种方法:1。找到格式错误属性的第二部分,并找到一种将其识别为错误属性的方法2。创建您自己的迭代搜索函数以附加到BeautifulSoup,该函数将处理格式错误的属性。请发布您拥有的完整HTML?另外,您事先对源HTML了解多少?例如,meta中是否始终存在双引号问题,并且只有在那里?@alecxe这是完整的HTML,并且属性并不总是格式错误。我可以用正则表达式来解决它,但我想知道是否有一种更健壮的方法使用BeautifulSoup。@Tzach:如果它在任何可能的方面都存在格式错误,那么就没有了。如果它在一种(或几种特定的方式)上存在格式错误,那么请确定—正如您提到的,只需用正则表达式对其进行预处理即可。BeautifulSoup需要一个解析器(默认情况下它附带了一些解析器)。它附带的所有工具都无法解决此问题。你可以自己写,但是正则表达式要容易得多。形成的“
from selenium import webdriver data = """<meta content="mal"formed">""" driver = webdriver.Chrome() # or webdriver.Firefox driver.get("about:blank") driver.execute_script("document.head.innerHTML = '{html}';".format(html=data)) data = driver.page_source driver.close() print data
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta content="mal" formed"="" /></head><body></body></html>
html = re.sub('(content="[^"=]+)"([^"=]+")', r'\1"\2', html) soup = BeautifulSoup(html) soup.find('meta')['content']