【问题标题】:Python filename, not markup. open this file and pass the filehandle into Beautiful SoupPython 文件名,而不是标记。打开这个文件并将文件句柄传递给 Beautiful Soup
【发布时间】:2016-09-13 13:43:36
【问题描述】:

我已将 Python 2.7 例程更改为接受文件路径作为例程的参数,因此我不必通过在方法中插入多个文件路径来复制代码。

当我的方法被调用时,我得到以下错误:

looks like a filename, not markup. You should probably open this file and pass the filehandle into Beautiful Soup.
  '"%s" looks like a filename, not markup. You should probably open this file and pass the filehandle into Beautiful Soup.' % markup)

我的方法实现是:

def extract_data_from_report3(filename):
    html_report_part1 = open(filename,'r').read()
    soup = BeautifulSoup(filename, "html.parser")
    th = soup.find_all('th')
    td = soup.find_all('td')

    headers = [header.get_text(strip=True) for header in soup.find_all("th")]
    rows = [dict(zip(headers, [td.get_text(strip=True) for td in row.find_all("td")]))
        for row in soup.find_all("tr")[1:-1]]
    print(rows)
    return rows

调用方法如下:

rows_part1 =  report.extract_data_from_report3(r"E:\test_runners\selenium_regression_test_5_1_1\TestReport\SeleniumTestReport_part1.html")
print "part1 = "
print rows_part1

如何将文件名作为参数传递?

【问题讨论】:

    标签: python-2.7 beautifulsoup


    【解决方案1】:

    您应该将已阅读文件的实际内容传递给BeautifulSoup

    html_report_part1 = open(filename,'r').read()
    soup = BeautifulSoup(html_report_part1, "html.parser")
    

    【讨论】:

      【解决方案2】:

      如果你想传递一个文件句柄,那么不要调用 read,只需传递 open(filename) 或文件句柄而不调用 read :

      def extract_data_from_report3(filename):
          html_report_part1 = open(filename,'r')
          soup = BeautifulSoup( html_report_part1, "html.parser")
      

      或者:

      def extract_data_from_report3(filename):
          soup = BeautifulSoup(open(filename), "html.parser")
      

      您可以按照建议调用 read 后传递html_report_part1,但您不需要,BeautifulSoup 可以获取文件对象。

      【讨论】:

      • BeautifulSoup 是处理文件还是应该在 with 块内?
      • @Mephy,一旦你离开函数,文件几乎肯定会被关闭,如果没有对文件对象的引用,它将在读取后关闭,你可以在这个stackoverflow.com/questions/37220460/… 中看到它。使用 with 块并没有什么坏处,但并不是真正需要的。
      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多