Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用BeautifulSoup分析格式错误的属性_Python_Html_Beautifulsoup - Fatal编程技术网

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&quot;\2', html)
    soup = BeautifulSoup(html)    
    soup.find('meta')['content']
    
    解释:起初,我试图只在所需元素上运行正则表达式。但是,在执行
    str(element)
    时,BeautifulSoup不会返回原始html,而是一个重新格式化的html,它已经不包含属性的
    组成的
    (无效)部分

    因此,我的解决方案是在整个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&quot;\2', html)
    soup = BeautifulSoup(html)    
    soup.find('meta')['content']